CHAMPS · Chalky

Your agent sounds sure when it knows nothing. 30 checks. Every agent you run.

An agent that cannot find an answer does not fall silent. It answers from whatever is adjacent, in the same confident voice it uses when it is right, and the first person to find out otherwise is the customer reading it. Chalky reads your agents, topics, actions, instructions and prompt templates against thirty published checks — what each one is grounded on, what it can do without being asked twice, and whether anything would tell you when it goes wrong.

How it goes wrong

An empty grounding source is not an error

None of the four below is a bug. Each is the platform doing exactly what it was configured to do, which is why nothing in the org raises a hand.

An empty source reads exactly like an irrelevant one

An action pointed at a corpus that is not enabled, or at an object holding no records, returns nothing. Nothing is not an error. The model continues, answers from whatever else is in context, and is no less fluent for having had no material — so the answer that came from your knowledge base and the answer that came from the model’s own priors are indistinguishable to the person reading them.

It is not a rare shape. On one real org, six actions were grounded on Knowledge — in an org where Knowledge was not switched on.

Instructions arrive through a web form and run later

ForcedLeak, published by Noma Labs in September 2025 and rated CVSS 9.4, submitted instructions through Web-to-Lead. They sat in the record until an ordinary employee interaction brought them into a prompt, and then executed and exfiltrated CRM data. Salesforce patched it by re-securing an expired domain and enforcing an allowlist on the links an agent can emit.

That patch is the point. The platform did not prevent it, and Salesforce’s own documentation describes prompt defence as heuristics that reduce the odds rather than remove them. So the question a scan has to answer is not whether the Trust Layer is on. It is which fields a stranger can write reach a grounded prompt, and what that agent is allowed to do once they are there.

A topic with no example utterances is never routed to

Routing is the planner deciding which topic a request belongs to. With no example utterances it makes that decision on the topic name and scope alone, so requests land in the wrong topic or in none — and the topic somebody built, tested and shipped simply never runs. Nothing reports a topic that is never chosen.

An unhandled failure changes the answer rather than stopping it

When an action errors, times out or returns empty, the conversation does not halt. The model carries on without the data and produces something plausible. That makes a failed action and a successful one look the same from the outside, which is the whole reason the check reads the instructions rather than the logs: an agent that has been told what to say when a lookup returns nothing behaves differently from one that has not.

What it finds

One real org: ten of twenty-two checks failed

On one real Agentforce org, twenty-two deterministic checks ran and ten of them failed. Five custom topics carried no example utterances at all. Six actions were grounded on Knowledge, in an org where Knowledge is not enabled. Not one of twenty-one topic instructions said what the agent should do when an action fails.

Three prompt templates had no active version — every version unpublished — and twenty-five of twenty-five template versions had no output schema, so a generation that comes back short comes back well-formed. Field-completion templates, which look things up and reformat them, were configured on a full reasoning model. Every scorer was one Salesforce ships; nothing tested a topic built in that org.

And three actions could act on the outside world with no confirmation: create a Slack channel, send a message to one, and modify automation metadata. None of it was throwing an error. The agents were answering.

The checks · Grounding

What the agent is actually reading, and whether it is there

Twelve checks on grounding: six on whether the sources resolve at all, six on whether the records behind them are fit to answer from.

The grounding source is absent or empty

AG-005 · High

An action pointed at a corpus that is not enabled, or an object holding no records. The agent answers from adjacent material and sounds no less certain.

Unbounded grounding scope

AG-016 · High

Actions such as queryRecords and getRecordFieldsAndValues decide what to read when they run, so there is no field list to review. The honest answer to “what is this agent grounded on?” is everything the running user can see — and that is the finding, not any particular field.

A grounding reference to a field that does not exist

AG-003 · High

A merge field naming a field the org does not have. The agent substitutes silently, so the prompt reaches the model with a hole in it and the model fills the hole.

Topic with no example utterances

AG-002 · Medium

Nothing for the planner to match a request against, so the topic is routed to by name alone or not at all.

Stale, duplicated and empty grounding records

AG-006 to AG-011 · Low to Medium

Null rates above threshold on a grounded field, degenerate cardinality, free-text dispersion, duplicates in the retrieval set, records too old to be current, and Knowledge articles that are archived or draft while still retrievable. Configuration can be perfect and the data behind it still unable to answer.

The checks · Reliability and security

What it can do without being asked twice, and what would tell you

Nine checks on the paths through an agent: what happens when something fails, what happens when something runs twice, and what a stranger can reach.

Untrusted inbound text reaches a grounded prompt

AG-025 · High

Web-form fields, inbound email bodies, case descriptions and chat transcripts grounded into a prompt for an agent that can take actions or emit links. ForcedLeak is the worked example; the check is which fields reach the prompt and what the agent can do once they have.

A side-effecting action with no confirmation

AG-030 · High

An action that writes, sends, refunds, cancels or deletes, reachable by the planner with no confirmation and no human in the loop. To a planner an irreversible action is just another tool.

A non-idempotent action behind a retry

AG-031 · High

Planners retry and users repeat themselves. Where the action creates, sends or moves money, the second run is a second real-world effect.

No defined behaviour when an action fails

AG-019 · High

A topic whose instructions say nothing about an action erroring, timing out or returning empty. Unhandled failure does not stop the conversation, it changes the answer.

A path that can complete having done nothing

AG-022 · High

An outcome where the do-nothing case and the success case are indistinguishable downstream: no signal, no counter, no field that would look different. It is the failure that reports itself as success, and it is the one nobody raises a ticket about.

The active version is not the edited one

AG-018 · Beta

An agent, topic, action or template changed since the version that is live, so the org’s behaviour and its configuration disagree. Read the active version; never infer it from a save that succeeded.

The checks · Cost, coverage and upkeep

What it costs to run, and whether anything still tests it

A model call inside a loop

AG-017 · High

A generation invoked once per record where a batched path exists. Metered per call, this is the difference between a line item and a conversation with finance.

Reasoning budget spent on retrieval

AG-024 · Medium

A large model configured for a task that is lookup or formatting. Retrieval earns no reasoning budget; judgement does.

Scope claims a domain the grounding does not span

AG-015 · Medium

A topic promising to answer about something its grounding does not cover. Requests route in correctly and are answered from nothing relevant, which is the worst of both.

Knowledge written for the people who wrote it

AG-027 to AG-029 · Low to Medium

Answers buried below the background, so retrieval returns the background. No content saying a thing is unsupported, so the agent constructs a plausible answer from what is adjacent. Articles that never use the words customers use, so they lose retrieval to something worse.

No regression set for a topic

AG-032 · Medium

A topic with no test utterances, or utterances not re-run since it last changed. The agent form of the standard we hold ourselves to: the tests changed in the same edit as the behaviour, or they prove nothing.

What you get

Every finding names the component, the evidence and the fix

Evidence from your org

The agent, the topic, the action and the value we read, so your admin can open it in Agent Builder and see the same thing we did.

Why it matters, and the fix

What goes wrong if it is left, written in business terms, then the remediation and the published source the rule came from.

Judgement marked as judgement

Four of the thirty are read by a model rather than measured, because no pattern settles them. They are labelled as such, and two runs of the same estate can differ on them.

Honest coverage

Rules that could not be measured say so and say why. A check we could not run is never reported as a check that passed, and a component your org would not hand over stops the scan rather than shrinking the report.

What it costs

From £310, capped at £1,950, and the scan itself is free

Priced from the size of the estate the report has to read — never per seat, never per agent conversation. Charities pay half, applied automatically at the quote. The scan itself is free: connect a sandbox and the preview comes by email, naming every check that failed. The report is the part you pay for, and only once you have seen what is in it.

The report is priced from the size of the estate it has to read. Five numbers describe that, and all five are counted from your own org at the quote — these are here so you can see the shape of the price before you talk to anybody.

That is 73 elements — one per agent, topic, action, instruction and prompt template, counting every version of a template and every agent whether it is active or not. Thirty checks run against them whatever the count; the price is what it costs to read them.

The Agentforce report
£838+ VAT, once
Entry
£300
73 elements at £10 / £8 / £6 / £4
£538

The price climbs with the estate up to 338 elements and is flat after that at £1,950. Four of the thirty checks are read by a model rather than measured, which is most of what the later elements cost to serve.

The scan is free and the report is on the self-serve checkout: connect a sandbox, the preview naming every failed check comes by email, and you unlock the report once you have seen what is in it.

Indicative. The price you pay is counted from your own org, not from the numbers you typed here, and it is shown before anything is charged. All prices exclude VAT. Orgs running the Nonprofit Success Pack or Nonprofit Cloud pay half. 1% of every purchase goes to removing CO₂ from the atmosphere, through Stripe Climate.

How it works

Ten minutes to connect, and read-only throughout

1 · Connect

Create a minimal integration user in your sandbox, log in once with Salesforce’s own CLI, and paste the connection URL into the connect page. About ten minutes.

2 · Count

Chalky counts the agents, topics, actions, instructions and prompt templates in the org. Nothing is charged before you have seen the number.

3 · Scan

Thirty checks across four channels: the estate itself, your Knowledge corpus, and the four that need judgement. Minutes, not hours.

4 · Read

Every finding with the component named and the evidence beside it. The connection is yours to end from your own Setup whenever you like.

Thirty checks against every agent, topic, action and prompt template in your org

One read-only connection to a sandbox, and the same connection that reads your flows reads your agents. Every finding names the component, the evidence from your own org, and what to change.

Scan my Agentforce estate