尚未收集仓库信息。
尚未检测到更新。GitHub 发布版本后会显示在这里。
Multi-agent orchestration system for generating investment memos using LangGraph
翻译准备中
取自仓库 README
正在加载完整 README。
查看完整 README ↗Multi-agent orchestration system for generating high-quality investment memos using LangGraph and specialized AI agents.
Status: Production-Ready with Section-by-Section Processing ✅
Supported by Hypernova Capital, Avalanche VC, and Emerge Capital
Many people may not want to manage using an Open Source library and deal with the command line. These are services we have found that can provide similar Investment Memo Generation.
memopop) (v0.5.2)A guided terminal application that replaces the need to know 15+ CLI commands. Single entry point with auto-discovery of firms, deals, and versions:
# Activate your venv, then:
memopop
╭─────────────────────────────────────────────────────────╮
│ │
│ Investment Memo Orchestrator │
│ v0.5.2 · 33 agents · Powered by Claude + Perplexity │
│ │
╰─────────────────────────────────────────────────────────╯
? What would you like to do?
❯ 📝 Generate a new investment memo
📄 Generate a one-pager summary
📤 Export an existing memo (HTML / PDF / Word)
🔧 Improve a specific section
🔄 Integrate content from versions
📊 Run a specific agent
Capabilities:
Built with Rich + questionary. No flags, no file paths required.
See v0.5.2 release notes for full details.
Multi-tenant architecture enabling private firm-specific configurations, deal data, and branded exports. Each firm can maintain isolated data while sharing the core codebase.
New Directory Structure:
io/
└── {firm}/ # e.g., "hypernova", "emerge"
├── configs/
│ └── brand-{firm}-config.yaml # Firm-specific brand styling
├── templates/
│ ├── outlines/ # Firm-specific content outlines
│ └── scorecards/ # Firm-specific evaluation scorecards
└── deals/
└── {deal}/ # e.g., "Blinka", "CoachCube"
├── {deal}.json # Deal configuration
├── inputs/ # Pitch decks, datarooms
├── outputs/ # Versioned memo artifacts
└── exports/ # Branded HTML/PDF exports
├── dark/
└── light/
Key Features:
io/ (gitignored or private git submodule)output/, data/, templates/ paths still workio/{firm}/deals/{deal}/ pathsresume_from_interruption.py CLI to continue interrupted generationUsage:
# Generate memo with firm context
python -m src.main "Blinka" --firm hypernova
# Export with firm-scoped paths
python cli/export_branded.py --firm hypernova --deal Blinka --mode dark --pdf
# Resume interrupted generation
python cli/resume_from_interruption.py --firm emerge --deal CoachCube
See io/README.md for complete firm-scoped IO documentation.
New multi-agent dataroom analyzer for processing investment datarooms containing diverse document types (pitch decks, financials, battlecards, etc.). The system scans, classifies, and extracts structured data from dataroom documents.
Phase 1 - Document Scanning & Classification ✅
Phase 2 - Specialized Extractors (5/5 Complete) ✅
Phase 2.1 - Cap Table Extractor Enhancement (2025-03-09)
Phase 3 - Data Synthesis ✅
Output Structure:
output/Company-v0.0.1/
├── 0-dataroom-inventory.json/md # Document inventory
├── 1-competitive-analysis.json/md # Competitive landscape
├── 2-cap-table.json/md # Ownership structure
├── 3-financial-analysis.json/md # Financial projections
├── 4-traction-analysis.json/md # Customers & traction metrics
├── 5-team-analysis.json/md # Team & leadership profiles
└── 6-synthesis-report.json/md # Cross-reference, conflicts, gaps
See changelog/2025-11-26_01.md through changelog/2025-11-26_07.md for complete details.
Perplexity @ Syntax Integration: Research queries now automatically target premium data sources using Perplexity's @source syntax. All 20 outline sections (direct + fund) have section-specific source preferences that ensure high-quality research from authoritative sources like @crunchbase, @pitchbook, @statista, and @cbinsights. This prevents low-quality filler content from generic benchmark sites. See changelog/2025-11-22_02.md for complete details.
Key Benefits:
Major architecture refactor: The system now processes sections individually throughout the entire pipeline, eliminating API timeout issues and ensuring consistent citation formatting. All enrichment agents work on section files rather than assembled content. See changelog/2025-11-20_01.md for complete details.
This system uses a supervisor pattern with specialized AI agents to generate investment memos that match Hypernova Capital's analytical standards. Instead of a single AI prompt, it coordinates multiple expert agents that research, write, enrich, cite, validate, and iterate on memos using section-by-section processing to avoid timeouts and maintain quality.
# Legacy mode (outputs to output/)
python -m src.main "Company Name" --type direct --mode consider
# Firm-scoped mode (outputs to io/{firm}/deals/{deal}/outputs/)
python -m src.main "Company Name" --firm hypernova --type direct --mode consider
The system coordinates 18 specialized agents: deck analysis, research, writing, enrichment (trademarks, socials, links, citations), citation cleanup (remove invalid sources, assembly), validation, fact-checking, and scorecard evaluation. All agents process sections individually to avoid API timeouts.
See Pipeline Agents Reference and CLI Tools Reference for complete listings.
@source syntax (@crunchbase, @pitchbook, @statista, @cbinsights)RESEARCH_PROVIDER=duckduckgo for free web search (no API key required)1-research.json (structured data) and 1-research.md (human-readable summary)2-sections/ (all 10 sections as separate .md files)3-validation.json (scores/feedback) and 3-validation.md (human-readable report)4-final-draft.md with inline citations and citation liststate.json for full workflow debuggingtext. [^1] or multiple: text. [^1] [^2][^1]: YYYY, MMM DD. [Source Title](URL). Published: YYYY-MM-DD | Updated: N/Aio/{firm}/configs/ for private firm brandingtemplates/brand-configs/ for cross-firm usetemplates/brand-configs/brand-config.example.yaml and customize with your firm's colors and fontspython cli/export_branded.py --firm hypernova --deal Blinka --brand collide applies Collide branding to a Hypernova deal.woff2, .ttf files)Any VC firm can create their own branded exports in 3 simple steps:
Copy the example config:
cp templates/brand-configs/brand-config.example.yaml templates/brand-configs/brand-yourfirm-config.yaml
Edit with your firm's details:
company:
name: "Your VC Firm Name"
tagline: "Your firm's tagline"
colors:
primary: "#1a3a52" # Your brand's primary color (hex code)
secondary: "#1dd3d3" # Accent color
# ... (see example file for all options)
fonts:
family: "Inter" # Use system fonts like Inter, Georgia, Arial
custom_fonts_dir: null # Or path to custom WOFF2 font files
Export with your brand:
python export-branded.py memo.md --brand yourfirm
That's it! Your memos will now export with your firm's branding. See docs/CUSTOM-BRANDING.md for detailed customization options including custom fonts, color modes, and troubleshooting.
Hypernova is a Fund-of-Funds, deploying 40% of capital as LP commitments to solo GPs and emerging managers, and 60% as direct investments into technology startups. The system supports both investment types:
Direct Investment Template (memo-template-direct.md):
Fund Commitment Template (memo-template-fund.md):
Memo Modes:
Scorecards codify your firm's proprietary evaluation criteria into structured YAML templates. This ensures AI-generated analysis reflects your actual investment thinking rather than generic LLM output.
Why Scorecards Matter:
Create Your Own Scorecard:
# templates/scorecards/your-firm/your-scorecard.yaml
metadata:
scorecard_id: "your-firm-evaluation-v1"
name: "Your Evaluation Framework"
applicable_types: ["direct", "fund"] # or just one
scoring:
scale:
min: 1
max: 5 # or 10, or any range
dimension_groups:
- group_id: "team_quality"
name: "Team Assessment"
dimensions: [founder_market_fit, technical_depth, execution_speed]
dimensions:
founder_market_fit:
name: "Founder-Market Fit"
short_description: "How well founders understand the problem space"
evaluation_guidance:
questions:
- "Have founders experienced this problem firsthand?"
- "Do they have unfair insight into the market?"
red_flags:
- "No domain experience"
- "Thesis based on market reports, not lived experience"
scoring_rubric:
5: "Deep personal experience with problem; unique insight"
3: "Relevant adjacent experience"
1: "No connection to problem space"
Using Scorecards:
# Generate scorecard for a memo
python cli/generate_scorecard.py "CompanyName"
# Output: scorecard.md in artifact directory with scored dimensions
Scorecard Structure:
See templates/scorecards/lp-commits_emerging-managers/hypernova-scorecard.yaml for a complete example with 12 dimensions across 3 groups.
src/agents/dataroom/document_text.py)Full versioned inventory, including the four system-level binaries that must be installed separately: System Dependencies and Python Dependencies.
Python packages install automatically. Four system-level tools do not, and each one silently disables a capability if it is missing. Install all four:
# macOS — everything at once
brew install pandoc poppler tesseract cairo pango gdk-pixbuf libffi
# Ubuntu / Debian
sudo apt install pandoc poppler-utils tesseract-ocr \
libpango-1.0-0 libpangocairo-1.0-0 libgdk-pixbuf2.0-0 libffi-dev
# Windows (Chocolatey) — Poppler is a manual download, see the table
choco install pandoc tesseract
| Tool | Enables | Without it |
|---|---|---|
| Pandoc | Word (.docx) and HTML export | pypandoc attempts a slow auto-download; brew/apt is faster and more reliable |
| Poppler | PDF-to-image conversion for deck analysis with Claude Vision | Deck analysis falls back to text-only extraction |
| Tesseract | OCR fallback in the dataroom text layer | Scanned PDFs yield no text. This matters more than it sounds: executed financing documents are routinely scans, so without Tesseract a signed SAFE looks identical to an empty file |
| Cairo / Pango / gdk-pixbuf / libffi | WeasyPrint PDF export | weasyprint import fails and PDF export is unavailable |
Poppler on Windows: download from
oschwartz10612/poppler-windows
and add its bin/ to PATH.
Tesseract language data (macOS). Homebrew installs the data outside the default search path, so Tesseract is found but reports no languages. Export this in your shell profile:
export TESSDATA_PREFIX="$(brew --prefix)/share/tessdata"
Verify the whole set:
pandoc --version | head -1
pdftoppm -v # Poppler
tesseract --list-langs # should print at least "eng"
python -c "import weasyprint; print('weasyprint', weasyprint.__version__)"
# Install dependencies with uv (requires Python 3.11+)
uv pip install -e . --python /path/to/python3.11
# Or with pip
pip install -e .
Never use pip install into this project's venv for day-to-day work — see
Dependency Management in CLAUDE.md. The commands
above are the supported install paths.
Two files describe Python dependencies and they answer different questions:
pyproject.toml — the ~32 direct dependencies, with floors (>=). This is
the contract: what the code imports and the oldest version that works.requirements.txt — the full resolved tree (121 packages) with exact pins
(==). This is the reproduction: a known-good lockfile for the whole graph,
transitive packages included.Add a new dependency to pyproject.toml first, then regenerate requirements.txt.
A package that appears only in requirements.txt is either transitive or drift.
Versions in the "Verified" column are what the reference environment runs on Python 3.11.
| Package | Floor | Verified | Used for |
|---|---|---|---|
langgraph | >=0.2.0 | 1.0.3 | Multi-agent state graph — the pipeline itself |
langchain | >=0.3.0 | 1.0.7 | Agent scaffolding shared with LangGraph |
langchain-anthropic | >=0.2.0 | 1.1.0 | ChatAnthropic wrapper used by the enrichment agents |
anthropic | >=0.40.0 | 0.74.0 | Direct SDK — imported by 15 modules including every dataroom extractor |
openai | >=1.0.0 | 2.8.1 | SDK shape reused for the Perplexity API; not used against OpenAI |
pydantic | >=2.0.0 | 2.12.4 | Schema validation |
python-dotenv | >=1.0.0 | 1.2.1 | .env loading |
pyyaml | >=6.0 | 6.0.3 | Outlines, brand configs, scorecards |
| Research and fetching | |||
tavily-python | >=0.3.0 | 0.7.13 | Preferred web search — has domain filtering |
firecrawl-py | >=2.0.0 | 4.35.0 | Site crawling for team-roster extraction |
httpx | >=0.27.0 | 0.28.1 | HTTP client |
beautifulsoup4 | >=4.12.0 | 4.14.2 | HTML parsing |
| Document reading | |||
PyMuPDF | >=1.24.0 | 1.28.2 | Primary PDF text + page rendering (imported as pymupdf/fitz) |
pdfplumber | >=0.10.0 | 0.11.10 | PDF table extraction — cap tables, schedules of purchasers |
pdf2image | >=1.17.0 | 1.17.0 |
Absent by design. The code checks for each and reports the gap rather than failing — but the capability is genuinely off until you install it.
| Package | Install | Enables |
|---|---|---|
pypdf | uv pip install pypdf | Third-choice PDF fallback in document_text.py (PyMuPDF → pdfplumber → pypdf). The first two cover everything seen so far |
xlrd | uv pip install xlrd | Legacy .xls workbooks. openpyxl handles .xlsx only |
uv pip install -e ".[dev]"
| Package | Floor | Used for |
|---|---|---|
pytest | >=7.0.0 | Test runner — pytest tests/ |
pytest-asyncio | >=0.23.0 | Required by asyncio_mode = "auto"; without it every async test errors |
black | >=24.0.0 | Formatting, line length 100 |
ruff | >=0.1.0 | Linting, target py311 |
# Copy example env file
cp .env.example .env
# Edit .env and add your API keys
# Required:
ANTHROPIC_API_KEY=your-claude-key
# Optional (for web search - highly recommended):
TAVILY_API_KEY=your-tavily-key # Preferred - has domain filtering
PERPLEXITY_API_KEY=your-perplexity-key # Also used for citation enrichment
# Research provider selection (default: tavily)
RESEARCH_PROVIDER=tavily # Options: tavily, perplexity, duckduckgo
Research Provider Options:
| Provider | API Key Required | Best For |
|---|---|---|
tavily | Yes (TAVILY_API_KEY) | General research, domain filtering |
perplexity | Yes (PERPLEXITY_API_KEY) | Deep research with citations |
duckduckgo | No (free!) | Free fallback, no API key needed |
Automatic Fallback: If your configured provider's API key is missing, the system automatically tries: Tavily → Perplexity → DuckDuckGo.
Get API keys:
The easiest way to use the system — a guided terminal app that discovers your firms, deals, and versions automatically:
memopop
No flags, no file paths, no command knowledge required. Follow the prompts.
For scripting or advanced use, the system supports direct CLI invocation with two investment types and two memo modes:
Investment Types:
direct: Direct startup investment (default)fund: LP commitment to a venture fundMemo Modes:
consider: Prospective analysis for potential investment (default)justify: Retrospective justification for existing investment# Basic usage (defaults to: direct + consider)
python -m src.main "Company Name"
# Direct investment examples
python -m src.main "Aalo Atomics" --type direct --mode justify
python -m src.main "Thinking Machines" --type direct --mode consider
# Fund commitment examples
python -m src.main "Pear VC" --type fund --mode justify
python -m src.main "Accel Growth Fund V" --type fund --mode consider
# Interactive mode
python -m src.main
# Force a specific semantic version (instead of auto-incrementing)
python -m src.main "Company Name" --version v0.1.0
# Fresh start: ignore prior artifacts, generate from scratch
python -m src.main "Company Name" --fresh
# Both: fresh start at a specific version with firm
python -m src.main "Company Name" --firm humain --fresh --version v0.1.0
CLI Arguments:
--type [direct|fund]: Investment type (default: direct)--mode [justify|consider]: Memo mode (default: consider)--version <version>: Force a specific semantic version (e.g., v0.1.0) instead of auto-incrementing. With --resume, specifies which version to resume.--fresh: Start from a clean slate — ignores prior artifacts and research, generates everything from scratch using only the dataroom, deck, and web research as inputs.--firm <name>: Firm name for firm-scoped IO (e.g., hypernova). Uses io/{firm}/deals/{deal}/ structure.--deal <name>: Deal name (alternative to positional argument)--resume: Resume from last checkpoint (skips completed agents)You can create a JSON file in data/{CompanyName}.json to provide additional context and configuration:
{
"type": "direct",
"mode": "consider",
"description": "Brief company description for research context",
"url": "https://company.com",
"stage": "Series B",
"deck": "data/CompanyName-deck.pdf",
"trademark_light": "https://company.com/logo-light.svg",
"trademark_dark": "https://company.com/logo-dark.svg",
"notes": "Research focus: team backgrounds, competitive positioning, unit economics",
"disambiguation": [
"https://wrong-company.com/",
"https://similar-name-different-entity.com/"
]
}
Field Reference:
| Field | Type | Description |
|---|---|---|
type | "direct" or "fund" | Investment type (overrides CLI --type) |
mode | "consider" or "justify" | Memo mode (overrides CLI --mode) |
description | string | Brief description to guide research |
url | string | Company website URL |
stage | string | Investment stage (Seed, Series A, etc.) |
deck | string | Path to pitch deck PDF or PowerPoint (.pdf, .pptx) relative to project root |
trademark_light | string | URL or path to light mode company logo |
trademark_dark | string | URL or path to dark mode company logo |
notes | string | Specific research focus areas or instructions |
disambiguation | array | URLs of wrong companies with similar names to exclude from research |
Trademark Insertion:
trademark_light, dark mode exports use trademark_darktemplates/trademarks/company-logo.svg)Entity Disambiguation:
disambiguation array lists URLs of wrong entities that should be excluded from researchreson8.xyz might be confused with reson8.group, reson8media.com, or reson8sms.com - add those to the disambiguation array to exclude themExample: See data/sample-company.json and data/TheoryForge.json for complete examples.
Each generation creates a versioned artifact directory:
Legacy mode (output/):
output/{Company-Name}-v0.0.x/
├── 1-research.json # Structured research data
├── 1-research.md # Human-readable research summary
├── 2-sections/ # Individual section drafts
│ ├── 01-executive-summary.md
│ ├── 02-business-overview.md
│ └── ... (all 10 sections)
├── 3-validation.json # Validation scores and feedback
├── 3-validation.md # Human-readable validation report
├── 4-final-draft.md # Complete memo with citations
└── state.json # Full workflow state for debugging
Firm-scoped mode (io/{firm}/):
io/{firm}/deals/{deal}/
├── {deal}.json # Deal configuration
├── inputs/ # Source materials (decks, datarooms)
├── outputs/ # Generated memo artifacts
│ └── {Deal}-v0.0.x/ # Same structure as legacy
├── exports/ # Branded HTML/PDF exports
│ ├── dark/
│ └── light/
└── assets/ # Deal-specific assets (logos)
Plus versions.json tracking version history across all iterations.
After generating a memo, you can improve individual sections without regenerating the entire memo. This is useful when:
The improve-section.py script uses Perplexity Sonar Pro for real-time research and automatic citation addition.
Features:
[^1], [^2])Usage:
# Activate venv first
source .venv/bin/activate
# Improve a specific section
python improve-section.py "Avalanche" "Team"
# Specify version
python improve-section.py "Avalanche" "Market Context" --version v0.0.1
# Use direct path to artifact directory
python improve-section.py output/Avalanche-v0.0.1 "Technology & Product"
Section Names: Use the section names as they appear in 2-sections/ for the memo you're improving (e.g., "Team", "Market Context"). Section names are defined by your outline/template configuration.
Output:
✓ Loading artifacts from: output/Avalanche-v0.0.1/
✓ Loaded research data
✓ Loaded 10 existing sections
Improving section: Team
Using Perplexity Sonar Pro for real-time research...
✓ Section improved with 11 new citations added
✓ Saved to: output/Avalanche-v0.0.1/2-sections/04-team.md
Reassembling final draft...
✓ Final draft reassembled: output/Avalanche-v0.0.1/4-final-draft.md
Citations added: 11
Next steps:
1. Review improved section in: output/Avalanche-v0.0.1/2-sections/
2. View complete memo: output/Avalanche-v0.0.1/4-final-draft.md
3. Export to HTML: python export-branded.py output/Avalanche-v0.0.1/4-final-draft.md --brand hypernova
Requirements:
PERPLEXITY_API_KEY must be set in .env fileBenefits:
If the final draft gets corrupted or you need to manually reassemble after editing section files:
# Reassemble with citation renumbering and TOC generation
python -m cli.assemble_draft "Sava"
python -m cli.assemble_draft "Sava" --version v0.0.2
This ensures:
All section improvement tools automatically call this after their changes.
The system supports multiple export formats with branding and citation preservation.
| Tool | Format | Command |
|---|---|---|
md2docx.py | Word (.docx) | python md2docx.py output/Company-v0.0.1/4-final-draft.md |
export-branded.py | HTML (light) | python export-branded.py output/Company-v0.0.1/4-final-draft.md |
export-branded.py | HTML (dark) | python export-branded.py output/Company-v0.0.1/4-final-draft.md --mode dark |
export-branded.py | python export-branded.py output/Company-v0.0.1/4-final-draft.md --pdf | |
export-all-modes.sh | Batch (all memos) | ./export-all-modes.sh |
All exports preserve inline citations, footnotes, and markdown formatting.
For detailed export options, custom branding, and troubleshooting, see:
exports/EXPORT-GUIDE.md - Comprehensive export documentationdocs/CUSTOM-BRANDING.md - Multi-brand configuration guideThe system uses 18 specialized agents orchestrated via LangGraph. The complete pipeline:
┌──────────────────────────────────────────────────────────────────────────────┐
│ MEMO GENERATION PIPELINE │
│ (18 agents via LangGraph) │
└──────────────────────────────────────────────────────────────────────────────┘
┌──────────────┐
│ Supervisor │ ← Coordinates workflow via LangGraph
└──────┬───────┘
│
┌───┴────────────────┐
│ 1. Deck Analyst │ ← Extract info from pitch deck PDF/PPTX (if available)
└───┬────────────────┘ Saves: 0-deck-analysis.json, 0-deck-analysis.md
│
┌───┴────────────────┐
│ 2. Research │ ← Web search (Tavily: 4 queries) + synthesis
└───┬────────────────┘ Saves: 1-research.json, 1-research.md
│
┌───┴────────────────┐
│ 3. Section Research│ ← Section-specific Perplexity research with citations
└───┬────────────────┘ Saves: 1-research/*.md (per-section research)
│
┌───┴────────────────┐
│ 4. Writer │ ← Draft memo (10 sections), polish section research
└───┬────────────────┘ Saves: 2-sections/*.md (10 files)
│
╔═══╧════════════════════════════════════════════════════════╗
║ ENRICHMENT PIPELINE (4 agents) ║
╠════════════════════════════════════════════════════════════╣
║ 5. Trademark → 6. Socials → 7. Links → 8. Visualizations ║
╚═══╤════════════════════════════════════════════════════════╝
│ Updates 2-sections/*.md with logos, LinkedIn, hyperlinks
│
┌───┴────────────────┐
│ 9. Citation Enrich │ ← Add inline citations (Perplexity Sonar Pro)
└───┬────────────────┘ Adds [^1], [^2], etc. per section
│
┌───┴────────────────┐
│ 10. TOC Generator │ ← Generate Table of Contents with anchor links
└───┬────────────────┘ Insert TOC after header, before first section
│
┌───┴────────────────┐
│ 11. Revise Summary │ ← Rewrite Executive Summary + Closing Assessment
└───┬────────────────┘ Extract metrics from body, ensure accurate bookends
│
╔═══╧════════════════════════════════════════════════════════╗
║ CITATION CLEANUP PIPELINE (2 agents) ║
╠════════════════════════════════════════════════════════════╣
║ 12. Remove Invalid Sources → 13. Citation Assembly ║
║ - Validate URLs (HEAD) - Renumber [^1][^2][^3]... ║
║ - Remove 404s/410s - Consolidate to ONE block ║
║ - Detect hallucinations - Remove per-section defs ║
╚═══╤════════════════════════════════════════════════════════╝
│ Cleans 1-research/ and 2-sections/, assembles 6-final-draft.md
│
┌───┴────────────────┐
│ 14. Citation Valid │ ← Validate date accuracy, detect duplicates
└───┬────────────────┘ Check remaining URLs, ensure proper formatting
│
┌───┴────────────────┐
│ 15. Fact Checker │ ← Verify claims against research sources
└───┬────────────────┘ Identify unsourced metrics, hallucinated data
│
┌───┴────────────────┐
│ 16. Validator │ ← Score 0-10, identify issues
└───┬────────────────┘ Saves: 3-validation.json, 3-validation.md
│
┌───┴────────────────┐
│ 17. Scorecard │ ← Evaluate against firm's scorecard template
└───┬────────────────┘ Saves: 5-scorecard/*.md
│
┌───┴────────────────┐
│ 18. Integrate Score│ ← Integrate scorecard into section 8, reassemble
└───┬────────────────┘
│
┌───┴───────────────┐
│ Score >= 8? │
└───┬───────────┬───┘
│ │
┌───┴────┐ ┌──┴──────────┐
│Finalize│ │Human Review │
└────────┘ └─────────────┘
Both save: 6-{Company}-v0.0.x.md, state.json
flowchart TD
subgraph Input
A[Start] --> B[Deck Analyst]
end
subgraph Research Phase
B --> C[Research Agent]
C --> D[Section Research]
end
subgraph Writing Phase
D --> E[Writer Agent]
end
subgraph Enrichment Pipeline
E --> F[Trademark Enrichment]
F --> G[Socials Enrichment]
G --> H[Link Enrichment]
H --> I[Visualization Enrichment]
end
subgraph Citation Pipeline
I --> J[Citation Enrichment]
J --> K[TOC Generator]
K --> L[Revise Summaries]
end
subgraph Citation Cleanup
L --> M[Remove Invalid Sources]
M --> N[Citation Assembly]
end
subgraph Validation Phase
N --> O[Citation Validator]
O --> P[Fact Checker]
P --> Q[Validator]
end
subgraph Scorecard Phase
Q --> R[Scorecard Evaluator]
R --> S[Integrate Scorecard]
end
subgraph Output
S --> T{Score >= 8?}
T -->|Yes| U[Finalize]
T -->|No| V[Human Review]
U --> W[Final Draft]
V --> W
end
MemoState = {
"company_name": str,
"investment_type": Literal["direct", "fund"], # Type of investment
"memo_mode": Literal["justify", "consider"], # Memo purpose
"research": ResearchData, # Web search results + synthesis
"draft_sections": Dict, # Drafted memo sections
"validation_results": Dict, # Scores and feedback
"overall_score": float, # 0-10 quality score
"revision_count": int, # Iteration tracking
"final_memo": str, # Finalized content
"messages": List[str] # Agent outputs
}
investment-memo-orchestrator/
├── src/
│ ├── agents/
│ │ ├── deck_analyst.py # Pitch deck analysis (PDF + PowerPoint)
│ │ ├── researcher.py # Basic research (no web search)
│ │ ├── research_enhanced.py # Web search + synthesis
│ │ ├── perplexity_section_researcher.py # Section-specific research
│ │ ├── writer.py # Memo drafting
│ │ ├── trademark_enrichment.py # Company logo insertion
│ │ ├── socials_enrichment.py # LinkedIn link addition
│ │ ├── link_enrichment.py # Organization hyperlinks
│ │ ├── visualization_enrichment.py # Charts/graphs (disabled)
│ │ ├── citation_enrichment.py # Citation addition (Perplexity)
│ │ ├── toc_generator.py # Table of Contents generation
│ │ ├── revise_summary_sections.py # Rewrite Executive Summary + Closing
│ │ ├── remove_invalid_sources.py # URL validation, remove 404s/hallucinations
│ │ ├── citation_assembly.py # Global citation renumbering & consolidation
│ │ ├── citation_validator.py # Citation accuracy validation
│ │ ├── fact_checker.py # Fact verification agent
│ │ ├── validator.py # Quality validation
│ │ ├── scorecard_agent.py # 12-dimension emerging manager scorecard
│ │ ├── scorecard_evaluator.py # Scorecard evaluation agent
│ │ ├── portfolio_listing_agent.py # Portfolio company extraction
│ │ └── dataroom/ # Dataroom Analyzer Agent System
│ │ ├── __init__.py # Package exports
│ │ ├── analyzer.py # Main orchestrator
│ │ ├── dataroom_state.py # TypedDict schemas
│ │ ├── document_scanner.py # Directory scanning
│ │ ├── document_classifier.py # 3-stage classification
│ │ └── extractors/ # Specialized extractors
│ ├── state.py # TypedDict schemas
│ ├── workflow.py # LangGraph orchestration
│ ├── artifacts.py # Artifact trail system
│ ├── versioning.py # Version tracking system
│ ├── cli/ # Module CLI commands
│ │ ├── __init__.py
│ │ └── revise_summaries.py # Revise Executive Summary + Closing
│ ├── paths.py # Firm-scoped path resolution
│ ├── branding.py # Brand config loading
│ ├── scorecard_loader.py # Scorecard loading
│ └── main.py # CLI entry point
├── cli/
│ ├── export_branded.py # HTML/PDF export with branding
│ ├── resume_from_interruption.py # Resume interrupted generation
│ ├── improve_section.py # Section improvement
│ ├── score_memo.py # Scorecard generation
│ ├── recompile_memo.py # Memo recompilation
│ ├── refocus_section.py # Section refocusing
│ └── html-to-pdf.sh # HTML to PDF conversion
├── io/ # Firm-scoped IO (gitignored)
│ ├── README.md # Firm-scoped IO documentation
│ └── {firm}/ # e.g., hypernova, emerge
│ ├── configs/ # Brand configs
│ ├── templates/ # Outlines, scorecards
│ └── deals/ # Deal data and outputs
├── templates/
│ ├── outlines/ # YAML content outlines
│ ├── scorecards/ # Evaluation scorecards
│ ├── brand-configs/ # Shared brand configurations
│ ├── memo-template-direct.md # Direct investment template
│ ├── memo-template-fund.md # Fund commitment template
│ └── style-guide.md # Writing standards
├── docs/
│ ├── CUSTOM-BRANDING.md # Brand configuration guide
│ ├── COMMANDS_CHEAT_SHEET.md # CLI reference
│ └── WEB_SEARCH_SETUP.md # Search provider guide
├── changelog/
│ └── releases/ # Release notes
├── output/ # Legacy output directory
├── data/ # Legacy company data
└── tests/ # Unit tests
docs/PIPELINE-REFERENCE.md is the authoritative
answer to what runs and what you can type. Every graph node in execution order
with its resume stage, defining module, and purpose; every python -m src.main
flag; every tool under cli/, cli/utils/, and src/cli/; and a live inventory
of which modules route through src/llm_provider.py and which construct an
Anthropic client directly.
It is generated from the code — scripts/gen_pipeline_reference.py parses
src/workflow.py, src/main.py, and the CLI directories via the AST. No imports,
no API keys, ~0.3s. Never hand-edit the output; the next regeneration
discards the edit.
# regenerate after changing the graph, a flag, or a CLI tool
.venv/bin/python scripts/gen_pipeline_reference.py
# check for staleness without writing (exit 1 = drift)
.venv/bin/python scripts/gen_pipeline_reference.py --check
Prose a parser cannot infer — a node's purpose, its --from stage, the
AGENTS.md principles binding it, what each stage owns on disk — lives in
docs/pipeline-reference.overlay.yaml
and is merged in at generation time. Edit that file, not the markdown.
tests/test_pipeline_reference.py enforces the whole arrangement: it fails when
the committed doc drifts from the code, when a graph node has no overlay entry,
when a node has no stage or purpose, when a node is unreachable from the entry
point, and when a new module starts billing the Anthropic API directly. If it
goes red after a graph change, regenerate and commit.
Four hand-maintained references drifted simultaneously. The Pipeline Agents
Reference below documented 27 of the graph's 35 nodes and omitted
aggregate_sources — the analyst-curation halt that codified mode depends on.
The CLI Tools Reference listed 16 of 35 executables.
docs/COMMANDS_CHEAT_SHEET.md documented none of --firm, --deal, --fresh,
or --frame. A table nobody regenerates is a table that lies, so the counting
moved into a script and the judgement moved into a YAML file next to it.
Standalone tools for post-generation improvements and exports. All tools support --firm and --deal flags for firm-scoped IO.
The generated reference is authoritative.
docs/PIPELINE-REFERENCE.mdis built fromsrc/workflow.py,src/main.py, andcli/byscripts/gen_pipeline_reference.py, andtests/test_pipeline_reference.pyfails when it drifts. The table below is hand-maintained and has already drifted — it lists 16 of the 35 executables undercli/,cli/utils/, andsrc/cli/.
| Tool | Purpose | Usage |
|---|---|---|
cli/resume_from_interruption.py | Resume interrupted generation | python cli/resume_from_interruption.py --firm hypernova --deal Blinka |
cli/sanitize_commentary.py | Extract LLM process commentary to internal notes | python cli/sanitize_commentary.py --firm hypernova --deal Blinka |
cli/improve_section.py | Improve a section with Perplexity research | python cli/improve_section.py --firm hypernova --deal Blinka "Team" |
cli/improve_team_section.py | Deep team research (LinkedIn + web) | python cli/improve_team_section.py --firm hypernova --deal Blinka |
cli/assemble_draft.py | Rebuild final draft from sections | python cli/assemble_draft.py --firm hypernova --deal Blinka |
src/cli/revise_summaries.py | Rewrite Executive Summary + Closing Assessment | python -m src.cli.revise_summaries "Company" --firm dark-matter |
cli/rewrite_key_info.py | Apply YAML corrections across sections | python cli/rewrite_key_info.py "Company" corrections.yaml |
cli/generate_scorecard.py | Generate scorecard from template | python cli/generate_scorecard.py "Company" |
cli/score_memo.py | Score memo with scorecard | python cli/score_memo.py --firm hypernova --deal Blinka |
cli/evaluate_memo.py | Re-run validation on existing memo | python cli/evaluate_memo.py "Company" |
cli/refocus_section.py | Refocus section with new guidance | python cli/refocus_section.py --firm hypernova --deal Blinka "Section" |
cli/recompile_memo.py | Recompile memo from sections | python cli/recompile_memo.py --firm hypernova --deal Blinka |
cli/generate_tables.py | Generate markdown tables from state data | python -m cli.generate_tables "Company" --firm humain |
The main workflow (python -m src.main) orchestrates 26 agents through a LangGraph state machine. Agents execute sequentially, with two anti-hallucination validation gates and a conditional routing decision at the end.
The generated reference is authoritative.
docs/PIPELINE-REFERENCE.mdis built fromsrc/workflow.py,src/main.py, andcli/byscripts/gen_pipeline_reference.py, andtests/test_pipeline_reference.pyfails when it drifts. The table below is hand-maintained and has already drifted — the graph has 35 nodes, and the table below omitsaggregate_sources,fix_citation_spacing,attribution_audit,fact_verify,fact_correct,source_catalog,scorecard_nav, andone_pager. The diagram also placesciteandtocwhere they no longer run.
┌─────────────────────────────────────────────────┐
│ PHASE 1: DATA GATHERING │
│ │
│ ┌───────────┐ ┌──────────────┐ ┌──────────┐ │
│ │ 1.Dataroom│─▶│2.Deck Analyst│─▶│3.Research│ │
│ └───────────┘ └──────────────┘ └────┬─────┘ │
│ │ │
│ ┌──────────────────┐ ┌───────────────┴─────┐ │
│ │5.Competitive │◀─│4. Section Research │ │
│ │ Researcher │ │ (per-section w/ │ │
│ └────────┬─────────┘ │ Perplexity) │ │
│ │ └─────────────────────┘ │
│ ┌────────▼─────────┐ │
│ │6.Competitive │ │
│ │ Evaluator │ │
│ └────────┬─────────┘ │
└───────────┼─────────────────────────────────────┘
│
┌───────────▼─────────────────────────────────────┐
│ PHASE 2: CITATION ENRICHMENT │
│ │
│ ┌───────────────────┐ ┌─────────────────────┐ │
│ │7. Citation Enrich │─▶│ 8. GATE 1: Cleanup │ │
│ │ (on 1-research/) │ │ Research Citations │ │
│ └───────────────────┘ └──────────┬──────────┘ │
└────────────────────────────────────┼────────────┘
│
┌────────────────────────────────────▼────────────┐
│ PHASE 3: WRITING & ENRICHMENT │
│ │
│ ┌────────┐ ┌────────────────┐ ┌───────────┐ │
│ │9.Writer│─▶│10.Inject Deck │─▶│11.Enrich │ │
│ │(10 sec)│ │ Images │ │ Trademark │ │
│ └────────┘ └────────────────┘ └─────┬─────┘ │
│ │ │
│ ┌────────────┐ ┌──────────────┐ ┌───▼─────┐ │
│ │14.Enrich │◀─│13.Link │◀─│12.Socials│ │
│ │ Tables │ │ Enrichment │ │ Enrich │ │
│ └──────┬─────┘ └──────────────┘ └─────────┘ │
│ │ │
│ ┌──────▼───────┐ ┌──────────────┐ ┌───────┐ │
│ │15.Generate │─▶│16.Enrich │─▶│17.TOC │ │
│ │ Diagrams │ │ Visuals │ │ │ │
│ └──────────────┘ └──────────────┘ └───┬───┘ │
│ │ │
│ ┌──────────────────┐ │ │
│ │18.Revise Summary │◀───────────────────┘ │
│ │ Sections │ │
│ └────────┬─────────┘ │
└───────────┼────────────────────────────────────┘
│
┌───────────▼─────────────────────────────────────┐
│ PHASE 4: ASSEMBLY & VALIDATION │
│ │
│ ┌─────────────────┐ ┌───────────────────────┐ │
│ │19. GATE 2: │─▶│20. Citation Assembly │ │
│ │ Cleanup Sections│ │ (consolidate+renumber)│ │
│ └─────────────────┘ └───────────┬───────────┘ │
│ │ │
│ ┌──────────────────┐ ┌──────────▼──────────┐ │
│ │22. Fact Checker │◀─│21. Citation │ │
│ │ │ │ Validator │ │
│ └────────┬─────────┘ └─────────────────────┘ │
│ │ │
│ ┌────────▼─────────┐ ┌─────────────────────┐ │
│ │23. Validator │─▶│24. Scorecard │ │
│ │ (score 0-10) │ │ Evaluator │ │
│ └──────────────────┘ └──────────┬──────────┘ │
│ │ │
│ ┌────────────────────────────────▼──────────┐ │
│ │25. Integrate Scorecard │ │
│ │ (insert into section 8, reassemble draft)│ │
│ └────────────────────┬──────────────────────┘ │
└───────────────────────┼─────────────────────────┘
│
┌────────▼────────┐
│ Score >= 8 ? │
└───┬─────────┬───┘
yes │ │ no
┌─────────▼──┐ ┌───▼──────────┐
│26.Finalize │ │27.Human │
│ │ │ Review │
└─────────┬──┘ └───┬──────────┘
│ │
▼ ▼
┌─────────────┐
│ END │
└─────────────┘
| # | Agent | Node | File | Purpose |
|---|---|---|---|---|
| 1 | Dataroom Analyzer | dataroom | dataroom/ | Scan and extract data from dataroom documents (skips if none) |
| 2 | Deck Analyst | deck_analyst | deck_analyst.py | Extract info from pitch decks via Claude Vision (skips if none) |
| 3 | Research | research | research_enhanced.py | Web search via Tavily/Perplexity, synthesize findings |
| 4 | Section Research | section_research | perplexity_section_researcher.py | Per-section deep research with Perplexity citations |
| 5 | Competitive Researcher | competitive_researcher | competitive_landscape_researcher.py | Discover competitor candidates via multi-query Perplexity search |
| 6 | Competitive Evaluator | competitive_evaluator | competitive_landscape_evaluator.py | Classify competitors (direct/indirect/adjacent), run gap analysis |
| 7 | Citation Enrichment | cite | citation_enrichment.py | Add inline citations to research files via Perplexity Sonar Pro |
| 8 | GATE 1: Cleanup Research | cleanup_research | workflow.py + remove_invalid_sources.py | Validate URLs in 1-research/, remove 404s and hallucinations before writer |
| 9 | Writer | draft | writer.py | Draft 10 sections one at a time from outline/template |
| 10 | Inject Deck Images | inject_deck_images | inject_deck_images.py | Place deck screenshots into section files (max 2 per image) |
| 11 | Trademark Enrichment | enrich_trademark | trademark_enrichment.py |
The pipeline includes two validation gates that prevent hallucinated citations from propagating:
1-research/ files. The writer never sees unverified citations.2-sections/ files. Catches any issues introduced during enrichment or revision.Agents with their own CLI entry points for specialized tasks.
| Agent | File | Purpose |
|---|---|---|
| Internal Comments Sanitizer | internal_comments_sanitizer.py | Extract LLM process commentary to internal notes |
| Scorecard Agent | scorecard_agent.py | Generate scorecards from YAML templates |
| Portfolio Listing | portfolio_listing_agent.py | Extract portfolio companies from fund memos |
| Key Info Rewrite | key_info_rewrite.py | Propagate fact corrections across sections |
| Dataroom Analyzer | dataroom/analyzer.py | Scan and extract data from dataroom documents |
For detailed documentation, see:
docs/COMMANDS_CHEAT_SHEET.md - Complete CLI reference with all options and examplesdocs/CASUAL_USER_GUIDE.md - Comprehensive usage guidedocs/SETUP.md - Installation and configurationdocs/TROUBLESHOOTING.md - Common issues and solutionsThis project uses git-based semantic versioning with setuptools-scm:
v0.1.0, v0.2.0, v1.0.0, etc.0.1.1.dev3 (3 commits after v0.1.0)# 1. Ensure all changes are committed
git status
# 2. Create and push a new tag (follows semantic versioning)
git tag v0.2.0 -m "Release v0.2.0: Brief description of changes"
git push origin v0.2.0
# 3. Version automatically updates to 0.2.0
python -c "from src import __version__; print(__version__)"
# Output: 0.2.0
# 4. Create GitHub release from tag (optional)
gh release create v0.2.0 --generate-notes
v0.1.1): Bug fixes, minor improvementsv0.2.0): New features, backward-compatible changesv1.0.0): Breaking changes, major milestones# From Python
python -c "from src import __version__; print(__version__)"
# From command line
git describe --tags
fund or direct investment type.deck if provided and include relevant screenshots in relevant sections in the memo.LLMs have a tendency to include meta-commentary in generated content ("Let me search for...", "Note: Unable to find...", "If you have the actual content, please share..."). Despite aggressive prompt engineering, this process commentary leaks into final output and is inappropriate for external-facing documents.
Implemented: The cli/sanitize_commentary.py CLI and src/agents/internal_comments_sanitizer.py agent:
2-sections-internal/ folder4-internal-notes.mdUsage:
# Sanitize a memo
python cli/sanitize_commentary.py --firm hypernova --deal Blinka
# Preview what would be extracted without modifying
python cli/sanitize_commentary.py --firm hypernova --deal Blinka --preview
See context-vigilance/Containerizing-Internal-Comments-and-Recommendations-for-Consideration.md for complete specification.
A specialized agent to identify and generate tables from data that would be better presented in tabular form:
See context-vigilance/Table-Generator-Agent-Spec.md for complete specification.
All specifications, blueprints, issue resolutions, and reference docs live in context-v/. Each file has YAML frontmatter with title, category, dates, and tags.
| Created | Category | Title | File |
|---|---|---|---|
| 2025-11-16 | Reference | Example Memos | Document-Examples.md |
| 2025-11-16 | Prompts | Generate Investment Memo for Portfolio Company | Generate-Investment-Memo-for-Portfolio-Company.md |
| 2025-11-16 | Architecture | Multi-Agent Orchestration for Investment Memo Generation | Multi-Agent-Orchestration-for-Investment-Memo-Generation.md |
| 2025-11-17 | Reference | Citation Spacing Improvements | Citation-Reminders.md |
| 2025-11-17 | Reference | Dark Mode Export Guide | Export-Style-Templates.md |
| 2025-11-19 | Prompts | Improve Investment Memo Output | Improving-Memo-Output.md |
| 2025-11-21 | Architecture | Format Memo According to Outline Input | Format-Memo-According-to-Template-Input.md |
| Created | Title | File |
|---|---|---|
| 2025-11-21 | Getting Sonar Pro to Work in First Research Agent | issue-resolution/Getting-Sonar-Pro-to-work-in-first-Research-Agent.md |
| 2025-11-21 | Perplexity API Fix - Zero Balance Issue | issue-resolution/Perplexity-as-Default-Research-Agent.md |
| 2025-11-22 | Premium Data Sources Integration Plan | issue-resolution/Premium-Data-Sources-Integration-Plan.md |
| 2025-11-22 | Perplexity Premium API Calls - Complete Reference | issue-resolution/Perplexity-Premium-API-Calls-Reference.md |
| 2025-11-22 | Preventing Hallucinations in Memo Generation | issue-resolution/Preventing-Hallucinations-in-Memo-Generation.md |
| 2025-11-22 | Tier 1 Anti-Hallucination Test Results: Work Back AI | issue-resolution/Tier-1-Test-Results-WorkBack.md |
| 2025-11-23 | Resume Workflow After Interruption |
| Created | Title | File |
|---|---|---|
| 2025-12-26 | Frontmatter Standards for Context Files | reminders/Frontmatter-Standards-for-Context-Files.md |
| 2026-01-28 | Extended Markdown Citation System Syntax | reminders/Extended-Markdown-Citation-System-Syntax.md |
cli/resume_from_interruption.py)cli/sanitize_commentary.py)This is an internal Hypernova Capital research project. For questions or suggestions, contact the development team.
Proprietary - Hypernova Capital
Investing in frontier technology companies at the intersection of climate, energy, and AI.
Last updated: 2025-12-15 Version: v0.3.6 (Citation Cleanup Pipeline: Remove Invalid Sources + Citation Assembly) Status: Production-ready with multi-tenant support
| PDF page rendering for Claude Vision (wraps Poppler) |
pillow | >=10.0.0 | 12.3.0 | Image handling for rendered deck pages (imported as PIL) |
python-docx | >=1.2.0 | 1.2.0 | .docx reading and Word generation |
python-pptx | >=1.0.0 | 1.0.2 | .pptx slide text and speaker notes |
openpyxl | >=3.1.0 | 3.1.5 | .xlsx reading — cap tables, pro formas |
pandas | >=2.0.0 | 3.0.5 | Spreadsheet and cap-table manipulation |
| Export |
pypandoc | >=1.13 | 1.16.2 | Markdown → Word (requires the Pandoc binary) |
weasyprint | >=60.0 | 66.0 | HTML → PDF (requires the Cairo/Pango stack) |
matplotlib | >=3.8.0 | 3.11.1 | Diagram generation — TAM/SAM/SOM, funnels |
| Google Workspace |
google-api-python-client | >=2.0.0 | 2.187.0 | Drive / Docs API |
google-auth | >=2.0.0 | 2.43.0 | Service-account and OAuth credentials |
google-auth-oauthlib | >=1.0.0 | 1.2.2 | OAuth flow |
google-auth-httplib2 | >=0.2.0 | 0.2.1 | HTTP transport for the above |
| Interface |
rich | >=13.0.0 | 14.2.0 | Terminal rendering, progress, tables |
questionary | >=2.0.0 | 2.1.1 | Interactive prompts in the memopop CLI |
fastapi | >=0.110.0 | 0.141.1 | HTTP API surface (src/server) |
uvicorn[standard] | >=0.27.0 | 0.52.1 | ASGI server |
sse-starlette | >=2.0.0 | 3.4.8 | Server-Sent Events for streaming job logs |
cli/export_branded.py | Export to branded HTML/PDF | python cli/export_branded.py --firm hypernova --deal Blinka --pdf |
cli/html-to-pdf.sh | Convert HTML to PDF | bash cli/html-to-pdf.sh path/to/memo.html |
cli/md2docx.py | Export to Word (.docx) | python md2docx.py memo.md |
| Insert company logo/trademark into header |
| 12 | Socials Enrichment | enrich_socials | socials_enrichment.py | Add LinkedIn profile links to team members |
| 13 | Link Enrichment | enrich_links | link_enrichment.py | Add hyperlinks to organizations, investors, partners |
| 14 | Table Generator | generate_tables | table_generator.py | Generate markdown tables from structured data (funding, team, market, traction) |
| 15 | Diagram Generator | generate_diagrams | diagram_generator.py | Create visual diagrams (TAM/SAM/SOM concentric circles, etc.) |
| 16 | Visualization Enrichment | enrich_visualizations | visualization_enrichment.py | Search for and embed relevant visualizations (temporarily disabled) |
| 17 | TOC Generator | toc | toc_generator.py | Generate Table of Contents with working anchor links |
| 18 | Revise Summaries | revise_summaries | revise_summary_sections.py | Rewrite Executive Summary and Closing Assessment with accurate metrics from full draft |
| 19 | GATE 2: Cleanup Sections | cleanup_sections | remove_invalid_sources.py | Validate URLs in 2-sections/, remove invalid citations before assembly |
| 20 | Citation Assembly | assemble_citations | citation_assembly.py | Consolidate all citations, renumber globally, assemble final draft |
| 21 | Citation Validator | validate_citations | citation_validator.py | Validate citation accuracy, check dates, detect duplicates |
| 22 | Fact Checker | fact_check | fact_checker.py | Verify claims against research sources, flag unsourced metrics |
| 23 | Validator | validate | validator.py | Score memo quality 0-10, provide specific feedback |
| 24 | Scorecard Evaluator | scorecard | scorecard_evaluator.py | Evaluate against firm's 12Ps scorecard template |
| 25 | Integrate Scorecard | integrate_scorecard | workflow.py | Insert scorecard into section 8, reassemble final draft |
| 26 | Finalize | finalize | workflow.py | Verify final draft, save state snapshot (score >= 8) |
| 27 | Human Review | human_review | workflow.py | Prepare memo for human review with issues and suggestions (score < 8) |
| 2025-11-22 |
| Blueprint |
| Preferred Sources Implementation Summary |
Anti-Hallucination-Fact-Checker-Agent.md |
| 2025-11-26 | Architecture | Dataroom Analyzer Agent System Plan | Dataroom-Analyzer-Agent.md |
| 2025-11-27 | Architecture | Model Scorecard Agent and Template System | Model-Scorecard-Agent-and-Template-System.md |
| 2025-11-27 | Infrastructure | Git Submodules for Private Data and Exports | Git-Submodules-for-Private-Data-and-Exports.md |
| 2025-11-27 | Specification | Portfolio Listing Agent and Current Portfolio Section | Portfolio-Listing-Agent-and-Current-Portfolio-Section.md |
| 2025-11-28 | Blueprint | 12Ps Framework Integration Plan | 12Ps-Integration-Plan.md |
| 2025-11-28 | Specification | Containerizing Risk Assessments and Diligence Skepticism | Containerizing-Risk-Assessments-and-Diligence-Skepticism.md |
| 2025-11-28 | Specification | Exploring a Simple GUI for the Terminal Averse | Exploring a simple GUI for the terminal averse.md |
| 2025-11-28 | Specification | Introducing a GUI Native Desktop with Swift | Introducing-a-GUI-Native-Desktop-with-Swift.md |
| 2025-11-28 | Specification | Reorder and Edit Direct Outline | Reorder-and-Edit-Direct-Outline.md |
| 2025-12-02 | Blueprint | Firm and Deal-Based File Organization System | Firm-and-Deal-based-File-Organization-System.md |
| 2025-12-02 | Specification | Fix Firm-Scoped Output Paths | Fix-Firm-Scoped-Output-Paths.md |
| 2025-12-02 | Specification | MemoPop Landing Page Specification | MemoPop-Landing-Page-Sepcification.md |
| 2025-12-05 | Specification | Containerizing Internal Comments and Recommendations | Containerizing-Internal-Comments-and-Recommendations-for-Consideration.md |
| 2025-12-05 | Specification | Disambiguation Management Across Agents | Disambiguation-Management-across-Agents.md |
| 2025-12-05 | Specification | Post-Generation Quality Agents | Post-Generation-Quality-Agents.md |
| 2025-12-05 | Specification | Table Generator Agent Specification | Table-Generator-Agent-Spec.md |
| 2025-12-08 | Specification | Papermark Self-Hosted Dataroom Deployment | Papermark-Self-Hosted-Dataroom-Deployment.md |
| 2025-12-09 | Agent Docs | Deck Analyzer Agent | Deck-Analyzer-Agent.md |
| 2025-12-14 | Specification | Agent Should Reorder and Organize Citations on Assembly | An-Agent-should-Reorder-and-Organize-Citations-on-Assembly.md |
| 2025-12-14 | Specification | Faked Sources from Perplexity | Faked-Sources-from-Perplexity.md |
| 2025-12-15 | Specification | Anti-Hallucination: Source Validation and Removal | Anti-Hallucination-Source-Validation-and-Removal.md |
| 2025-12-26 | Specification | Vision for Production-Grade MemoPop Monorepo | Vision-for-Production-Grade-Memopop-Monorepo.md |
| 2026-01-27 | Specification | PDF Parser Agent Specification | PDF-Parser-Agent-Spec.md |
| 2026-03-09 | Architecture | Introducing a Diagram Generator Agent | Introducing-a-Diagram-Generator-Agent.md |
| 2026-03-10 | Specification | Introducing a Competitive Landscape Research and Evaluation System | Introducing-a-Competitive-Landscape-Research-and-Evaluation-System.md |
| 2026-03-10 | Specification | Introducing a Content Density Mode System | Introducing-a-Content-Density-Mode-System.md |
| 2026-03-10 | Specification | Introducing a Legal Doc Comparator | Introducing-a-Legal-Doc-Comparator.md |
| 2026-03-10 | Specification | Introducing a Table Generator Agent | Introducing-a-Table-Generator-Agent.md |
| 2026-03-10 | Specification | Introducing an Augment Research Writer Agent | Introducing-an-Augment-Research-Writer-Agent.md |
| 2026-03-10 | Specification | Introducing an Enrich Visualizations Agent | Introducing-an-Enrich-with-Visualizations-Search-Agent.md |
| 2026-03-13 | Specification | Introducing a KPI Extractor Agent | Introducing-a-KPI-Extractor-Agent.md |
issue-resolution/Resume-Workflow-After-Interruption.md| 2025-11-27 | Getting AI to Refocus When Web Research is Empty | issue-resolution/Getting-AI-to-Refocus-when-Web-Research-is-empty.md |
| 2025-12-05 | Deck Data Flow Gap Causes Hallucination | issue-resolution/Deck-Data-Flow-Gap-Causes-Hallucination.md |
| 2025-12-15 | Correct Citation Pipeline Accuracy in Multi-Agent Research | issue-resolution/Correct-Citation-Pipeline-Accuracy-in-Multi-Agent-Research.md |