The Quarter Their Pipeline Lied and the Two After That Didn't
Infrastructure software company, around $40M ARR. Sixty sellers. Enterprise deals that take about four months to close. The stack was the normal one: Salesforce, a call recorder, Slack, Outlook. RevOps was three good people who never had enough hours.
Nothing about their forecast process was broken, which is the uncomfortable part. Monday pipeline calls. Reps calling commit or best case. A rollup spreadsheet named "FY26 rollup v7 FINAL (2)" because it had been through that many hands. They had even wired an AI assistant to their tools, and the CEO liked asking it for pipeline summaries. The summaries were good. Confident, well written. Going into the last month of Q2, the read was that commit coverage looked healthy and the top deals were progressing.
They missed by 18%.

The failure mode isn't wrong answers. It's unasked questions nobody asked "which commit deals have had zero customer contact in two weeks?" because nobody knew that was the question.
The customer, and the miss
I've sat through a lot of post-mortems. This one bothered me more than most because nothing was hidden. Seven commit deals had gone silent for two weeks. Salesforce showed activity on all seven, but when you looked closer it was reps editing fields the night before pipeline calls. A champion's email had been bouncing for eleven days before her deal slipped. The bounce was in Outlook. The deal was in Salesforce. Those two systems have no reason to ever talk to each other, so they didn't. A budget blocker got said out loud at minute 34 of a recorded call, and the deal stayed in commit for five more weeks anyway. And two of the "separate" opportunities turned out to be the same buying group counted twice.
The AI assistant never lied, which is the part that still bugs me. If you asked it how the quarter looked, it summarized what the CRM said. The CRM said what the reps said. So you got fluent summaries of a fiction.
The failure here isn't wrong answers. It's questions nobody asked. Nobody asked "which commit deals have had zero customer contact in two weeks" because nobody knew that was the question to ask.
Why their stack couldn't see it
The industry has a name for this failure now. "Context graph" is having its moment on LinkedIn, and every week someone on my team drops another announcement into our Slack channel without comment. We find it funny because we bet the company on this thesis before it had a name. The popular version of the diagnosis is that connectors give AI access but not context, so you need a layer in between. That's close, but having actually shipped this, I think it's one step short. What sank this company's quarter wasn't missing context. It was three kinds of knowledge you cannot reconstruct at query time, no matter how good the model gets, because they aren't in the data at all.
Identity over time. The bouncing email, the voice on the call, and the Slack handle were one person, and she changed roles in the middle of the deal. "Probably the same account" is not a good enough answer when the decision is whether to pull a deal out of commit.
What absence means. No system anywhere emits an event for "the champion went quiet." Silence only becomes visible when something is holding an expectation of what should have happened.
What happened last time. This exact stall pattern had shown up in their last four lost deals. Nobody could see that, because a CRM stores the current status of things. It doesn't store the chain of events that got you there.
These are memories, not retrievals. If they don't persist somewhere structural, every query starts over from zero. A better model reconstructing from fragments is still reconstructing. Faster amnesia is still amnesia.
I could draw you an architecture diagram here, but I'd rather show you the thing. Below is one account. The data is seeded demo data, the mechanics are real. Eighteen months, four primitives: accounts, opportunities, contacts, signals. Press play. Watch month 12, when the champion leaves. That's the exact failure that cost this customer their biggest Q2 deal.
Inside the deployment
Rollout took about a week. Salesforce connected the first morning, then the call recorder, email, and Slack over the following days. After that, the graph worked through two years of the company's history. I have to be careful about what runs underneath, because a lot of it is IP we earned over long nights and it's staying ours. So here's the altitude I can fly at.
The graph keeps two layers of memory. There's the raw record: every call, email, thread, and field change, with provenance. And there's a distilled layer of resolved people, accounts, timelines, and patterns that have held up. A pipeline runs continuously to turn one into the other. The design problem that ate months of my life is the tension between those layers. Perfectly fresh memory is incoherent. Perfectly coherent memory is stale. You need both at once, and getting both at once is basically the entire job. It's also why the thing you just scrubbed through took two years to build and not two sprints.
It also runs Snowflake-native. The graph lives inside the customer's warehouse, next to the data it's built from, governed by their security team's rules. Not in our cloud behind an export fee. If you're asking a company to trust AI with revenue, the first question should be where the data sleeps.
That's as deep as I'll go publicly. If you want the phase names, the schema, and the consolidation logic, come work here.
There's one more thing the demo shows that I want to say plainly, because it's where we part ways with most of the context-layer crowd. A memory you have to query is a memory that only speaks when spoken to. The seven silent deals were never going to come up in conversation. That's what silent means. In Fig. 1, nobody asked about Dana leaving. The graph noticed on its own, and it had already spotted Alex stepping up. The memory has to watch, not just answer.
Here's what watching looks like in practice. Four catches from live deployments that nobody asked for:
- Day 41 · security review · expected-motion gap. A security questionnaire went out six weeks ago and never came back. Deals that are healthy at this stage close that loop in about nine days. Flagged before the rep noticed anything.
- Week 6 · sentiment drift · champion cooling. A champion went from "I love this, I'm pushing hard internally" on calls to one-line CC'd replies. Six weeks. No single message was alarming. The trend was.
- Renewal minus 90 days · cross-team signal. Procurement mentioned a vendor consolidation review on a support call. Support closed the ticket. The graph routed it to the renewal owner the same day, three months before the renewal conversation.
- Post-QBR · expansion signal · found revenue. Three users on a team that had never bought asked about forecasting features on product calls, a month apart, to different reps. Nobody connected them. The graph did, and it turned into an expansion conversation.
That's as deep as I go publicly. The phase names, the schema, the consolidation logic come work here.
The results
The first result showed up on day one and it was not fun. The double-counted buying group surfaced immediately. Same three signatories on two supposedly different deals. 4% of pipeline, gone. Somebody had to stand in front of the board and present the smaller number. Honesty costs you something up front. It costs less than finding out in week thirteen.
Then "last activity" started meaning last customer touch instead of last rep edit. One definition change, and it did more for the truthfulness of the forecast than any dashboard they had built. I'll also admit the part that was humbling for us: the silence alerts fired false positives for the first two weeks and the reps grumbled about it. Tuning gap detection against actual human behavior is harder than it looks. Then one of those alerts caught a deal everyone assumed was cruising, and the grumbling stopped.
Two quarters later, the forecast landed within a few points of actuals, and then it did it again. Across our named customers, reported accuracy gains sit in the 15 to 25% range. Snowflake's story is public.
{{number}}
Their CRO said something we've been stealing for decks ever since: the platform didn't make his team smarter. It made his pipeline honest.
It isn't one story either. A security software company found its CS team had been sitting on expansion signals for months. The same feature kept coming up, asked about by different people on different calls, and nobody had connected them. When the graph did, a double-digit percentage of the next quarter's pipeline came out of accounts they already had. A storage infrastructure company ran the graph against its renewal book and found that a fifth of their "green" renewals had an unanswered risk signal sitting somewhere in support tickets or call transcripts. Their renewals team ended up rebuilding the whole green, yellow, red process around what the graph could see and they couldn't.
Different companies, same shape. The revenue wasn't missing. The memory was.
If you're evaluating anything with "context graph" on the label, including ours, ask three questions. Where does my reconciled data live? What happens when nobody asks anything? And can I see it run on my pipeline instead of on a landing page?
±3 pts
forecast vs actuals · two consecutive quarters (was −18%)
4%
phantom pipeline found & removed on day one
3h → min
monday commit scrub, now review-by-exception
2
champion departures caught early next quarter · one deal re-threaded and won
