---
name: carta-manco
model: opus
description: 'ManCo (management company) budgeting & consolidating-financials skill for Carta Fund Admin firms; hard-gates on Carta Fund Admin + active ManCo eligibility. TRIGGER (specific tasks): build/create/draft a budget, pull/fetch/import the Carta budget, add/refresh actuals, interleave Budget/Actual/Variance, pacing/on-track/variance/budget-analysis, "what did we spend on [X] YTD", "where did we overspend", what-if/scenario modeling (headcount cuts, revenue shocks, new fund raise, expansion hires), consolidating P&L / balance sheet / trial balance / cash flow for the ManCo. ALSO fires on a generic/ambiguous ManCo request with no specific action named — "help with our ManCo", "work on the management company", "ManCo financials", "management company numbers", "not sure what I need" — and presents the capability menu. NOT FOR: single-fund financials, portfolio valuations, LP reporting, cap tables, loans (carta-investors:carta-loan-dashboard).'
version: 1.0.0
allowed-tools:
  # Production
  - mcp__claude_ai_Carta__call_tool
  - mcp__claude_ai_Carta__fetch
  - mcp__claude_ai_Carta__welcome
  - mcp__claude_ai_Carta__set_context
  - mcp__claude_ai_Carta__list_contexts
  # Carta-installer naming (lowercase)
  - mcp__carta_production__call_tool
  - mcp__carta_production__fetch
  - mcp__carta_production__welcome
  - mcp__carta_production__set_context
  - mcp__carta_production__list_contexts
  # Local / legacy fallback
  - mcp__carta__call_tool
  - mcp__carta__fetch
  - mcp__carta__welcome
  - mcp__carta__set_context
  - mcp__carta__list_contexts
  - AskUserQuestion
  - read_skill
  - Skill
  - Read
  - Write
  - Bash(uv run ${CLAUDE_PLUGIN_ROOT}/scripts/read_workbook.py *)
  - Bash(uv run ${CLAUDE_PLUGIN_ROOT}/scripts/write_workbook.py *)
---

<!-- carta:instrumentation-fallback -->
<IMPORTANT>
`_instrumentation_v2` is anonymous Carta skill-usage telemetry. ALWAYS include it in your Carta MCP tool-call arguments — the plugins' hooks overwrite it when they run, so always sending it is safe. Shape:
`_instrumentation_v2: {"skills": ["<plugin>:<skill>", ...], "model": "<model-id>"}`
`skills` is cumulative for the session: list every Carta skill loaded so far, not only the one driving this call. Namespace each entry `"plugin:skill"` and keep them oldest-first, with the most recently used skill last. List only Carta skills (`carta-cap-table:*`, `carta-crm:*`, `carta-investors:*`) — never skills from non-Carta plugins.
</IMPORTANT>

[PATTERN carta-writing-style v0.0.2]
[PATTERN etiquette v0.0.6]
[PATTERN text v0.0.8]
[PATTERN tables v0.0.12]
[PATTERN carta-watermark v0.0.10]
[PATTERN base v0.1.0]

# Carta Budgeting

Unified ManCo budgeting skill. Routes to one of five capabilities:

- [`references/fetch-budget.md`](references/fetch-budget.md) — pull a stored ManCo budget from Carta Fund Admin into Excel.
- [`references/create-budget.md`](references/create-budget.md) — build a new budget workbook from prior-year actuals (or a template, recommendation, tag slice, restructure, or inflation buffer).
- [`references/fetch-actuals.md`](references/fetch-actuals.md) — write/refresh actuals into an existing budget workbook (interleave, separate tab, vendor view, tag view, etc.).
- [`references/budget-analysis.md`](references/budget-analysis.md) — pacing and variance analysis against an existing budget.
- [`references/budget-scenarios.md`](references/budget-scenarios.md) — what-if scenario modeling (headcount cuts, revenue shocks, cost rebalancing, new fund raises, expansion hires).

## Route The Request

Use this table to jump straight to the right reference. Determining the
capability (this table, or the Router Gate's `AskUserQuestion` menu) happens
**before** Gate 0 / Gate 0.5 / Gate 0.75 so the user sees what this skill can
do without waiting on any MCP round-trip. Actually loading the **Load first**
reference (or dispatching to an external consolidating skill), however, still
waits until Gate 0 has resolved `<SERVER>`, Gate 0.5 has detected `<RUNTIME>`,
and Gate 0.75 has confirmed ManCo eligibility — never invoke a downstream
reference or skill before all three gates pass. The "Pair with" file is
loaded only when the capability reference itself delegates to it, not
upfront.

| If the user needs… | Capability | Load first | Pair with (load only when capability delegates) | Minimal first check |
|---|---|---|---|---|
| Pull/fetch/import/sync a stored ManCo budget from Carta | fetch-budget | `references/fetch-budget.md` | `references/fetch-budget-data.md` | Carta MCP connected + firm resolved |
| Build/create/draft a new budget for a future year | create-budget | `references/create-budget.md` | `references/from-prior-actuals.md` (default) or `references/from-template.md` | Prior-year actuals accessible in Carta, or template file path provided |
| Add/refresh actuals into an existing budget workbook | fetch-actuals | `references/fetch-actuals.md` | `references/get-actuals.md` | Existing budget workbook open or path supplied |
| Pacing, variance, "how are we doing", "on track", compare budget vs actuals | budget-analysis | `references/budget-analysis.md` | `references/pacing-overview.md` | Both budget columns and actuals columns present in the workbook |
| What-if scenario: headcount cuts, revenue shocks, new fund raises, expansion hires | budget-scenarios | `references/budget-scenarios.md` | Scenario-specific sub-reference (see Router Gate table) | Budget baseline available in workbook |

If the user's prompt matches multiple rows or is ambiguous, fall through to the Router Gate — that section carries the AskUserQuestion disambiguation menu.

---

## Customer Intent Framework

Use this as the semantic layer when the Router Gate's phrase table doesn't
produce an exact match — before falling back to the welcome screen +
`AskUserQuestion` menu.

| What the customer is trying to do | Typical phrasing | Route |
|---|---|---|
| Get the budget that's already stored in Carta into a workbook | "bring in our budget", "load the ManCo numbers", "I need the budget in front of me" | fetch-budget |
| Stand up a budget that doesn't exist in a workbook yet | "we don't have a budget for next year yet", "start our 2027 plan", "set up the budget from scratch" | create-budget |
| Get real spend data layered onto an existing budget | "fill in what we actually spent", "update this with real numbers", "true up the budget" | fetch-actuals |
| Find out whether spend is on track without saying "pacing" or "variance" | "are we overspending", "how's the year looking so far", "did we blow past budget on legal" | budget-analysis |
| Explore a hypothetical change to the plan | "what happens if we don't hire", "can we afford a new fund raise", "model cutting costs" | budget-scenarios |
| See firm-wide profitability across entities | "how's the ManCo doing overall", "our total income and expenses", "firm-wide earnings" | consolidating-pnl (external) |
| See firm-wide assets/liabilities across entities | "what's the ManCo's financial position", "firm-wide assets and liabilities" | consolidating-balance-sheet (external) |
| See account-level detail across entities | "give me every account balance across the firm" | consolidating-trial-balance (external) |
| Understand where cash moved across entities | "where did our cash go", "sources and uses across the firm" | consolidating-cash-flow (external) |

---

## UX Rules

Audience is an accountant in Excel. Plain English only. Never surface MCP
identifiers, DWH column names (`ACCOUNT_TYPE`, `EFFECTIVE_DATE`), UUIDs,
raw JSON, SQL, or gate labels.

- **Currency formatting:** positive `$X,XXX`, negatives `($X,XXX)`, totals bolded — use the resolved currency symbol, never a bare `$`. Derive from the data, never default to USD.
- **Difference values are absolute** — e.g. `$0` for a match, `$2,000` for a gap.
- **Status vocabulary:** ✅ Match | ⚠ Mismatch ($X diff) | ❌ Missing in Carta | ❌ Missing in Client Doc.
- **Closing summary link** is a workbook citation (`<citation:Sheet!Range>`) in Claude for Excel mode, and a `file://` path in Claude Code / Cowork mode. Never both.
- **Every numbered choice in this skill — including all next-step menus — MUST be presented via `AskUserQuestion`.** Never render options as a bare code-fenced markdown list. Bare-text menus break the chooser UI in Claude for Excel and force the user to type the number.

## Execution discipline

**The Router Gate runs first, before any MCP tool call.** If the prompt is
generic/ambiguous, the welcome screen + `AskUserQuestion` menu is the very
first thing you emit — the user sees what this skill can do while Gate 0,
Gate 0.5, and Gate 0.75 haven't even started. If the prompt names a specific
capability, determine `<CAPABILITY>` silently from the routing table (no
welcome screen, no question) and move straight to Gate 0.

**Once `<CAPABILITY>` is set, Gate 0, Gate 0.5, and Gate 0.75 execute
silently.** Do not narrate tool calls, intermediate results, or status
updates. Once eligibility is confirmed, dispatch and let the capability's own
gates (from its reference file, or the external skill it hands off to) drive
the rest — do not re-implement or pre-run its logic here.

**Forbidden narration — output nothing between tool calls.** The only permitted text outputs in this skill are:
1. The Router Gate welcome screen + `AskUserQuestion` menu — only when the prompt is generic/ambiguous, and only before Gate 0 begins.
2. Firm disambiguation via `AskUserQuestion` — only when multiple firms match (during Gate 0).
3. Gate 0.5 runtime question via `AskUserQuestion` — only when runtime is genuinely ambiguous.
4. The verbatim eligibility messages (No ManCo, No Fund Admin, Try again) — exactly as written, no additions (during Gate 0.75).

Everything else is forbidden between the moment `<CAPABILITY>` is determined and the moment eligibility is confirmed. During Gate 0, Gate 0.5, and Gate 0.75, produce **zero text output** beyond the exceptions above — make tool calls only, with no text before, between, or after them. Specific examples of forbidden output:
- "Now I have the Carta MCP tools. Proceeding with Gate 0/0.75." or any similar progress announcement.
- "Server prefix is `<X>`", "Found server `<X>`", or any statement about the resolved prefix.
- "Now checking…", "Now running…", "Now calling…", or any sentence describing an imminent tool call.
- "Context set to…", "Eligibility check complete…", or any summary of a tool result.
- "No skipping the gate result…", "I have it and must respond now.", or any internal reasoning surfaced to the user.
- Any explanation of internal tool failures — never surface `context_snip` errors, compression notes, or other internal mechanics.
- Any preamble or postamble added to the verbatim eligibility messages.

---

## Entry mode — fresh session vs. chained skill

Check whether these context variables are already set from an earlier
budgeting skill call in the same session:

- `<SERVER>` — connected Carta MCP server prefix
- `<ENTITY_NAME>` and `<ENTITY_UUID>` — the resolved entity
- `<RUNTIME>` — `excel-addin` or `local-file`
- `<HAS_MANCO>` — whether `fa:get:manco_eligibility` confirmed active Fund Admin + an active ManCo this session
- `<CAPABILITY>` — previously routed capability (if re-entering from a next-step menu)

**Step order is always: Router Gate → Gate 0 → Gate 0.5 → Gate 0.75 → dispatch.**

**If `<CAPABILITY>` is already set:** skip the Router Gate entirely — the user
already picked (or named) a capability in this session. Go straight to the
Gate 0 check below.

**If `<CAPABILITY>` is not set:** run the Router Gate first — before any MCP
tool call — to determine it (specific-prompt match, or the welcome screen +
`AskUserQuestion` menu for a generic/ambiguous prompt).

**Once `<CAPABILITY>` is known:** if `<SERVER>`, `<ENTITY_NAME>`,
`<ENTITY_UUID>`, and `<RUNTIME>` are all already set, skip Gate 0 and Gate 0.5
and proceed directly to Gate 0.75. Otherwise run Gate 0 and Gate 0.5 first.

**Gate 0.75 always runs** — `fa:get:manco_eligibility` is never skipped, even when `<HAS_MANCO>` is already known. The call is fast and cached, and its `_instrumentation` records the skill invocation.

**If `<HAS_MANCO>` is true after Gate 0.75:** dispatch to `<CAPABILITY>` directly — the Router Gate already ran, so there is no menu left to show.

---

## Router Gate — Determine the right capability

**STOP rows — handle before routing:** check these first, before attempting
any capability match below. A match here means the request is out of scope
for this skill entirely — redirect and stop; do not proceed to Gate 0.

| Message signals | Action |
|---|---|
| "loan dashboard", "loan portfolio", "draw balance", "loan overview" | **Stop.** Loans are a separate domain. Tell the user: "Loans live in a separate skill — try `carta-investors:carta-loan-dashboard` or `carta-investors:carta-loan-overview` directly." |
| "Fund Forecasting", "Tactyc", "forecasting metrics" | **Stop.** Fund Forecasting is a separate domain from Fund Admin ManCo budgeting. Tell the user: "Fund Forecasting / Tactyc metrics are handled by a different skill — try `carta-investors:carta-fund-forecasting`." |
| "single-fund financials", "this fund's financials", "portfolio valuations", "fund marks", "portfolio company valuation" | **Stop.** Single-fund and portfolio-level financials/valuations are out of scope for ManCo budgeting. Tell the user: "That's single-fund/portfolio territory, not the ManCo — try Carta's portfolio valuations tools." |
| "LP reporting", "LP documents", "K-1", "capital call notice", "distribution notice", "AGM deck", "tear sheet" | **Stop.** LP reporting is a separate domain. Tell the user: "LP documents and reporting live in a separate skill set — try `carta-investors:carta-lp-reporting-routing`." |
| "cap table", "equity grants", "409A", "option pool" | **Stop.** Cap table administration is out of scope for ManCo budgeting. Tell the user: "Cap table and equity administration live in Carta's cap table tools, not here." |

If none of the rows above match, continue below to determine the capability.

Infer the capability from the user's prompt. **Do not ask the user to name a
capability by its technical name.** Two paths only:

- **Specific prompt** — it matches a row in the table below. Set
  `<CAPABILITY>` to that reference/skill immediately — do **not** dispatch
  yet, and do **not** emit the welcome screen or call `AskUserQuestion` — the
  user already named the task. Proceed straight to Gate 0.
- **Generic / ambiguous prompt** — it matches no row, or the skill was invoked
  with no specific task (e.g. "help with our ManCo", "ManCo financials").
  Fall through to the Customer Intent Framework below before giving up and
  showing the welcome screen and `AskUserQuestion` menu.

**Route rows — classify and proceed to Gate 0:**

| Phrase in the prompt | Capability | Reference to load |
|---|---|---|
| "pull / fetch / import / sync Carta budget", "bring Carta's budget into this sheet", "pull the Carta budget for [ManCo]" | fetch-budget | `read_skill(file_path="references/fetch-budget.md")` |
| "build / create / draft / generate a budget for [year]", "build a budget for next year", "from last year's actuals", "from prior actuals", "add a 5% inflation buffer", "group / categorize budget line items" | create-budget | `read_skill(file_path="references/create-budget.md")` |
| "pull / fetch / get / refresh / sync actuals for [firm/ManCo]", "what did we spend on [category] YTD", "interleave Budget/Actual/Variance", "actuals by department/tag/vendor", "add next month column", "extend budget through [month]" | fetch-actuals | `read_skill(file_path="references/fetch-actuals.md")` |
| "how are we doing", "pacing", "on track", "how are we pacing against budget", "variance analysis", "compare budget vs actuals", "budget vs actuals for [firm]", "are we over on [X]", "where did we overspend or underspend", "drill into [X]" | budget-analysis | `read_skill(file_path="references/budget-analysis.md")` |
| "what if we cut headcount", "model a revenue shortfall", "preserve $X cash", "raise a new fund", "model hiring N FTEs", "what-if", "scenario", "build me a scenario model" | budget-scenarios | `read_skill(file_path="references/budget-scenarios.md")` |
| "consolidating P&L", "consolidated income statement", "ManCo P&L", "pull our ManCo P&L", "consolidating P&L across all entities" | consolidating-pnl (external) | `Skill("carta-investors:carta-consolidating-pnl")` |
| "consolidating balance sheet", "consolidated BS" | consolidating-balance-sheet (external) | `Skill("carta-investors:carta-consolidating-balance-sheet")` |
| "consolidating trial balance", "show me the trial balance", "TB" | consolidating-trial-balance (external) | `Skill("carta-investors:carta-consolidating-trial-balance")` |
| "consolidating cash flow", "cash flow statement for the ManCo" | consolidating-cash-flow (external) | `Skill("fa-manco:carta-consolidating-cash-flow")` |

**If ambiguous** (prompt matches no row, or skill was invoked with no specific task), emit a welcome screen first, then ask via `AskUserQuestion`.

**Welcome screen** — output before calling `AskUserQuestion`, and before any
Gate 0 tool call. **Format rule:** put each capability on its OWN line as a
markdown bullet (`- `). Do NOT merge them into one paragraph — a blockquote
with the items run together renders as an unreadable wall of text in Claude
for Excel.

> **Connected to [ENTITY_NAME] via Carta Fund Admin.** *(Only use this line if `<ENTITY_NAME>` is already known from a prior chained call this session — e.g. a downstream skill's "back to budgeting menu" option. On a fresh invocation the firm hasn't been resolved yet, so use "Ready to help with your ManCo budget." instead.)*

Here's what I can help you with:

- **Fetch budget from Carta** — Pull the ManCo budget stored in Carta into this workbook.
- **Build a new budget** — Draft next year's budget from prior-year actuals, a template, recommendations, or a tag/department slice.
- **Add / refresh actuals** — Write YTD actuals into an existing budget (interleaved columns, separate tab, vendor view, tag view).
- **Analyze pacing & variance** — Compare actuals to budget, assess on-track status, drill into over/under lines.
- **Model a what-if scenario** — Simulate headcount cuts, revenue shocks, new fund raises, or expansion hires.
- **Consolidating financials** — Firm-wide P&L, balance sheet, trial balance, or cash flow.

**Format rule for `AskUserQuestion`:** pass each `question`, `label`, and `description` as **plain text** — no markdown (`**bold**`, backticks), no emoji, no line breaks. The chooser renders the string verbatim, so any markup shows as literal characters. The `**…**` in the tables below is doc formatting only; strip it when you pass the value.

**`AskUserQuestion` renders at most 4 options per question** (any beyond the fourth are silently dropped by the client — a hard runtime cap in Claude for Excel, not a display setting). The nine capabilities therefore CANNOT be listed in one question. Use a **two-step grouped menu** — a category question, then a drill-down only for the categories that map to more than one capability.

**Step 1 — category** (one `AskUserQuestion`, 4 options):

> What would you like to do with your budget?

| # | Label | Description | Routes to |
|---|---|---|---|
| 1 | **Work with the budget itself** | Pull the ManCo budget from Carta, or build a new one. | drill-down A |
| 2 | **Actuals & variance** | Write/refresh actuals into a budget, or analyze pacing vs budget. | drill-down B |
| 3 | **Model a what-if scenario** | Headcount cuts, revenue shocks, new fund raises, or expansion hires. | `budget-scenarios` (no drill-down) |
| 4 | **Consolidating financials** | Firm-wide P&L, balance sheet, trial balance, or cash flow across all entities. | drill-down C |

**Step 2 — drill-down** (a second `AskUserQuestion`, ≤4 options; skip entirely for category 3):

- **Drill-down A — budget itself:**
  | # | Label | `<CAPABILITY>` | Load |
  |---|---|---|---|
  | 1 | **Fetch the ManCo budget from Carta** | fetch-budget | `read_skill(file_path="references/fetch-budget.md")` |
  | 2 | **Build a new budget from prior-year actuals** | create-budget | `read_skill(file_path="references/create-budget.md")` |
- **Drill-down B — actuals & variance:**
  | # | Label | `<CAPABILITY>` | Load |
  |---|---|---|---|
  | 1 | **Add / refresh actuals on an existing budget** | fetch-actuals | `read_skill(file_path="references/fetch-actuals.md")` |
  | 2 | **Analyze pacing and variance (budget vs actuals)** | budget-analysis | `read_skill(file_path="references/budget-analysis.md")` |
- **Drill-down C — consolidating financials:**
  | # | Label | Dispatch to |
  |---|---|---|
  | 1 | **Consolidating P&L** | `Skill("carta-investors:carta-consolidating-pnl")` |
  | 2 | **Consolidating balance sheet** | `Skill("carta-investors:carta-consolidating-balance-sheet")` |
  | 3 | **Consolidating trial balance** | `Skill("carta-investors:carta-consolidating-trial-balance")` |
  | 4 | **Consolidating cash flow** | `Skill("fa-manco:carta-consolidating-cash-flow")` |

> **Never add a fifth option to any single `AskUserQuestion` call** — split into
> another grouped question instead. A flat 5+ option menu loses every option past
> the fourth.

Store `<CAPABILITY>` from the final chosen option, then proceed to Gate 0 (or
straight to Gate 0.5 / Gate 0.75 if `<SERVER>`/`<ENTITY_NAME>`/`<ENTITY_UUID>`/
`<RUNTIME>` are already resolved from a prior chained call). **Do not load the
reference or invoke the external skill yet** — dispatch only happens after
Gate 0.75 confirms eligibility (see the Dispatch step at the end of Gate
0.75).

---

## Gate 0 — Carta MCP environment + resolve firm

Scan the tools available in the conversation for any matching `mcp__*__welcome`. Extract the **server identifier** — the middle segment between the first and last `__`. Examples: `mcp__carta__welcome` → `carta`, `mcp__claude_ai_Carta__welcome` → `claude_ai_Carta`.

**If none found:** tell the user no Carta MCP is connected and stop.
**If exactly one found:** call `mcp__<SERVER>__welcome(_instrumentation={"plugin": "carta-investors", "skills": ["carta-manco"]})` to verify. This is `<SERVER>`.
**If multiple found:** ask the user which to use via `AskUserQuestion`. Default to `carta` (production) if present.
**Don't call any other `mcp__<SERVER>__*` tool before `welcome`** — every other command is gated and will return a reminder.

**Resolve firm:** if user named one → `mcp__<SERVER>__list_contexts(firm_name="<entity>", _instrumentation={"plugin": "carta-investors", "skills": ["carta-manco"]})` → disambiguate via `AskUserQuestion` if multiple → `mcp__<SERVER>__set_context(firm_id=<FIRM_UUID>, _instrumentation={"plugin": "carta-investors", "skills": ["carta-manco"]})`. Do not use `call_tool` for `list_contexts` or `set_context` — call the granular tools directly with `_instrumentation` as shown.

**DWH param-name traps:** `dwh:execute:query` takes `sql:` not `query:`. `dwh:get:table_schema` takes `table_name:` not `table:`. `format` accepts `"ndjson"` / `"markdown"`, not `"csv"`.

**DWH result formatting:** queries > 50 rows: request `format: "ndjson"`, bucket into a blob. Don't paste large results — triggers `context_snip`. Use `"markdown"` only for ≤50-row previews.

If no firm was named, defer to the capability's own parameter gate.

**Never BM25-search for Carta MCP tools at any point in this skill.** Derive `<SERVER>` from the server name as shown in step 2. After that, the five suffixes `welcome`, `set_context`, `list_contexts`, `call_tool`, `fetch` are exhaustive for every Carta MCP server regardless of environment. Call `mcp__<SERVER>__<suffix>` directly — these tools exist on every Carta server; you do not need to verify their existence before calling them. Do not run `tool_search_tool_bm25` under any circumstances — not to discover the prefix, not to find `fetch`, not for anything.

---

## Gate 0.5 — Detect runtime

Set `<RUNTIME>`:
- **`excel-addin`** — references to "this workbook" / "the open spreadsheet" / open tab without a file path.
- **`local-file`** — user supplied a file path (`~/Downloads/Budget.xlsx`) or asked to "create a new file" / "write to disk".
- If unclear, ask via `AskUserQuestion`: *"Are you working in Excel via Claude for Excel, or with a local .xlsx file (Claude Code / Cowork)?"*

---

## Gate 0.75 — ManCo eligibility (HARD GATE)

> **STOP. This is a hard gate.** ManCo budgeting and consolidating-financials capabilities require an active Carta Fund Admin subscription AND an active management company. Verify here; do not route, load a reference file, or invoke any external skill until eligibility is confirmed.

Runs once per session after the firm is resolved (Gate 0). Call the eligibility pre-check:

```
mcp__<SERVER>__fetch(command="fa:get:manco_eligibility", _instrumentation={"plugin": "carta-investors", "skills": ["carta-manco"]})
```

This returns `{available, has_active_manco, has_fund_admin, fa_product_codes}` — a fast, cached pre-check; it replaces listing entities and inferring a ManCo from an `entity_types` filter.

| `available` | `has_fund_admin` | `has_active_manco` | Action |
|---|---|---|---|
| `false` | — | — | Enrichment not yet synced or a transient DWH outage — **not** a denial. Surface the **Try again** message below and STOP. |
| `true` | `false` | — | Surface the **No Fund Admin** message below and STOP. |
| `true` | `true` | `false` | Set `<HAS_MANCO> = false`. Surface the **No ManCo** message below and STOP. |
| `true` | `true` | `true` | Set `<HAS_MANCO> = true`. Proceed to Dispatch below. |
| Call errors / times out | | | Do NOT auto-retry. Surface the generic connection error from the shared Error-handling table and STOP. |

### Hard-gate discipline (non-negotiable)

A `false` gating result is FINAL. You get **at most one** `fa:get:manco_eligibility` probe per session. After it returns a denial, you MUST stop. Do NOT:
- re-run `fa:get:manco_eligibility` hoping the cached result changes within the same session,
- fall back to `fa:list:entities` or a DWH query to "look for a ManCo another way,"
- load a budgeting reference file or invoke an external skill "to see if it works anyway,"
- re-call `welcome` / `set_context` to re-authenticate — a fresh token does not grant a product the firm hasn't bought.

### No ManCo message (surface verbatim, no preamble)

Copy-paste the exact text below word for word — every sentence. Do not drop, reorder, or rephrase any part of it. Do not add anything before or after it.

> I don't see Management Company Administration as part of your Carta plan. That's built for firm-level operations: firm-level financial position, expense allocations across entities, and managing your operating budget.
>
> Reach out to your account team or [request a demo →](https://carta.com/demo/fund-admin/?&utm_medium=product&utm_source=claude&utm_campaign=manco-plugin-inq-ww-q3-26) to get access. I can help you pull fund-level performance, LP reporting, or capital activity in the meantime.

### No Fund Admin message (surface verbatim)

> I can't find a Carta Fund Admin firm on your account, and these ManCo features run on Fund Admin data. If your firm uses Carta Fund Admin, reconnect Carta in **Settings → Connectors**; otherwise reach out to your Carta account manager to get Fund Admin set up.

### Try again message (surface verbatim)

> I'm still syncing your account details — this can take a moment for new or recently updated accounts. Please try again shortly.

After surfacing any of these messages, do not dispatch to `<CAPABILITY>` — the
Router Gate's choice is discarded along with the session.

### Dispatch

Once `<HAS_MANCO>` is `true`, dispatch to `<CAPABILITY>`:

- **Budgeting capabilities** (`fetch-budget`, `create-budget`, `fetch-actuals`, `budget-analysis`, `budget-scenarios`): re-fire the telemetry beacon (see **Per-capability telemetry** below), then call `read_skill` for the matched reference file and follow it exactly from its Gate 1. Do not reconstruct its gates from memory.
- **Consolidating capabilities** (`consolidating-pnl`, `-balance-sheet`, `-trial-balance`, `-cash-flow`): invoke the external skill via the `Skill` tool shown in the routing table. Pass the original user message and the resolved firm context so the downstream skill can skip its own firm resolution. Do not re-implement consolidating logic here.

#### Per-capability telemetry (budgeting capabilities only, set before loading the reference)

For **budgeting capabilities**, **re-fire the telemetry beacon** so this capability's MCP calls attribute correctly. Every budgeting reference's `_instrumentation` uses `skills: ["carta-manco", "<CAPABILITY>"]` — the capability name itself (`fetch-budget`, `create-budget`, `fetch-actuals`, `budget-analysis`, or `budget-scenarios`), not a separate skill identifier.

```
mcp__<SERVER>__set_context(firm_id=<ENTITY_UUID>, _instrumentation={"plugin": "carta-investors", "skills": ["carta-manco", "<CAPABILITY>"]})
```

(Consolidating capabilities skip this — the external skill they dispatch to fires its own per-skill instrumentation.)

---

## If Something Goes Wrong (reactive, in-flow issues)

Out-of-scope topics (loans, Fund Forecasting, single-fund financials, LP
reporting, cap tables) are handled proactively by the STOP rows in the Router
Gate above — they never reach this table. This table covers issues that only
surface mid-flow, once a capability is already running.

| Situation | Response |
|---|---|
| User wants pacing AND to build the budget first | Route to `create-budget` first; `budget-analysis` follows once the budget exists. |
| `fetch-budget` returns no budget rows | ManCo was already confirmed in Gate 0.75, so this means no budget is loaded into Carta for that year yet. Offer to build one with `create-budget`. |
| `fetch-actuals` / `budget-analysis` returns zero actuals rows | ManCo confirmed in Gate 0.75 — so no activity posted for that period. Suggest a different date range. |

---

## Shared hard rules (apply across all capabilities)

- **Currency — derive from the data, never default to USD.** Resolve the workbook's presentation currency before writing; if it can't be resolved, ask the user. State the resolved currency in cell A4: `Amounts in <resolved_currency>`.
- **Currency format (locale-specific token):** USD `[$$-en-US]#,##0.00_);([$$-en-US]#,##0.00);"-"` · EUR `[$€-x-euro2]#,##0.00_);([$€-x-euro2]#,##0.00);"-"` · GBP `[$£-en-GB]#,##0.00_);([$£-en-GB]#,##0.00);"-"` · CAD `[$CA$-en-CA]#,##0.00_);([$CA$-en-CA]#,##0.00);"-"`. Never a bare `$` or `_($*` — Excel substitutes the system symbol.
- **Do not freeze panes.** Do not write a Provenance tab.
- **Two-row header for month-bucketed tables.** Row N = merged month label. Row N+1 = sub-headers spelled out in full. Never abbreviate (`B`/`A`/`V`). Never write both into the same row — subsequent merges destroy sub-headers.
- **Month-label date-serial trap:** apply `numberFormat = [["@"]]` to header ranges before writing period labels — otherwise Excel coerces "Jan 2026" → date serial.
- `range.merge(true)` discards trailing cell values. Insert a new row first.
- **Border syntax (Office.js):** `style = "Continuous"`, then `weight = "Thin"`. Never `style: "Thin"`.
- **Branding standards:** follow [`references/branding-and-header.md`](references/branding-and-header.md) for every tab. Asset access via `blobs.getText("assets/powered_by_carta.b64.txt")` in excel-addin mode.
- **No workbook-write tool runs before the capability's approval gate returns explicit "Approve and write" / "Approve and apply" / "Approve and refresh".** Each capability defines its own approval gate — respect it.
- Never auto-retry a failed query. Always surface the failure and let the user decide.

---

## Error handling (shared)

| Symptom | What to tell the user |
|---|---|
| No Carta MCP server found | "I can't see your Carta connector. Open **Settings → Connectors** in Claude, enable Carta, then ask me again." |
| `contexts:list` returns no firm | Echo the name and ask for correct spelling. Don't silently near-match. |
| Query times out | Tell the user it's slow and offer to retry — never auto-retry. |
| Auth / permission error from the MCP | Ask the user to reconnect Carta in Settings → Connectors. |
| Connector connected, tool calls fail (`McpAuthError` / "tool not available") | Prefix mismatch — NOT an auth issue. Re-run `refresh_mcp_connectors`, probe the matching prefix's `welcome`. Never tell the user to re-auth without verifying the prefix mismatch first. |

---

## Schema discovery

The skill queries the Carta DWH journal-entries table. Look up column names via the Carta MCP DWH schema command at Gate 0 if needed. Don't embed column listings inline — the DWH contract can drift.

---

## References

### Capability entry points
- `references/fetch-budget.md` — pull a stored ManCo budget from Carta Fund Admin into Excel
- `references/create-budget.md` — build a new budget workbook from prior-year actuals, a template, a recommendation, a tag slice, a restructure, or an inflation buffer
- `references/fetch-actuals.md` — write or refresh actuals into an existing budget workbook (interleaved, separate tab, vendor view, tag view, etc.)
- `references/budget-analysis.md` — pacing and variance analysis against an existing budget
- `references/budget-scenarios.md` — what-if scenario modeling (headcount cuts, revenue shocks, cost rebalancing, new fund raises, expansion hires)

### Data fetching
- `references/fetch-budget-data.md` — DWH query patterns for pulling stored budget figures
- `references/get-actuals.md` — DWH query patterns for pulling journal-entry actuals
- `references/entity-picker.md` — firm/entity resolution and picker UX

### Create-budget sub-references
- `references/from-prior-actuals.md` — build baseline from last year's Carta actuals (default path)
- `references/from-template.md` — build from a user-supplied Excel template
- `references/from-recommendation.md` — build from a Carta-generated recommendation
- `references/slice-by-tag.md` — scope budget to a specific department/tag
- `references/reorganize-categories.md` — restructure COA groupings before budgeting
- `references/inflation-buffer.md` — apply a percentage uplift across line items
- `references/fill-budget-columns.md` — write budget figures into month columns

### Fetch-actuals sub-references
- `references/add-actuals-columns.md` — interleave Budget / Actual / Variance columns in-place
- `references/add-actuals-tab.md` — write actuals to a separate tab
- `references/add-period.md` — extend the workbook with a new period column
- `references/vendor-actuals.md` — add a vendor-level breakdown view
- `references/vendor-view.md` — write a standalone vendor-only worksheet
- `references/vendor-only-view.md` — vendor view without budget columns
- `references/inline-vendor.md` — inline vendor detail beneath line items
- `references/tag-view.md` — actuals bucketed by department/tag
- `references/refresh-existing.md` — refresh already-written actuals figures

### Budget-analysis sub-references
- `references/pacing-overview.md` — YTD pacing summary and on-track logic
- `references/drill-down-line.md` — drill into a single line item for transaction detail

### Budget-scenarios sub-references
- `references/headcount-reduction.md` — model a headcount cut
- `references/revenue-shock.md` — model a revenue shortfall
- `references/cost-rebalance.md` — redistribute cost targets across categories
- `references/new-fund-raise.md` — model incremental costs of a new fund raise
- `references/expansion-hire.md` — model adding N FTEs

### Shared presentation
- `references/branding-and-header.md` — Carta branding standards, header layout, and powered-by-Carta asset

---

## Architecture Notes

### Orchestrator pattern

This skill is a hybrid, unlike a uniform mirror-only or dispatch-only router:
the 5 budgeting capabilities (`fetch-budget`, `create-budget`, `fetch-actuals`,
`budget-analysis`, `budget-scenarios`) are implemented **inline** via
`read_skill(file_path="references/<capability>.md")` — this skill is their
sole implementation, there is no separate standalone skill for any of them.
The 4 consolidating-financials capabilities are **external dispatches** via the
`Skill()` tool to standalone `carta-investors`/`fa-manco` skills that own their
own gates end to end.

**History:** this skill was previously a thin `carta-investors:carta-manco`
router that dispatched to 5 separate published budgeting skills
(`carta-fetch-budget`, `carta-create-budget`, `carta-fetch-actuals`,
`carta-budget-analysis`, `carta-budget-scenarios`), and was briefly mirrored
into `fa-manco:carta-budgeting`. That content was consolidated here, the 5
leaf skills were deleted, and this skill is now the sole, published
implementation of all 5 budgeting capabilities — there is no more
coexistence or mirroring to maintain. One drift incident occurred during the
transition: `carta-fetch-actuals` shipped an opt-in memo-based
vendor-inference flow (Gate 5.5) that sat un-mirrored here for two weeks
before being manually ported (MANCO-924) — a reminder of why the references
are now self-contained rather than split across sibling skills.

### Known limitation — picker overlap with consolidating skills

`carta-consolidating-pnl` and `carta-consolidating-balance-sheet` are not
de-tuned and their own trigger phrases ("consolidating P&L for [firm]",
"consolidating balance sheet") overlap this skill's consolidating-financials
triggers directly. `carta-consolidating-trial-balance` and
`fa-manco:carta-consolidating-cash-flow` have narrower descriptions with less
overlap risk.

### Firm-context handoff to consolidating skills (known, accepted inefficiency)

The 4 consolidating skills each track firm context as `<FIRM_NAME>`/
`<FIRM_UUID>` internally, while this skill tracks `<ENTITY_NAME>`/
`<ENTITY_UUID>`. The Dispatch step passes the resolved firm context "so the
downstream skill can skip its own firm resolution," but the variable-naming
mismatch means that skip doesn't reliably fire — the downstream skill may
re-resolve the firm it was just handed. This is a minor extra round-trip, not a
correctness bug, and fixing it means changing the variable-naming contract of 4
other skills — out of scope here.

### Per-capability telemetry now uses the capability name directly

Gate 0.75's Dispatch step tags `_instrumentation.skills` with `<CAPABILITY>`
itself (`fetch-budget`, `create-budget`, `fetch-actuals`, `budget-analysis`,
`budget-scenarios`) — there is no longer a separate old-skill-name mapping.
Previously this tagged the now-deleted leaf skill names (`carta-fetch-budget`,
etc.) for continuity with a Metabase dashboard ("Budget Skills Usage") that
filtered on those literal strings. That dashboard's SQL must be updated to
filter on the new capability-name strings instead — it is an external
dependency this repo cannot verify or fix directly.
