Corporate Venturing Research Toolkit

AI-powered analysis of corporate venturing practices from 10-K filings using the Anthropic Claude API

6 Companies 15 Dimensions Windowed Extraction Ensemble Scoring (median + uncertainty) Claude Sonnet 4.5 (pinned 20250929) Python / conda cv_env

Project Purpose

Input

Raw EDGAR 10-K filings (SGML / HTML) for S&P 500 companies

Analysis

RAG extraction + Claude API scoring across 15 venturing dimensions

Outputs

Master CSV, per-company dashboards & reports, portfolio HTML dashboard

Research Goal

Understand which venturing practices companies use and what corporate objectives they serve

Analysis Pipeline

Preprocess

Use the complete extracted narrative — all of Items 1/1A/2/7/8 including financial statements & footnotes. Already-clean narratives are used as-is (no lossy re-preprocessing). Fetch XBRL structured financials.

Entity Discovery

Curated CVC fund names from company_context.json + BM25/cosine index lookup + Claude refinement. The RAG index is used only for entity discovery — not for the scored evidence.

Windowed Extraction

Tile the entire narrative into overlapping 60K-char windows (6K overlap) and scan every window for all 15 dimensions. Nothing is truncated; evidence merged + deduped across windows. Comprehensive LLM extraction (not cosine matching).

Ensemble Scoring

5 independent scoring passes on the same evidence (temperature=0). Report the per-dimension median with min/max/std uncertainty. Distinct cache slots → fresh samples, reproducible reruns.

Financials + XBRL

Claude extracts revenue, R&D, margins, CVC totals; authoritative XBRL values overlay all standard GAAP metrics.

Caching

Server-side prompt caching on the shared prompt prefix (esp. the ensemble passes) + on-disk response cache for exact reproducibility. Pinned model snapshot claude-sonnet-4-5-20250929.

Dimension Framework (15 Dimensions)

4 Programs
  • P1 Corporate Venture Capital
  • P2 Accelerators & Incubators
  • P3 Venture Building
  • P4 Venture Clienting
4 Activities
  • A1 Mentorship
  • A2 Business Services
  • A3 Workspace
  • A4 Events
7 Objectives
  • O1 Risk Management
  • O2 Market Expansion
  • O3 Access to New Technology
  • O4 Develop Business Ecosystems
  • O5 Social & Environmental Impact
  • O6 Entrepreneurial Culture & Capabilities
  • O7 Financial Return

Scores are 0–100 per dimension. Max total = 1500. A Practice × Objective alignment matrix (15×7) is also produced for each company showing which practices serve which objectives.

Current Results (6 Companies) — canonical: windowed + ensemble + curated web (2026-06-05)

Final canonical run. Full-document windowed extraction + 5-pass ensemble scoring (temperature=0, pinned model claude-sonnet-4-5-20250929) with curated-web evidence merged for all six (--with-scraped). Total = median of 5 per-pass totals; the bracketed range is the observed min–max across passes (also the error bars on each company's dashboard_uncertainty.png). Every company additionally carries an investment_and_funds field (fund sizes + investment preferences). Portfolio average: 1024 / 1500.
Ticker Company Total (median) Range % of 1500 Tier Top Practice Top Objective
AMZN Amazon.com Inc.
1172
1136–1225 78% Tier 1 Corporate Venture Capital (92) Develop Business Ecosystems (95)
GOOGL Alphabet Inc.
1153
1089–1175 77% Tier 1 Venture Building (95) Access to New Technology (96)
MSFT Microsoft Corporation
1064
1003–1076 71% Tier 1 Venture Building (85) Access to New Technology (92)
CSCO Cisco Systems Inc.
974
933–990 65% Tier 1 Accelerators and Incubators (82) Access to New Technology (88)
QCOM Qualcomm Inc.
946
835–972 63% Tier 1 Corporate Venture Capital (92) Market Expansion (88)
MRK Merck & Co. Inc.
837
815–842 56% Tier 1 Corporate Venture Capital (85) Access to New Technology (82)

Key cross-portfolio findings (curated-web augmented): all six are now Tier 1 once curated CVC/accelerator/impact evidence is merged. Access to New Technology is the dominant objective for 4 of 6; Corporate Venture Capital is the most common top practice, while the two largest tech players (GOOGL, MSFT) are led by Venture Building and Cisco by Accelerators & Incubators. Sample fund detail captured in investment_and_funds: Qualcomm Ventures $2B+ AUM / $3B+ deployed, Amazon Climate Pledge Fund $2B + Industrial Innovation Fund $1B, Merck MRL Ventures $500M, Cisco $1B Global AI Fund, Microsoft Climate Innovation Fund $1B.

Module Architecture

FileRole
cv_config.pySingle source of truth — all dimension lists, colors, thresholds, file paths, model names
cv_toolkit.pyCLI entry point — all subcommands (rubrics, describe, preprocess, analyze, csv, charts, report, portfolio-report)
cv_analyzer.pyCore pipeline — SGML extraction, financial window selection, 15 extraction calls, scoring call, checkpoint/resume
cv_rag.pyBM25 + embedding hybrid index; investment entity discovery; enriched CVC query building
cv_framework.pyBuilds rubrics from framework/*.txt definitions; adds brief_descriptions via Haiku
cv_visualizer.pyPer-company PNGs: P×O heatmap, dashboard (bars + matrix + financials), word clouds
cv_portfolio.pyPortfolio heatmap, mean scores, What Works analysis, interactive HTML dashboard, portfolio.docx
cv_report.pyPer-company .docx report; build_summary_row() for CSV flattening
company_context.jsonCurated CVC fund names, portfolio companies, dimension hints per ticker — injected into prompts

Key Problems Solved

Narrative duplicated ~2× (preprocess)
Step 2 sliced every narrative item all the way to Item 8, emitting Items 1A/2/7 multiple times (GOOGL: 253K → 514K). Fixed to slice each item to the next boundary; already-clean narratives are now used as-is.
Item 8 footnotes never scanned
Old Call 1 capped at 70K chars and loaded Item 1 + 7 first, so Item 1A (84K) and Item 8 (96K, incl. equity-securities footnotes) were never read for most dimensions. Replaced with overlapping-window scan of the entire document.
temperature=0 ≠ reproducible
API is greedy but not bit-deterministic. Windowed extraction cut per-dim drift ~20.7 → 8.5 pts; ensemble scoring reports medians with error bars; model pinned to 20250929; response cache gives exact reruns.
Non-deterministic key_terms ordering
Scoring used list(set(...)) (hash-order varies per run). Switched to dict.fromkeys for stable, reproducible ordering.
API cost & secrets
Word clouds OFF by default (omit word_cloud_text from scoring); prompt caching on the shared prefix; ANTHROPIC_API_KEY loaded from git-ignored .env.
OOM / zsh: killed (SGML parsing)
DOTALL regex on 500K single-line SGML caused catastrophic backtracking. Fixed with plain .find() string search and capped tag-stripping regex <[^>]{1,300}>.
Activities always scoring 0
ACTIVITIES not imported; missing from all_dims list; retrieve_evidence() only searched practices/objectives; scoring aggregation not initialised. All four bugs fixed.
Claude hallucinating dimension names
Scoring prompt said "all 8 practices" — Claude invented "Corporate Innovation Labs", "Strategic M&A". Fixed with explicit 15-dimension list template in _scoring_prompt().
MSFT/CSCO financials all null
Revenue at position 147K but code only sampled first 40K chars. Fixed with _best_financial_window() scanning overlapping 50K windows and picking highest number density.
GV / M12 / M Ventures not found
Named funds not in EDGAR files (10-K text truncated at download). Fixed with company_context.json curated fund names injected directly into Claude extraction prompts.
company_context.json Stage 0 wiped
Stage 1b code had named_funds = set() re-initialising the set after Stage 0 populated it. Removed the re-initialisation line.
"GV" filtered as noise
Noise filter used len(f) > 2, excluding 2-character names. Fixed to len(f) >= 2.
HTML dashboard not loading
Template used `+data_json+` (literal string not interpolation). Fixed to {data_json} inside Python f-string.
P×O heatmap title hidden
fig.suptitle at y=0.99 overlapped top axis. Moved to y=1.00 and shifted subtitle to ax_top.set_title().
Dark theme visuals
All dark-background constants replaced. Light theme: BG=#f0f4f8, PANEL=#ffffff, ACCENT=#1d4ed8 across cv_visualizer.py and cv_portfolio.py.
150K character cap on narrative
Removed cap entirely — RAG handles full text efficiently (GOOGL: 150K → 550K chars). More text = better retrieval with same API call count.
AMZN low scores (non-standard language)
Amazon's 10-K uses AWS/product language not standard venturing terms. Added dimension_hints to company_context.json to guide Claude interpretation. Needs re-run.

Output Files

Master CSV
outputs/master_dataframe.csv
One row per company, 139 columns — all dimension scores, ranks, descriptions, financials
HTML Dashboard
outputs/portfolio_dashboard.html
Self-contained (zero CDN), instant-loading interactive portfolio view
Portfolio Report
outputs/portfolio_report.docx
11-section .docx with heatmaps, company snapshots, What Works, financial benchmarks
Portfolio Charts
outputs/portfolio_charts/
Score heatmap, mean scores, tier distribution, P×O alignment matrix PNGs
Per-Company Analysis
outputs/<TICKER>/analysis.json
Full structured analysis including investment_entities, scores, quotes, P×O matrix
Per-Company Report
outputs/<TICKER>/<TICKER>_report.docx
Individual company .docx with all dimension scores, evidence, financials, charts
Per-Company Dashboard
outputs/<TICKER>/<TICKER>_dashboard.png
3-panel bars (Practices/Activities/Objectives) + P×O matrix + financial snapshot
Rubrics
outputs/rubrics.json
Scoring bands, key indicators, brief_descriptions for all 15 dimensions

Next Steps

  1. v2 batch (windowed + ensemble) running for all 6 companies — full-document scan + 5-pass ensemble scoring:
    conda activate cv_env
    bash run_batch_v2.sh --force
    Produces median scores with uncertainty, plain + uncertainty dashboards, and ensemble_scores.* per company.
  2. Reduce residual variance — the ensemble shows scoring is stable (practices ≈0 std); the dominant remaining run-to-run variance is extraction. Optionally ensemble/union the extraction windows too.
  3. Tune cost vs recallEXTRACT_WINDOW_CHARS / ENSEMBLE_SCORING_N in cv_config.py (or --ensemble N). Large filings (CSCO 780K → ~15 windows) dominate cost.
  4. Scale to more companies — add entry to company_context.json, a row to companies.csv, and the ticker to run_batch_v2.sh, then re-run.

Quick Command Reference

CommandWhat it does
python cv_toolkit.py rubricsBuild scoring rubrics from framework/*.txt definitions (run once)
python cv_toolkit.py describeAdd plain-English brief_descriptions to each rubric via Haiku (run once)
python cv_toolkit.py preprocess --ticker X --file YExtract narrative + financials from raw EDGAR SGML
python cv_toolkit.py analyze --ticker X --file YWindowed extraction + ensemble scoring for one company
python cv_toolkit.py --ensemble N analyze ...Override ensemble passes (N=1 disables; default 5)
python cv_toolkit.py --word-clouds analyze ...Re-enable word clouds (OFF by default to save API)
bash run_batch_v2.sh --forceFull v2 batch (windowed + ensemble) for all companies
python ensemble_report.py outputs_v2/<T>Build ensemble table (CSV/MD) + error-bar figure
python cv_toolkit.py scrape --ticker XScrape curated CVC/Accelerator/Impact URLs → scraped/<X>/result.json (optional)
python cv_toolkit.py analyze ... --with-scrapedMerge curated-web evidence (all 15 dims) into the 10-K evidence before scoring (off by default)
python cv_toolkit.py csvRebuild master_dataframe.csv from all analysis.json files
python cv_toolkit.py chartsRegenerate per-company PNGs (plain + uncertainty dashboards)
python cv_toolkit.py reportGenerate .docx reports for all companies
python cv_toolkit.py portfolio-reportHeatmaps + HTML dashboard + portfolio.docx