DiliPilotDilipilot
QoE-lite
How it works

Methodology & guardrails

Dilipilot is a pre-QoE layer for smaller buyers — not a replacement for a full quality-of-earnings engagement. Here is exactly what the engine does and what it refuses to do.

Guardrails

Trust rules enforced in code, not in a prompt.

  • Deterministic engines do all the math. The LLM only writes the memo from pre-computed JSON — it never calculates, and it cannot cite a number the engine didn't produce.
  • Unparseable rows are skipped with warnings surfaced to you, never silently invented.
  • Seller-computed totals (Total, Net income, EBITDA rows) are ignored and re-derived from line items.
  • Add-backs are presented as analyst suggestions with evidence and confidence — never as facts — and require explicit accept/reject.
  • Low-confidence GL label mappings are flagged for manual review.
  • Memos go stale (are cleared) whenever the data or your add-back decisions change.

Add-back detection rules

Each suggestion carries its rule, evidence, and a confidence score.

  • One-time language
    Labels containing "settlement", "lawsuit", "one-time", "non-recurring", or "relocation" propose the full amount as an add-back pending documentation.
  • Owner compensation
    Owner comp is annualized and compared to a $95k replacement general-manager salary; only the excess is proposed.
  • Auto & vehicle
    Flagged in owner-operated businesses as frequently personal in whole or part.
  • Meals & entertainment
    Commonly discretionary in SMBs; full amount shown for review, partial acceptance is typical.
  • Legal spikes
    Months running >2x the median legal expense propose the excess over median as one-time.
  • Owner/personal labels
    Any label containing "owner" or "personal" outside owner comp is flagged.

Expected CSV format

Wide-format P&L export, the default shape from QuickBooks and most bookkeeping tools.

Account,Jan-25,Feb-25,Mar-25,...
Service Revenue,168000,182000,194000,...
Owner Salary,18500,18500,18500,...
Legal & Attorney Fees,900,14500,900,...

First column is the account label; remaining columns are months (2025-01 or Jan-25). Parentheses are treated as negatives. Total rows are skipped and re-derived.

Built to merge with RunwayIQ

One platform, two products — the merge is a folder copy.

This app shares RunwayIQ's stack, design system, and provider-neutral LLM layer file-for-file. All diligence logic lives in namespaced modules (lib/diligence/, types/diligence.ts, components/diligence/, app/(app)/deals/, app/api/diligence/) with no imports into product-specific RunwayIQ code, so the two merge into one platform without refactoring. See MERGE.md in the repo for the step-by-step playbook.