---
name: forecast-narrative
description: Build a one-page forecast narrative for the weekly or monthly exec
forecast call by combining Salesforce pipeline state with Gong customer-call
evidence. Outputs a headline number with a confidence band, the top three
deals moving the number, the single biggest risk, and one ask of the
VP/CRO.
---
# Forecast narrative
## When to invoke
Invoke this skill when RevOps needs to ship the weekly or monthly forecast brief that the VP Sales / CRO reads before the live forecast call. Typical cadence: once per week per segment, 30-60 minutes before the call.
Take a segment (e.g. `enterprise-amer`), a week-ending date, and the URLs of the three reference files. Produce a single-page Markdown narrative the exec can read in under two minutes.
Do NOT invoke this skill for:
- **Board-of-directors materials without CFO review.** The Skill output is an internal RevOps artifact. It has not been reconciled against finance's bookings ledger and is not safe for board reporting until the CFO's team signs off on the numbers.
- **Financial-disclosure-bound communications** (10-Q, 10-K, earnings prep, investor updates, public guidance). Forecast numbers used in any disclosure flow have to come through finance under the controls policy, not through this skill.
- **Re-baselining the official commit.** This narrative explains the commit the segment leader already set. It does not replace the commit-setting meeting itself.
## Inputs
- Required: `segment` — the forecast segment slug (e.g. `enterprise-amer`, `commercial-emea`). Maps to a Salesforce report ID in `references/segment-config.md`.
- Required: `week_ending` — the cutoff date in `YYYY-MM-DD` for the Salesforce snapshot and the Gong activity window.
- Required: `salesforce_report_id` — the saved report that returns the pipeline rows for this segment at the cutoff. Must include: opportunity ID, account, amount, close date, stage, forecast category, owner, and the prior-week snapshot fields.
- Required: `gong_workspace_id` — the Gong workspace covering this segment's calls.
- Required: `last_period_actuals` — the closed-won total from the prior period and the prior-period commit number. The Skill uses these to compute the actual-vs-commit beat/miss that frames the current narrative.
- Optional: `current_commit`, `current_best_case`, `current_upside` — if the segment leader has already set these for the period, pass them in. The Skill anchors the headline to the leader's number and explains what supports or contradicts it. If omitted, the Skill computes its own range from pipeline coverage and labels it as such.
## Reference files
Always read the following from `references/` before generating the narrative. They encode the local definitions of "commit," "stalled," and the hedge-words blocklist that keeps the output usable. Without them the narrative is generic and will drift in tone from the rest of the forecast pack.
- `references/1-narrative-structure.md` — the literal section template the output must follow, with the exact headings the exec scans for.
- `references/2-hedge-words-blocklist.md` — the words and phrasings the hedge-removal pass strips. Edit per company tone.
- `references/3-sample-output.md` — a worked example so a new RevOps reviewer can sanity-check the structure of a fresh run.
## Method
Run these six steps in order. Do not parallelize — every step after step 1 depends on the snapshot taken in step 1, and the hedge-removal pass in step 6 depends on the full draft existing first.
### 1. Snapshot Salesforce at the cutoff
Pull the saved report at `week_ending` 23:59 segment-local time. Persist the rows to disk as `snapshots/<segment>/<week_ending>.json` so the next run has a real prior-week snapshot to diff against. Diffing against the live Salesforce state instead of a stored snapshot loses the audit trail and makes "this deal moved this week" un-auditable; that is the engineering choice this step protects.
### 2. Compute the deltas
For every opportunity in the snapshot, compare against the prior-week snapshot on disk. Surface every row that:
- Changed forecast category (especially in/out of commit and best-case)
- Slipped close date by more than 14 days
- Changed amount by more than 10% in either direction
- Was created or removed from the segment
This is the raw movement set. It is not the narrative yet.
### 3. Pull Gong evidence per commit deal
For every deal in the current commit, query Gong for customer-side activity in the trailing 14 days. Capture: most-recent customer call date, participants, and a one-line topic summary lifted from Gong's call summary field (do not re-summarize the transcript here — that is a separate, more expensive call and is not needed for the narrative).
The engineering choice: combining Salesforce + Gong rather than Salesforce alone catches the failure mode where a rep keeps a deal in commit out of hope. If a commit deal has zero customer-side activity in 14 days, the deal goes into the risk section regardless of what the rep says about it. Salesforce alone cannot see that.
### 4. Rank the movers
Score each delta row by `abs(amount_change) × close_date_proximity`. Take the top three. These become the "top three deals moving the number" section. Do not surface more than three; the narrative is for the exec, not for inspection.
### 5. Identify the single biggest risk
From the commit set, surface the one deal where: (a) Gong activity is silent for 14+ days, OR (b) the close date has slipped twice in the trailing 60 days, OR (c) the deal was added to commit in the last 7 days without a corresponding customer call. Pick one. If multiple deals tie, pick the largest by amount.
The engineering choice for "one risk, not five": exec attention is the constraint, not data volume. A list of five risks is treated as no risks.
### 6. Hedge-removal pass
Generate the draft narrative following `references/1-narrative-structure.md`. Then run a second pass that scans the draft against `references/2-hedge-words-blocklist.md` and rewrites every flagged phrasing into a direct claim or a "do not know" admission. The reason for two passes rather than prompting for direct language up front: language models drift toward hedging the longer the output gets, and a dedicated removal pass reliably catches what a single-pass prompt misses. The pass is cheap (under 500 output tokens) and it is the difference between a narrative the exec actually reads and a narrative that reads like CYA.
## Output format
The Skill returns one Markdown document with exactly this structure. No preamble, no closing pleasantries.
```markdown
# Forecast narrative — {Segment}, week ending {YYYY-MM-DD}
## Headline
**Commit: ${X}M.** Confidence band: ${X−Y}M to ${X+Z}M based on {N} deals
in commit, {pct}% covered by Gong activity in the last 14 days. Last
period landed ${actual}M vs ${prior_commit}M commit ({beat/miss} of
${delta}M).
## Top 3 deals moving the number
1. **{Account} — ${amount}M, close {date}.** {What changed this week in
one sentence.} Gong: {most recent customer call date + topic}.
2. **{Account} — ${amount}M, close {date}.** ...
3. **{Account} — ${amount}M, close {date}.** ...
## Single biggest risk
**{Account} — ${amount}M.** {Why this is the risk in one sentence — the
specific signal: 17 days no Gong activity, second close-date slip in 60
days, added to commit Tuesday with no customer call since.} If this slips,
commit lands at ${X − amount}M.
## Ask of {VP/CRO name}
{One specific ask. Examples: "Get on the {Account} call Thursday to
unblock procurement." "Decide whether {Account} stays in commit or moves
to best-case before Friday." "Approve the {discount} on {Account} so legal
can close redlines."}
## Sources
- Salesforce report: {report_id}, snapshot {YYYY-MM-DD HH:MM}
- Gong workspace: {workspace_id}, activity window {start} to {end}
- Prior-period actuals: {source}
```
## Watch-outs
- **Confident-sounding hallucinations on deal specifics.** The model can invent a procurement step, a stakeholder name, or a contract value that reads plausibly. Guard: every claim about a specific deal must trace to a Salesforce field or a Gong call summary in the source data. The Skill must label any inferred-not-observed claim with `(inferred)` or omit it. If you see a confident specific claim in the output that has no source citation, treat the run as failed and re-run with a smaller deal set.
- **Hedging language slipping back in despite the removal pass.** "May," "could," "potentially," "appears to" creep back, especially on the risk section. Guard: extend `references/2-hedge-words-blocklist.md` whenever a new hedge word survives a pass. The blocklist is the durable artifact; the prompt is not. RevOps owns this file.
- **The summary cited as the actual forecast.** The narrative explains the commit; it does not set it. Guard: the headline says "Commit: ${X}M" using the segment leader's number, never a number computed by the Skill alone. If `current_commit` was not passed in, the Skill labels its computed range as "Skill-computed pipeline coverage range, not an approved commit" so the document cannot be misread as the official number. The hand-off rule: the segment leader sets the commit, the Skill explains it, the CFO reconciles it before any external use.
- **Snapshot drift.** If `snapshots/<segment>/<week_ending>.json` was written from a partially-loaded report (e.g. Salesforce timeout mid-pull), the deltas in the next run will be wrong in invisible ways. Guard: the snapshot file's first line records the row count expected vs received; if they disagree, the Skill aborts and tells the operator to re-snapshot before continuing.
# Narrative structure — TEMPLATE
> This file defines the literal section template the forecast narrative
> follows. Adjust the headings to match what your exec scans for, but do
> not delete sections — every section here exists because removing it
> created a confusion in past forecast calls.
## Section order (do not reorder)
1. **Headline** — number + confidence band + last-period beat/miss
2. **Top 3 deals moving the number** — only three, ranked
3. **Single biggest risk** — one, not five
4. **Ask of the VP/CRO** — one specific action with an owner and a date
5. **Sources** — the report ID, the Gong workspace, the snapshot timestamp
## Per-section rules
### Headline
- Lead with the dollar number. Not "we are tracking to..." Not "our forecast is..." Just `**Commit: $X.YM.**`
- Confidence band is in dollars, not percentages. "$11M-$13M" beats "75% confidence" because the exec is doing the math against the number target, not the math against a probability.
- Always include last period's actual vs prior-period commit. Without it the exec has no baseline for whether the current number is trustworthy.
### Top 3 deals moving the number
- Each deal: account, amount, close date, what changed this week, Gong signal.
- "What changed" is one sentence. If you cannot say what changed in one sentence, the deal does not belong in the top three.
- Gong signal is a date and a topic line, not a transcript summary. ("Gong: Apr 28, customer raised SOC2 question." not "Gong: the customer expressed concerns about security posture and asked several follow-up questions about our compliance roadmap.")
### Single biggest risk
- Exactly one deal. Not "the biggest risks include..."
- Name the specific signal. "17 days no Gong activity," "second close slip in 60 days," "added to commit Tuesday with no customer call since." Vague risk descriptions ("execution risk," "competitive pressure") do not pass.
- Include the dollar impact: "If this slips, commit lands at $X − Y."
### Ask of the VP/CRO
- One ask. Specific. With a deadline.
- Good: "Get on the Acme call Thursday at 2pm to unblock procurement."
- Bad: "Help drive deals to close." "Engage on top deals."
### Sources
- Always include. The exec needs to know which snapshot they are reading against, especially when challenged in the call.
## Tone rules
- Direct. Numbers in the first sentence of every section.
- No hedging — see `2-hedge-words-blocklist.md`.
- No internal jargon the exec does not use.
- No emoji. No bold-italic. Markdown bold is fine on the headline number and on the deal name in each list item.
## Last edited
{YYYY-MM-DD} — bump on every material change so the Skill can warn when the structure may have drifted from what the exec expects.
# Hedge-words blocklist — TEMPLATE
> This file is the input to the hedge-removal pass in step 6 of the Skill.
> Every phrasing here is rewritten on the second pass. Add to the list
> whenever a hedge slips past — the blocklist is the durable artifact,
> not the prompt.
## Categorical hedges (rewrite to a direct claim or a "do not know")
| Hedge phrase | Rewrite to |
|---|---|
| may | will / will not / unknown |
| might | will / will not / unknown |
| could | will / will not / unknown |
| should (as in "should close") | will close on {date} / no committed close date |
| potentially | drop the word |
| possibly | drop the word |
| likely | use the dollar number or drop the word |
| appears to | is / is not / unknown |
| seems to | is / is not / unknown |
| tends to | drop the word |
| in most cases | drop unless followed by a percentage with a source |
## Forecast-specific weasels (rewrite or remove)
| Weasel phrase | Rewrite to |
|---|---|
| tracking to | committed at $X.YM / forecasting $X.YM |
| trending toward | committed at $X.YM / forecasting $X.YM |
| in line with expectations | name the dollar delta vs commit |
| executing well | drop — say what closed, what slipped |
| strong pipeline | name the coverage ratio with a number |
| healthy coverage | name the coverage ratio with a number |
| good momentum | name what closed this week, in dollars |
| positive trajectory | drop — name the deltas |
| some risk on | the specific deal name and the specific signal |
| a few deals to watch | name the deals and why |
## Soft modal stacking (drop the redundant modal)
- "may potentially" → drop both
- "could possibly" → drop both
- "might be able to" → "will" or "cannot"
- "we are working to" → "we will" or omit
- "we will look to" → "we will" or omit
## Confidence theater (drop unless there is a number)
- "high confidence" → only with a dollar band
- "low confidence" → name the specific risk that is driving low confidence
- "we feel good about" → drop entirely
- "we are bullish on" → drop entirely
- "we are cautious on" → name the specific risk
## Things that are NOT hedges (do not strip)
These are sometimes flagged by overzealous filters. Keep them.
- "If {Account} slips, commit lands at $X." — this is a dollar consequence, not a hedge.
- "Inferred from Gong call summary" — this is a source citation, not a hedge. Source labels increase trust; they do not undermine the claim.
- "No recent customer activity" — direct admission. Keep.
- "Reporting line not public" — direct admission. Keep.
## Last edited
{YYYY-MM-DD} — extend whenever a new hedge survives the removal pass in production. The list grows; it does not shrink.
# Sample output — TEMPLATE
> A worked example of what the Skill produces, so a new RevOps reviewer
> can sanity-check structure and tone on a fresh run. Replace the
> placeholder names with your real run before sharing internally — these
> are illustrative, not real customers.
---
# Forecast narrative — Enterprise AMER, week ending 2026-05-01
## Headline
**Commit: $11.4M.** Confidence band: $10.1M to $12.6M based on 14 deals in commit, 79% covered by Gong activity in the last 14 days. Last period landed $9.8M vs $10.5M commit (miss of $0.7M).
## Top 3 deals moving the number
1. **Northwind Logistics — $1.6M, close 2026-05-22.** Moved from best-case to commit on Tuesday after Northwind's CRO confirmed the budget on the Apr 29 call. Gong: Apr 29, procurement timeline confirmed for May.
2. **Helios Health — $0.9M, close 2026-05-15.** Slipped from May 8 to May 15 after a redline round; legal agrees the new date is realistic. Gong: Apr 30, redlines exchanged with their legal team.
3. **Atlas Manufacturing — $1.2M, close 2026-06-12.** Amount increased from $0.9M to $1.2M after they added the EMEA org to scope. Gong: Apr 25, EMEA VP joined the call.
## Single biggest risk
**Concord Industries — $0.8M.** No Gong activity in 19 days; deal has been in commit since Apr 4 with no customer-side call since Apr 12. If this slips, commit lands at $10.6M.
## Ask of Sarah Chen
Get on the Concord call scheduled Thursday 2pm PT — the AE has not been able to engage their VP Procurement directly and your sponsorship would unblock the next redline cycle before the May 22 deadline.
## Sources
- Salesforce report: `0050000000ABCDE`, snapshot 2026-05-01 23:59 PT
- Gong workspace: `enterprise-amer`, activity window 2026-04-17 to 2026-05-01
- Prior-period actuals: April commit close, finance ledger 2026-05-01
---
## Reviewer checklist
Before sending to the exec, the RevOps reviewer scans for:
- [ ] Headline opens with a dollar number, not a verb.
- [ ] Confidence band is in dollars, not a percentage.
- [ ] Top 3 list is exactly 3, ranked, each with a Gong signal date.
- [ ] Risk section names exactly one deal with a specific signal.
- [ ] The ask names a person, an action, and a deadline.
- [ ] No hedge words from `2-hedge-words-blocklist.md` survived.
- [ ] Every specific deal claim traces to a Salesforce field or a Gong call summary visible in the source data — no inferred numbers without an `(inferred)` label.