一键导入
track-plan-drift
Use when a portco is post-close and the operating partner needs
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
菜单
Use when a portco is post-close and the operating partner needs
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
基于 SOC 职业分类
Use when the user wants a recorded video walkthrough of the Decision- Optimization Diagnostic (DX) upload UI — drop CSVs, watch the pipeline run, see the report rendered. Drives the local pe-mcp-web app via Playwright with caption overlays at each step, records to .webm, and prints a one-line ffmpeg command to convert to MP4. Reproducible, scripted, no manual screen capture required.
Use when a PE shop or portco needs to audit a deployed AI-agent fleet — inventory every registered agent, flag zombies (idle too long), runaway-cost agents (modeled monthly spend over a threshold), and misaligned agents (eval rubric fail), and produce a board-defendable pruning recommendation list with annual savings if the prunes land. Tackles the 40%-of-agentic- projects-cancelled-by-2027 risk Gartner is forecasting, and the agent-sprawl problem mega-funds (Vista, Thoma Bravo) face once they deploy AI agents at portco scale. Pure deterministic — no LLM call inside the tool, modeled telemetry stamped as modeled.
Use when an operating partner wants to surface cross-portco
Use when an LP has sent the GP an AI-section DDQ (Due-Diligence Questionnaire) — typically the new ILPA v2.0 (Q1 2026) AI governance / data / risk sections — and the GP needs a first-draft response packet built deterministically from the fund's existing AI-evidence artifacts in finance_output/, with every answer citing its source and a cross-answer consistency layer flagging contradictions before the LP does.
Use when a PE professional needs an EU AI Act (Regulation 2024/1689)
Use when a PE professional needs a fast diligence pass over a
| name | track-plan-drift |
| description | Use when a portco is post-close and the operating partner needs |
plan_drift/initiatives.py.You produce a 4-section drift report:
You do not invent numbers. Every $ in the report traces to a frozen plan field or a parsed 10-Q line item. The renderer enforces this.
This tool is the operator-side counterpart to cim_analyze (10-K
red-flags) and exit_proof_pack (seller-side disclosure):
cim_analyze reads a public filing and surfaces diligence flags.exit_proof_pack documents claimed AI EBITDA before banker
engagement.track_plan_drift diffs the operator's plan against the real
filing actuals — between the deal close and the next QBR.It reuses the SEC EDGAR fetcher and 10-K HTML parser from the cim
module directly, so it inherits the same provenance posture.
A buyer or LP that disagrees with the bands can re-derive them; the JSON sidecar carries every input so the table is reproducible.
For revenue and income KPIs (higher is better) the gap is
actual − planned. For cost KPIs (lower is better) the gap is
planned − actual. Both are reported from the operator's perspective:
negative gap = behind plan, positive = ahead.
track_plan_drift(
portco_id: str,
ticker: str, # SEC ticker for actuals (e.g. 'BOWL')
plan_id: str = "default_100day", # which frozen plan to diff against
output_filename: str | None = None,
) -> dict
Returns:
{
"report_path": "/abs/path/to/plan_drift_<portco>.html",
"json_path": "/abs/path/to/plan_drift_<portco>.json",
"n_initiatives": int,
"n_on_track": int,
"n_lagging": int,
"n_off_track": int,
"total_dollar_gap_usd": float, # negative = EBITDA at risk
"top_drift_initiative": dict, # the worst-drift row
}
The HTML is editorial-letterpress (matches the explainer / exit-pack aesthetic). The JSON sidecar carries the structured drift rows and the parsed line items, which feeds downstream tools (LP letter exhibit, QBR pre-read).
default_100day (BowlerCo)The default plan is a 7-initiative VCP for BowlerCo (Bowlero / BOWL) — a publicly-traded, PE-rolled-up specialty entertainment operator. Numbers are illustrative but order-of-magnitude correct for a $1B- revenue rollup. KPIs are chosen to map cleanly to public 10-Q line items so the diff is deterministic.
Owners span CEO, CFO, COO, CRO, CIO. Categories span growth, cost-out, pricing, working-capital, tech, org. Due-days span Day 30 → Day 100.
Default search order:
get_plan(plan_id) from plan_drift/initiatives.py.portco_id="BowlerCo", ticker="BOWL" and
tell the user that's what you're using.track_plan_drift(
portco_id="BowlerCo",
ticker="BOWL",
)
The tool fetches the most recent two 10-Qs (current + prior for YoY), parses both, extracts annualized line items, computes drift per initiative, and writes the report.
Report back:
report_path (HTML — open it for the user).json_path (structured drift rows for downstream).| Failure | Diagnosis | Fix |
|---|---|---|
Unknown plan_id | Caller asked for a plan that doesn't exist | List known plans via list_plans() or use the default. |
SEC EDGAR fetch failed | Ticker not in EDGAR or network outage | Verify ticker (e.g. BOWL is Bowlero); retry. |
Could not extract text from <url> | The fetched 10-Q HTML is malformed | Fall back to the prior quarter's 10-Q or another ticker. |
| Actuals come back as zeros | The income-statement regexes didn't match this filer's table format | The parse_quality field flips to synthesized-fallback and the report annotates the rows. Fix by extending _LINE_ITEM_PATTERNS. |
| Drift band too wide / too narrow | _ON_TRACK_BAND and _LAGGING_BAND constants encode the heuristic | Tunable in drift.py; defaults are 5% / 15%. |
When you finish, return to the user:
Do not paste the full report back into the chat. The HTML is the artifact; the chat output is the pointer.
User: "Track drift on BowlerCo against the default plan."
Agent:
track_plan_drift(portco_id='BowlerCo', ticker='BOWL').