ITD Distribution Report (Claude Skill)
Last updated: July 6, 2026
This Claude Skill teaches Claude to build an inception-to-date distribution report at LP, fund, or firm level: distributed (with recallable), called, DPI, and dated history, pulled live (read-only) from your Hanover Park account.
How to set it up (one time)
Download the attached file just above.
In Claude, go to Settings > Capabilities > Skills and upload the file.
Done. There is nothing to configure.
How to use it
Just ask Claude, for example:
"What have we returned to investors?"
"What have we distributed to [LP]?"
"ITD distributions for [fund] as an Excel"
What's inside the skill (reference only)
You don't need to read anything below to use the skill. It's the full instruction set packaged in the attached file, shown here for reference.
ITD Distribution Report
Produce an accurate inception-to-date distribution breakdown from live Hanover Park platform data, at one of three scopes: a single LP (their distributions across every fund they're in), a single fund (its distributions to all partners), or the whole firm (every vehicle). The audience is fund CFOs, GPs, and the fund accountants supporting them — often answering "what have we returned to investors?" for an LP meeting or annual review. Accuracy beats volume: every number must come from a tool response, never an estimate.
Workflow
1. Resolve the firm and scope
Call get_user_context once (no arguments). Clients see a single firm — use it. If the account has several firms, match the firm the user named; if they named only a fund or LP, ask which firm before pulling anything.
Determine scope from the request:
LP scope — a named investor ("what have we distributed to [LP 1]?")
Fund scope — a named fund ("[Fund 1] distributions")
Firm scope — no name, or "across the firm / all funds"
If a name could be either an investor or a vehicle, ask rather than guess. When a user says "fund" they mean a vehicle.
2. Ask the format (one question)
Ask which format they want — AskUserQuestion if available, otherwise plain text: Excel workbook, PDF, HTML, or chat table. Skip if they already said (e.g. "as an excel"). In a non-interactive context, default to the chat table, say so, and offer the file formats at the end.
If the user gave a cutoff ("through 2024", "as of 3/31"), treat it as the history end date — see the historical-cutoff note in step 3.
3. Pull the data
All calls use the firmId from step 1. Distribution figures include all partner types (LPs, GP, affiliates) unless the user asks for LP-only — then pass partnerTypes: ["limited_partner"] and label the report accordingly.
Firm scope
get_capital_activitywith no vehicle or investor filters (limit: 1 is fine — the summary is pre-pagination): summary.byVehicle is the per-vehicle ITD source of truth (totalDistributed, totalRecallableDistributed, totalCalled, netDistributed); summary.byDirection gives the firm-wide split. Never sum paginated rows yourself.get_user_contextwith the firmId → vehicle types, to group the table into Funds / Management companies / GP entities & SPVs.get_fund_performancewith the fund vehicleIds → fund-level dpi per fund (ManCos/SPVs typically have none — show "n/a").
Fund scope
get_capital_activitywith the fund in vehicleNames → the fund's ITD totals from summary, and paginate the action rows to collect the dated distribution history: keep every row with distributedAmount > 0 (this catches net call-distributions, which are classified by net cash but still carry a distributed amount).get_fund_performancefor the fund's DPI.
LP scope
get_investor(name or id) → per-fund capitalDistributed, capitalDistributedRecallable, capitalCalled — these booked lifetime totals are the source of truth for the per-fund table. If the name fuzzy-matches several investors, list candidates and ask — never guess.get_capital_activitywith the investor's id, groupBy: 'investor' → the LP's dated distribution rows (their share of each event) for the history section.list_investors(directory view, search on the name) → the LP's own booked aggregate DPI for the total row.
If the dated rows don't sum to the booked totals, present the booked totals and footnote the difference — do not reconcile silently.
Historical cutoff: if the user set a date, pass endDate on the actions calls and take per-vehicle totals from that call's summary instead of booked lifetime figures; drop the DPI column (performance snapshots and booked DPI are not recomputed for arbitrary dates) and note the cutoff under the title.
4. Build the report
Structure, whatever the format:
# [Scope name] — ITD Distributions
[Firm name] · Inception through [date] · [scope qualifier, e.g. "LP: [LP 1]" or "All vehicles"]
## Distributions by vehicle
| Vehicle | ITD Distributed | of which Recallable | ITD Called | Fund DPI |
|---|---|---|---|---|
| [Fund 1] | $120,500,000 | – | $80,000,000 | 1.51x |
| [Fund 2] | $15,250,000 | – | $60,000,000 | 0.25x |
| ... |
| **Total** | **$150,000,000** | **$25,000** | **$300,000,000** | |
## Distribution history (fund and LP scope only)
| Date | Type | Amount | Recallable portion |
|---|---|---|---|
| Mar 15, 2025 | Cash distribution | $12,000,000 | – |
| ... |
Sort vehicles by ITD Distributed, largest first. Firm scope: group into Funds, then Management companies, then GP entities & SPVs, each with a subtotal row, then a firm total. Include zero-distribution vehicles (shown with "–") — a fund that has returned nothing is itself a finding.
Currency in whole dollars with thousands separators; "–" (not $0 or blank) for zero/unavailable, matching the app. DPI to 2 decimals with "x"; "n/a" where no performance snapshot exists.
Total rows: sum the money columns only. DPI is never summed or averaged — leave it blank, except LP scope where the total row may show the LP's own booked DPI from the directory (footnote: "LP's aggregate DPI across their funds, as booked on the platform").
Fund DPI comes only from
get_fund_performance(or the directory's booked DPI for the LP aggregate) — never compute it from the cashflows in this report, even though the columns invite it. If the performance snapshot's as-of date differs materially from today, footnote it.History rows: dueDate formatted "Dec 30, 2024"; humanize actionType ("cash-distribution" → "Cash distribution"); a net call-distribution row shows its distributed amount with type "Distribution (net of call)". LP scope adds a Vehicle column when the LP is in more than one fund.
Footnote recallable if any vehicle's recallable is nonzero: "includes $X recallable (may be called again)".
Close with 2-3 sentences of orientation (largest distributor, concentration, anything notable like recallable balances) — no padding.
5. Deliver in the chosen format
Chat table — exactly the structure above.
Excel — build with the xlsx skill, style with the excel-formatting skill (report recipe: title block, the same tables, bold subtotal/total rows, currency formats). One sheet for the by-vehicle table, a second for history when present.
PDF — use the pdf skill; clean professional layout, tables as above, title block with firm and date. Apply the firm's design skill if the user wants it branded.
HTML — one self-contained file, same content, styled tables, no external dependencies.
Name files <Scope> - ITD Distributions - <YYYY-MM-DD>.xlsx/.pdf/.html (scope = investor, fund, or firm name) and save to the user's folder. After delivering, offer the natural follow-up: the other formats, an LP-only cut, or a historical cutoff.
Accuracy rules
Report tool figures verbatim (rounding for display only). If a tool returns no data or omits a figure, say so plainly — never approximate or fill gaps.
Per-vehicle and firm totals come from tool summaries (summary.byVehicle, byDirection, booked investor totals) — never from summing paginated rows, which may be partial.
Actions are classified call vs distribution by net cash settlement; trust the summary's classification and totals.
Keep every call scoped to one firm. Cross-firm requests: run the whole workflow once per firm, separate reports — never merge firms into one total.
If the "LP" is actually the GP or an affiliate (investorType), still produce the report but flag it — GP distributions include carried interest and are not comparable to an LP's.
Never show internal IDs, slugs, tool names, or field names to the user.