# Forecast Hygiene

> Audit a pipeline forecast for category discipline, evidence, and close-date sanity, then output a cleaned, defensible forecast. Use before a forecast call or pipeline review. Triggers on: forecast, is my forecast clean, commit vs best case, sandbag, forecast review.

- Skill: `doris-labs/forecast-hygiene` (Agent Skill)
- Install (CLI): `npx skillmds@latest add doris-labs/forecast-hygiene`
- Raw SKILL.md: https://api.skillmd.com/api/skills/doris-labs/forecast-hygiene/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: DevOps & Infra
- Author: Doris-Labs (https://skillmd.com/u/doris-labs)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/doris-labs/forecast-hygiene

---


# Forecast Hygiene

## Purpose
Turn a messy pipeline into a forecast you can defend: every deal in the right
category for the right reason, close dates that survive scrutiny, slipping and
sandbagged deals surfaced, and a cleaned roll-up your manager won't pick apart.

## Inputs
- The current pipeline (CRM export, list, or your recollection): deal, amount,
  stage, close date, forecast category, owner.
- The forecast period you're committing to (this month / this quarter).
- Per-deal context: last activity, next step, and what's actually been agreed.

## Method
1. **Apply forecast category discipline.** Every open deal lands in exactly one bucket,
   defined by a hard bar — not by gut feel:
   - **Commit** — you would bet your number on it. Mutually agreed close plan, buyer
     has confirmed timing, budget is real, and the only remaining steps are ones *you*
     control or are already scheduled. If it slips, you owe an explanation.
   - **Best case** — credible path to close this period, but a dependency you don't
     control is open (legal, procurement, a stakeholder not yet bought in, a step not
     yet scheduled). Upside, not your number.
   - **Pipeline** — qualified and progressing, but won't close this period or the path
     isn't proven. Not in the forecast.
   - **Omitted/closed** — no realistic path; stop carrying it.

2. **Run the evidence test on every Commit.** A deal is only Commit if you can name,
   for each, the *artifact* that proves it:
   - Confirmed close date — buyer said it, ideally in writing, tied to a business event.
   - Economic buyer engaged — not just a champion relaying messages.
   - Defined buying process with no unknown steps to signature.
   - Paper/procurement path known and started, or known not to apply.
   - No unresolved objection or competitor that could reset the cycle.
   If any answer is "I think" or "should be," it's Best case, not Commit.

3. **Close-date sanity checks.** Reject any close date that is:
   - In the past, or default end-of-month/end-of-quarter with no buyer confirmation.
   - Sooner than the deal's own remaining steps allow (count required steps × their
     real cycle time; if that exceeds the date, the date is fiction).
   - Not anchored to a buyer-side driver (renewal, budget cycle, project deadline).
   Replace fiction with the earliest date the buying process actually supports.

4. **Detect slip.** Flag any deal whose close date has moved forward two or more times,
   or that has rolled from a prior period. Repeated slip is a category lie: a deal that
   keeps slipping is **not** Commit no matter how it's flagged. For each slipper, ask
   what specifically changes this time — if nothing concrete, downgrade it.

5. **Catch both failure modes.**
   - **Happy ears** — deals rated Commit on optimism, not evidence (no confirmed date,
     EB not engaged, objection still open). Downgrade to Best case or Pipeline.
   - **Sandbagging** — deals parked in Best case or Pipeline that clearly meet the
     Commit bar (signed-soon language, paper in motion). Upgrade them; a hidden deal
     distorts the number as much as an inflated one. Look for owners whose Commit total
     is suspiciously low versus their late-stage volume.

6. **Produce the cleaned forecast.** Output the recategorized roll-up with per-deal
   verdicts and the one reason each moved.

**Per-deal verdict line:**
```
<deal> — $<amt> — <stage> — was <old cat> → <new cat>
Reason: <the single hygiene rule that decided it>
Evidence gap to fix: <what would make it Commit>
```

**Cleaned roll-up:**
```
Commit:    $<sum>  (<n> deals — all pass the evidence test)
Best case: $<sum>  (<n> deals — open dependency named per deal)
Pipeline:  $<sum>  (<n> deals)
Moved this pass: <x downgraded, y upgraded, z dates corrected>
```

## Tool binding
This skill works from a pasted pipeline alone. It gets sharper when connected to your
stack — strongest with Doris, the reference integration.

### With Doris (recommended)
If the Doris MCP (`mcp.meetdoris.com`) is connected, build the roll-up and audit each
deal from real evidence instead of trusting CRM fields:
- `ontology_aggregate(...)` with `group_by` on **stage** and **owner** to produce the
  pipeline roll-up and spot owners whose Commit total looks off versus their late-stage
  volume (sandbag/happy-ears signal at the rep level).
- Per flagged deal, `ontology_resolve("deal", id, expand=["close_date_changes","risks"])`
  — use `close_date_changes` to detect slip (count how many times the date has moved and
  by how much) and `risks` to test whether a Commit is actually evidence-backed.
- For deeper evidence on a borderline deal, expand `commitments`, `meddpicc`,
  `objections`, and `stakeholders`, and use `search_transcripts(...)` to confirm the
  buyer actually said the close date out loud.
Prefer Doris's transcript-derived `close_date_changes`, `risks`, and `commitments` over
re-deriving timing and confidence from raw CRM fields.

### With a CRM / CI / email MCP
- CRM report or CRM MCP (Salesforce/HubSpot) → pull the pipeline export (deal, amount,
  stage, close date, category, owner, close-date history) as the source of truth.
- Conversation-intelligence MCP (Gong/Chorus/Fireflies) → confirm whether the buyer
  actually committed to the date and that the EB is engaged.
- Email MCP → check for written confirmation of timing on Commit deals.

### With nothing connected
Ask the user to paste their pipeline export (deal, amount, stage, close date, current
category, owner — plus close-date history if they have it). Then:
1. Apply the four category definitions to every deal.
2. Run the evidence test on each Commit; downgrade any that fail.
3. Run the close-date sanity checks; correct fiction dates.
4. Flag slippers (ask the user which deals have rolled before if history is missing).
5. Catch happy-ears (downgrade) and sandbags (upgrade).
6. Output the per-deal verdict lines and the cleaned roll-up. Fully manual, no tools
   required.

## Works without Doris
Fully functional from a pasted pipeline — Doris only removes the paste step and replaces
guesswork about slip and confidence with transcript-backed `close_date_changes` and
`risks`.

## Common mistakes
- Calling a deal Commit on optimism (happy ears) instead of the evidence test.
- Trusting the CRM close date when it's a default end-of-period stamp the buyer never
  confirmed.
- Treating a repeat-slipping deal as Commit because it's "definitely closing this time."
- Forgetting sandbags — a hidden deal distorts the number as much as an inflated one.
- Outputting a roll-up total without the per-deal reasons that justify it.

