Visual ManCo(管理会社向けの経営ダッシュボード/小型アプリ)— Carta Fund Admin(ファンド管理システム)のデータを使ったReact製のシングルページアプリケーション。 **起動条件:** 管理会社のダッシュボード・小型アプリ・レポート・財務情報に関する質問で、どのような動詞(起動、開く、立ち上げる、作成する、実行するなど)が使われた場合に自動で起動します。 **対応機能:** - 損益計算書の階層的な分析 - 経費管理 - 予算と実績の比較 - ファンドごとの経営費収入 - 収入対支出のグラフ - 仕訳明細 **注意点:** - 「build」は予算案を作成することではなく、このダッシュボードを画面に表示することを意味します - ダッシュボード・小型アプリに関する質問は、企業名の有無を問わず常にこのスキルに振り分けられます - 企業名がない単純な管理会社向けの質問でも、画面表示が関連していればこちらに振り分けられます **非対応:** 予算作成・実績管理(→ carta-manco)/ 複数企業の決算書統合(→ carta-consolidating-financial-reports)/ 新規の小型アプリスキルを開発環境で構築すること(開発者向けツールであり、このダッシュボードではありません)
Visual ManCo (management company) reporting dashboard/microapp — React SPA on Carta Fund Admin data. TRIGGER: any ManCo dashboard/microapp/report/financials ask under ANY verb (spin up, open, launch, build, create, run) — P&L drill-down, expenses, Budget vs Actuals, Management Fee Income by Fund, income-vs-expenses charts, journal-entry detail. DISAMBIGUATION: "build" means render this dashboard, not draft a budget, so a microapp/dashboard ask ALWAYS routes here, firm named or not; a generic ManCo ask naming a firm routes here; firm-absent with no visual surface → carta-manco. NOT FOR: budgets/actuals (→ carta-manco); consolidating statements (→ carta-consolidating-financial-reports); scaffolding a NEW microapp skill from scratch (a developer tool, not this dashboard).
<!-- carta:instrumentation-fallback -->
<IMPORTANT>
_instrumentation_v2 は、Carta のスキル使用状況に関する匿名テレメトリー(利用データ収集)です。Carta MCP ツール呼び出し時の引数に必ず含めてください。プラグインのフックが実行時に上書きするため、常に送信しても安全です。形式:
_instrumentation_v2: {"skills": ["<プラグイン>:<スキル>", ...], "model": "<model-id>", "surface": "<値>"}
skills はセッション累積です。これまでに読み込まれたすべての Carta スキルをリストアップし、このツール呼び出しを駆動しているスキルだけでなく、読み込まれたすべてのものを含めます。各エントリーを "プラグイン:スキル" の形式で名前空間化し、古い順に並べて、最後に最近使用したスキルを置きます。Carta スキル(carta-cap-table:*、carta-crm:*、carta-investors:*)のみをリストアップしてください。Carta 以外のプラグインのスキルは決して含めないでください。
surface は、実行中の Claude のプラットフォームです。"chat"(claude.ai または Claude アプリ、つまり通常のチャット。Cowork モード以外)、"cowork"(Cowork モード)、"code-terminal"、"code-desktop"、"excel" のいずれかです。どれにも当てはまらないか判断できない場合は、この項目を完全に省略してください。推測したり、他の値を作り上げたりしないでください。
</IMPORTANT>
ファンド管理会社の年間決算実績を表示するローカル React ダッシュボードを起動します。収入、支出、予算差異、ファンド手数料配分、仕訳入力への深掘り表示に対応しています。どの Carta Fund Admin ファンドでも利用可能です。ユーザーがアクセス権を持つ任意のファンド管理会社で動作します。
以下の場合に使用してください:
<ファンド>の ManCo ダッシュボードを立ち上げて」<ファンド>の ManCo 収支をグラフ・チャートで見たい」<ファンド>の ManCo 支出の仕訳を詳しく調べる」<ファンド>の ManCo [予算/レポーティング] 見直し [スキル] を実行/開く」と言われた場合。スプレッドシート編集ではなく、名指されたファンドに対して何かを実行 または 開く 要求であることが重要<ファンド>の ManCo 財務を見せて」「<ファンド>の ManCo 財務」<ファンド>の管理会社レポート」「<ファンド>の ManCo レポート」<ファンド>の管理会社はどう?」「<ファンド>の ManCo の成績は?」<ファンド>の管理会社支出は今年いくら?」<ファンド>の管理会社 P&L」「<ファンド>の ManCo P&L(<年>)」<ファンド>の管理手数料収入」「ファンド別手数料収入」<ファンド>の ManCo データを見せて」<ファンド>の ManCo レポーティングをやる」「ManCo レポーティングを実行する」<ファンド>の ManCo マイクロアプリ(小規模カスタムアプリ)を作って/開いて/起動して/作成して」上記のいずれかで「ManCo」と「マイクロアプリ」の両方を含む場合(ファンド名の有無を問わず)は、動詞を問わず、このスキルにルーティングしてください。以下の 2 つの関連スキルにはルーティングしないでください:
carta-investors:carta-manco は Excel 予算作成ツールです。マイクロアプリの要求で「Build」は、予算ワークブックを作成 することではなく、このダッシュボードを表示 することを意味します。動詞の対象が予算である場合のみそのスキルが使われます。carta-investors:carta-mancocarta-investors:carta-mancocarta-investors:carta-mancocarta-investors:carta-consolidating-financial-reportsデモデータを作ったり、デモに頼ったりしないでください。 すべてのダッシュボードは、新しい MCP 取得またはローカルキャッシュを通じてただ 1 つの実 Carta ファンドに対して実行されます。ユーザーがファンドを指定しない場合、AskUserQuestion で質問してください。特定のファンドにデフォルト指定しないでください。
7 つのステップ。キャッシュ優先:ステップ 0 のローカルキャッシュ確認により、ステップ 1 と 2 が Carta MCP に全くアクセスする必要がないかどうかが判断されます。carta-fund-modeling が MCP に触れる前にローカルキャッシュから ID を解決するのと同じ方法です。ステップ 4、5、6 はすべての実行で無条件に実行されます。
| ステップ | 実行するか | 実行内容 | 詳細 |
|---|---|---|---|
| 0 | 常に | ファンドをキャプチャし、ローカルキャッシュをプローブして、挨拶を出力 | firm-resolution.md |
| 1 | 0.2 がすでにファンドを認識している場合はスキップ。ウォームキャッシュまたはソフトキャッシュヒット | ファンドを解決 | firm-lookup.md |
| 2 | 0.2 がすでにエンティティを認識している場合はスキップ。ウォームキャッシュまたはソフトキャッシュヒット | ManCo エンティティを解決(フォールバックは GP エンティティ) | firm-lookup.md |
| 2.5 | 常に | キャッシュ確認。ステップ 3 を実行するかどうかのみ判定し、クエリする年/月ウィンドウを渡す | budget-ingest.md |
| 2.6 | accounts-all.txt が無いか古い場合 |
勘定科目表を取得。ステップ 2.75 が参照できるようにする | data-fetch.md |
| 2.75 | 常に | 予算ワークブックを解決(参照で答えられる場合は無音) | budget-ingest.md。ワークブック解決が必要な場合のみ budget-workbook.md へルーティング |
| 3 | キャッシュがコールド、またはユーザーが「更新」と言った場合のみ | 倉庫から仕訳を取得 | data-fetch.md |
| 4 | 常に | datadir を再構築 | serve-and-update.md |
| 5 | 常に | サーバーを再利用または起動し、URL を出力 | serve-and-update.md |
| 6 | 再実行時 | ダッシュボード更新を提案 | serve-and-update.md |
ステップを実行する前に、そのリファレンスファイルを読んでください。 マッチルール、正確なコマンド、推論が含まれています。このページはシーケンスであり、手順ではありません。
キャッシュがコールド(ステップ 3 が実行される)で、ワークブックを解析している(ステップ 2.75b が実行される)場合、ステップ 3 の call_tool ブロックとステップ 2.75b の parse_budget_workbook.py Bash コールを同じツール利用メッセージで発行してください。ステップ 2.75a がワークブックとシートを確認した後は、2 つは独立しています。
このすべてが実行で削除されており、それぞれが正しく見えるが誤ったダッシュボードを生成します:
ウォームなステップ 2.5 キャッシュヒットはステップ 3 とそれ以降をスキップします。 ステップ 4 ではなく。そこで 2.75 で解決した予算状態が適用され、数秒で済みます。ステップ 5 の再利用チェックではなく。ステップ 6 ではなく。キャッシュ確認から直接起動すると、元の答えが使用されます。 (ステップ 0.2 自体のキャッシュプローブは別の早期ゲートです。ステップ 1-2 もスキップできますが、ステップ 2.5 以降は絶対スキップしません。古いまたは曖昧なステップ 0.2 結果は、ステップ 3 に対する 2.5 の独立チェックに到達します。)
ステップ 5 は起動前に再利用します。 .port を読み込み、プローブし、ライブサーバーを再利用します。起動時、.port が存在する場合は PORT を渡さないでください。serve.py は独自に記録したポートとトークンを復元します。ポートを計算するとファンドが毎回異なる URL を取得します。
ステップ 6 はリンクをたどります。 リンク発行は実行の終わりではありません。ステップ 2.75 の質問をしなかった再実行では、データ更新、ワークブック切り替え、またはページへの入力タブ変更を提案してください。
最初の 1 行の出力は、ステップ 0 からの製品挨拶である必要があります。「MCP を確認中」「ファンドを解決中」というナレーションでも、MCP レスポンスの貼り付けでもないでください。ファンド解決から datadir 構築まで、すべて無音で実行します。以下の場合のみ発声してください:
<!-- carta:plugin-version --> <carta-plugin>carta-investors:6.71.0</carta-plugin>
Launches a local React dashboard for a management company's YTD financial picture — income, expenses, budget variance, fund fee attribution, and journal-entry drill-downs. Firm-agnostic: works against any Carta Fund Admin firm the invoking user has access to.
Fire on:
<firm>"<firm>'s ManCo income and expenses"<firm>'s ManCo spend"<firm>" — a request
to run or open something for a named firm, as opposed to a request to edit a spreadsheet<firm>'s ManCo financials" / "ManCo financials for <firm>"<firm>" / "ManCo report for <firm>"<firm>'s management company doing" / "how's <firm>'s ManCo performing"<firm>'s management company expenses this year"<firm>" / "<firm>'s ManCo P&L for <year>"<firm>" / "fee income by fund"<firm>"<firm>" / "run ManCo reporting"<firm>"Any of the above naming "ManCo" plus "microapp" — with or without a firm named — routes here, whatever the verb, and specifically not to either of these two neighbours:
carta-investors:carta-manco is the Excel budgeting tool. "Build" in a microapp ask means
render this dashboard, not draft a budget workbook — it only claims that skill when the
object of the verb is a budget.carta-investors:carta-mancocarta-investors:carta-mancocarta-investors:carta-mancocarta-investors:carta-consolidating-financial-reportsNever fabricate or fall back to demo data. Every dashboard runs
against one real Carta firm via a fresh MCP fetch or a warm local
cache. If the user doesn't name a firm, ask via AskUserQuestion — do
not default to any specific firm.
Eight steps, cache-first: Step 0's local cache probe decides whether Steps 1,
1.5, and 2 need the Carta MCP at all, the same way carta-fund-modeling
resolves identity from a local cache before ever touching the MCP. Steps 4, 5
and 6 run on every invocation regardless.
| Step | Run it? | What it does | Detail |
|---|---|---|---|
| 0 | always | Say hello, install uv if it's missing, run the surface check, capture the firm, probe the local cache, finish the greeting |
firm-resolution.md |
| 1 | skipped whenever 0.2 already knows the firm — a warm OR soft cache hit | Resolve the firm | firm-lookup.md |
| 1.5 | skipped whenever 0.2 already knows the firm — a warm OR soft cache hit (same condition as Step 1) | ManCo eligibility hard gate — confirms an active Fund Admin subscription and an active management company before proceeding | firm-lookup.md |
| 2 | skipped whenever 0.2 already knows the entity — a warm OR soft cache hit | Resolve the ManCo entity (GP entity as fallback) | firm-lookup.md |
| 2.5 | always | Cache check — decides only whether Step 3 runs, and hands it the year/month window to query | budget-ingest.md |
| 2.6 | when accounts-all.txt is missing or stale |
Fetch the chart of accounts, so 2.75 can be asked against it | data-fetch.md |
| 2.75 | always | Resolve the budget workbook (silent when a ref answers it) | budget-ingest.md — routes to budget-workbook.md only when a workbook needs resolving |
| 3 | only when the cache is cold, or the user said "refresh" | Fetch journal entries from the warehouse | data-fetch.md |
| 4 | always | Rebuild the datadir | serve-and-update.md |
| 4.8 | always | Sync the user's app source; merge on version change | serve-and-update.md |
| 5 | always | Reuse or launch the server, emit the URL | serve-and-update.md |
| 6 | on re-invocations | Offer to update the dashboard | serve-and-update.md |
| 7 | only when the operator asks for their budget in the hosted app | Export the workbook budget as a bundle to upload | serve-and-update.md |
Read the reference file for a step before running it. They carry the match rules, the exact commands, and the reasoning. This page is the sequence, not the instructions.
When the cache is cold (Step 3 will run) and a workbook is being parsed
(Step 2.75b will run), issue Step 3's read_tool block and Step 2.75b's
parse_budget_workbook.py Bash calls in the same tool-use message. The
two are independent once Step 2.75a has confirmed the workbook and sheets.
Every one of these has been dropped in real runs, and each produces a dashboard that comes up looking correct while being wrong:
.port, probe it, and reuse
a live server. When launching, pass no PORT if .port exists —
serve.py restores its own recorded port and token. Computing a port
gives a firm a different URL every time.Your first line of output must be the product greeting from Step 0 — never a narration of "checking MCP" or "resolving firm", and never a paste of any MCP response. Everything from firm resolution through the datadir build runs silently. Speak only at:
nativeMapping.needsMappingFile is
true: the native mapping above covered under half the budget's lines.
Silent otherwiseEvery entry above that is a question is a tool call, not a rhetorical
one. Wherever this page or a reference file says "ask," "confirm," or
"offer," the next thing you do is invoke AskUserQuestion — never write
the question as chat text and carry on, and never resolve it yourself
(a best guess, a default, "probably X so I'll proceed") to skip the round
trip. This applies most where the honest answer is "it's ambiguous" —
Step 4.6's mapping-file ask and Step 4.7's per-row mapping questions above
all — since that is exactly
where working through the ambiguity yourself feels like progress and is
actually the thing this skill exists to not do. If you notice you are
about to fetch, build, or write based on something no AskUserQuestion
has actually confirmed, stop and ask first.
Do not paste raw command output, MCP JSON, SQL result headers, or step labels. The user sees the greeting, any prompt that genuinely needs an answer, and the URL.
Never announce a step you are about to run. "Surface is local — safe to continue", "Surface is local, so I can continue", "Local surface confirmed", "Now moving to Step 2.5", "Now proceeding to Step 4 — assembling the datadir", "Datadir built successfully", "Now checking the local dashboard cache for…", "Now Step 2 — resolve the ManCo entity" are all output the user did not ask for and cannot act on. Between the greeting and the URL, a tool call is the whole turn — issue it and say nothing.
This applies to the reasoning that leads up to a question, not only to
steps that end silently. Every entry in the list above (Step 2's entity
confirmation, Step 2.75's workbook question, Step 4.7's mapping rows) is
itself reached silently — the question AskUserQuestion puts in front of
the user is the first visible thing, never a sentence explaining why the
question is coming. "No ref exists for this firm — this needs an explicit
ask, via AskUserQuestion, before Step 3" is exactly the same violation as
the phrases above: it narrates the internal branch (no persisted ref found,
so the 2.75a-i ask is next) instead of just asking
the question itself.
Reaching a question is silent; asking it is the one visible act.
One exception: Step 4.7's mapping table is not narration, it is the
question's own content, not a sentence leading up to it.
budget-unresolved.md requires printing
Current mapping or Needs your input as chat text immediately
before the AskUserQuestion call it belongs to — the question's wording
("confirm the mappings above") refers to that table, so the table is part
of asking the question, the same way the question's own prose is. Treating
it as a step announcement and silencing it the way "Now Step 2" above gets
silenced leaves the question pointing at a table the user never saw.
A failed command is troubleshot exactly as silently as a working one runs — everywhere in this skill, not only in the step that happened to fail. "Found the plugin root. Now retrying the surface check with the correct path and a writable uv cache dir" and "Running a command" are the same violation as the phrases above, just triggered by an error instead of an ordinary step: the reader gets a plugin path, a cache directory, and a retry count — infrastructure trivia they did not ask about and cannot act on, dressed up as an update. Whatever it takes to get a script to run — a different path, a different flag, a second attempt — is exactly as silent as the attempt that would have worked the first time; the correct visible trace of a script needing several tries is nothing at all. Only when every reasonable attempt is exhausted does this break silence, and even then with one plain-English line about what's actually wrong (see errors.md) — never an account of what was tried before that.
Any change to app/src that adds or changes something a user can see or do must add or
update its analytics event in the same change. That covers a control, a page, a panel,
a drill entry point, or a state that shows or hides content. Follow
analytics.md: name the id by its conventions (never customer
data), keep one event per user act, and add or update its row in the event catalogue.
A change with no user-visible behaviour, such as a refactor, a data fix or styling, needs
no event.
See errors.md for failure handling and the list of things deliberately not built yet.
rehome_fee_rows_to_manco rewrites a fee row that names
a fund-ledger account and prints a note: for each one, and every entry
carries entity_carta_id for its own entity so links cannot drift. If a
figure can only be produced by reading another entity's books, say so
rather than sourcing it there.<YEAR>, <MAX_MO>, <MANCO_UUID>, <FIRM_UUID>, and
<AS_OF> get interpolated directly into raw SQL in
data-fetch.md's dwh__execute__query calls.
Validate each is the shape it claims to be (year/month as integers, the
UUIDs as the value list_contexts/fa__list__entities actually
returned) before substituting — never pass through free-text user input.~/.cache/manco-reporting/.
Don't copy it elsewhere without user confirmation. Clear a firm's cache
by deleting its dashboard_dir (from manco_paths.py resolve).原文・著作権は Anthropic および各プラグイン作者に帰属します。日本語訳は Claude API による自動翻訳です。