Every AI CRM advances your deals. Mine refuses to.
A prospect says “let me think about it” and an optimistic agent moves the card to Proposal. Nobody agreed to anything, but the board looks healthy and the forecast climbs. sales-pipeline inverts that: a deal changes stage only on a logged buyer signal, and a script checks every transition and prints PASS or FAIL with a count.
For founders and operators whose pipeline only ever moves forward — and who have stopped trusting the number at the bottom of it.

opvs-skills install @di-atomic/sales-pipelineThen say: “create a deal for this prospect” or “move this deal to the next stage”.
Why a moving pipeline isn’t a forecast
buyer: "let me think about it" → moveTask(deal, "Proposal") stage: Proposal ✓ weighted: +$40,000 (no budget, no next meeting, no second stakeholder, no signal — and no error)
Cards move right. The weighted total climbs. You feel like you had a good week, and you hire against a number nobody agreed to.
buyer: "let me think about it" → classify → not a buyer signal stage: unchanged addComment: stall logged next_touch_at set verify-stage-progression-evidence → 6/6 transitions evidenced PASS
The deal stays where it is and the stall becomes visible, which is the only state a follow-up cadence can fire against.
An agent that advances a deal on its own optimism isn’t forecasting. It’s lying to you politely.
What you actually get
Refusal, enforced by a script
A forward move needs a logged buyer signal dated at or after the deal entered its current stage. verify-stage-progression-evidence.mjs checks every transition and prints PASS or FAIL. A rule the agent can talk itself out of is not a rule.
No CRM to integrate
The AgentBoard you already run is the CRM: columns are stages, a card is a deal, custom_fields is the deal data. No sync, no field mapping, no second source of truth. lint-external-crm-mentions.mjs fails any output that suggests bolting one on.
Pressure gated out of regulated deals
For REACH, CLP and biocide buyers the process discipline stays and the pressure goes: no manufactured urgency, no insistence closes, no absolute claims. Supply-chain role is captured at qualification because it changes the legal obligation.
The two things it got me to change


One deal, start to gate
> a reply lands from a chemicals importer createTask(deals) deal created, contact + company linked compose dossier ICP fit + company + persona + activity + next action verify-dossier-coverage .. PASS 5/5 sections present compliance gate .......... PASS supply-chain role = importer, claims linted moveTask → Qualified evidence: dossier complete > two days later: "send it over, but I need to loop in our RA lead" moveTask → Proposal evidence: buyer requested materials + named a stakeholder verify-stage-progression-evidence .... PASS 2/2 transitions evidenced > a week of silence moveTask → Negotiation BLOCKED no logged signal since Proposal → stays put. next_touch_at set. the stall is now visible.
The last block is the whole product. A deal that goes quiet stays where it is, so the number on your board keeps meaning something.
Where it stops

I built this by dogfooding the same stack I run for clients.
sales-pipeline is one skill in the system behind Di-Atomic — the marketing & compliance agency that runs cognitoAI, SpiderIQ and OPVS. If you want a pipeline whose forecast you can actually spend against, operated by an agent that tells you when a deal has gone quiet instead of quietly moving it along — in any of our seven languages, including regulated categories like REACH and CLP — that’s the day job. Let’s talk.
Book a 30-min call with Di-AtomicJust want the skill? Install @di-atomic/sales-pipeline free.