بنقرة واحدة
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').