---
name: quarterly-report-check
description: Checks a fund's quarterly LP report (PDF) against the underlying financial model (Excel) to catch inconsistencies before the report goes out, covering NAV, balance sheet, portfolio valuations, fund KPIs, and cashflows.
---

# Quarterly Report Check

## What this skill does

Given a fund's quarterly PDF report and the Excel workbook it was built from, verify that every reportable figure in the PDF actually reconciles to the Excel. This is a reconciliation task, not a plausibility check. Every number either ties out exactly (within rounding) or it doesn't. Do not eyeball whether numbers "look reasonable"; trace each one back to its source cell.

Treat this as two separate outputs:
1. **Inconsistencies**: a number in the PDF does not match its source in the Excel.
2. **Data quality flags**: the Excel itself has a problem (leftover template content, formula errors, placeholder rows, mislabeled dates) that doesn't necessarily produce a wrong number in the PDF today, but is a risk if left in.

Never conflate the two. A data quality flag is not evidence of a misstatement. Say so explicitly when reporting it.

## Inputs required

- One PDF: the quarterly report as it was/will be sent to LPs.
- One Excel: the underlying fund model. Assume it has multiple sheets and that sheet names, layout, and column order will differ from fund to fund and quarter to quarter. Never assume a fixed sheet name or cell address.

If either file is missing, or the PDF is not a fund quarterly report, or the Excel is not the corresponding model, stop and say so rather than guessing.

The Excel file is provided as an actual `.xlsx` in your code execution environment, not as text extracted ahead of time. Open it yourself (e.g. with `openpyxl` or `pandas`, using `data_only=True` / cached values so formulas resolve to their computed results rather than formula strings) and read cell values directly. Don't guess at a sheet's contents from its name; load it and inspect the actual rows. This also lets you compute your own checks (e.g. does a "Total" row actually sum its rows) instead of trusting labels.

**Work in a small number of large code executions, not many small ones.** Each tool call has real latency, and this file can have dozens of sheets and hundreds of rows (e.g. a capital account table broken out by LP, or a 25+ company portfolio). Do not loop by issuing one code execution per company, per LP, or per sheet. Instead: load every sheet you need into memory in one script, compute the full reconciliation (all companies, all LPs, all line items) in that same script, and print a compact summary of just the mismatches, not a full dump of the raw data. Aim for roughly one code execution per major section in step 3 below (balance sheet, P&L, fees, capital accounts, portfolio summary, fund KPIs, cashflow), not one per row.

## Method

### 1. Extract everything reportable from the PDF

Read every page. Build a list of every numeric claim the PDF makes, with its page/section reference, for example:
- Fund level summary figures (commitments, called capital, NAV, invested capital, TVPI/MOIC/IRR/DPI/RVPI/PICC, number of portfolio companies)
- Statement of Financial Position (balance sheet): every line, both the current and prior comparison period
- Statement of Comprehensive Income (P&L): every line, both periods
- Fees and carried interest: every line
- Capital accounts: per LP if the report breaks it out (ownership %, commitment, contributions, distributions, fees, capital account at cost and fair value), plus the total row
- Cashflow schedule: every capital call / distribution entry and the resulting NAV
- Portfolio summary table, per company: investment, fair value, gross multiple, gross IRR
- Individual portfolio company pages: investment amount, stake fair value, ownership %, initial pre-money valuation, latest post-money valuation, gross multiple, gross IRR

### 2. Map the Excel workbook: don't assume sheet names

List every sheet. For each PDF section above, find the matching sheet by reading its title/header row and column headers, not by guessing a name. A balance sheet tab might be called "Balance Sheet," "Statement of Financial Position," "SOFP," or something specific to the fund. Match on content (row 1 title, "ASSETS"/"LIABILITIES"/"EQUITY" labels), not on the tab name.

Where a workbook has both a "raw input" sheet (e.g. a cap table or a sheet with one row per round) and a "summary/output" sheet that rolls it up, reconcile the PDF against the summary/output sheet. That's what actually feeds the report. Still scan the raw input sheet per step 4.

### 3. Reconcile section by section

For each PDF figure identified in step 1, find its source cell(s) in the Excel and compare. Reconcile at minimum:

- **NAV**: must be identical across the fund summary, the balance sheet total, the capital accounts total, and the cashflow schedule's ending value. If any of these four disagree with each other *within the Excel itself*, that's a finding even before comparing to the PDF.
- **Balance sheet**: every line, both periods.
- **P&L / Statement of Comprehensive Income**: every line, both periods.
- **Fees and carried interest**: every line.
- **Capital accounts**: every LP row if the PDF discloses them, and always the total row. Confirm the total row sums the individual rows correctly in the Excel (don't just trust a "Total" label).
- **Cashflow schedule**: every entry and the running/ending NAV.
- **Portfolio company data**: for every company in the PDF's portfolio summary table and individual profile pages, investment, fair value, ownership %, gross multiple, gross IRR. Confirm the subtotal/total row sums correctly.
- **Fund level KPIs**: MOIC, TVPI, RVPI, DPI, PICC, gross IRR, net IRR, number of portfolio companies.

Numbers in the PDF are normally rounded (e.g. to one decimal in €m, or to one decimal in %, or to 1 decimal multiple "x"). Treat an Excel value as matching if it rounds to the PDF's displayed precision, don't flag rounding as an inconsistency. Do flag it if the Excel value would round differently than what's shown.

### 4. Flag data quality issues in the Excel, independent of the PDF

While working through the workbook, note anything that suggests the file is not fully finished or not fully trustworthy as a source of truth, even if it doesn't currently cause a wrong number in the PDF:

- Leftover template/placeholder content (fake company/fund names, boilerplate values that clearly don't belong to this fund)
- Preparer notes or instructions left in cells/comments (e.g. "use last quarter's values here," "TBD") that were meant to be resolved before finalizing
- A date field that doesn't match its own column label (e.g. a "2025" column whose date cell reads a 2024 date)
- Formula errors (`#DIV/0!`, `#REF!`, `#N/A`, etc.) anywhere in the workbook, even in cells that don't currently feed the PDF
- Placeholder dates (e.g. `01/01/1900` or `01/01/1990`) or placeholder text (e.g. "tbd") in rows that should have real data
- Rows that look duplicated: same investment amount, valuation, and date under two different company names, which usually means a row that was copied and pasted but never renamed or removed

Report these separately from inconsistencies, with a short note on why each is worth fixing (e.g. "if this raw row ever gets pulled into the summary sheet unedited, it will misstate two companies' figures").

### 5. Output format

Structure the response as:

1. **Verdict**, one line: does the PDF reconcile to the Excel, yes/no/partially.
2. **Section by section reconciliation**: for each section in step 3, state match or mismatch. Keep matches brief; don't print every matching number again.
3. **Inconsistencies found**: only real mismatches between the PDF and the Excel, ranked most material first. For each: the PDF's stated value, the Excel's actual value, where each came from (page/section, sheet/cell or row label), and the size of the variance.
4. **Data quality flags**: from step 4, clearly labeled as workbook hygiene issues, not misstatements.

If there are no inconsistencies, say so plainly and don't manufacture findings. A clean reconciliation is a valid and useful result.

## Requirements

- One Excel file (the fund model)
- One PDF file (the quarterly report)
