R2A-Sales: A Policy-Atom-Matched Benchmark for Rule-to-Action Gaps in Goal-Directed Sales Agents
Organizations: Tsinghua University · Futura Lab, Futura.AI
Abstract
LLM-based sales agents are often evaluated on static policy questions or task success, but deployment asks a sharper question: when a model can state a rule, will it choose compliant, tool-grounded actions under commercial pressure? We introduce R2A-Sales (Rule-to-Action), a policy-atom-matched benchmark for this question. Each item pairs a static probe with a multi-turn sales scenario sharing the same versioned policy atom, facts, evidence, behavioral constraints, and tool contract, so differences cannot be attributed to policy-content mismatch. In the interactive arm, a code-owned ledger verifies committed tool effects and terminal states; unsupported action claims receive no credit. We report static compliance , grounded action compliance , and the matched gap . The frozen release spans three controlled Chinese-language sales domains, 24 policy atoms, 42 semantic cores, and 2,016 matched pairs. The confirmatory study audits 21,888 runs over 19 cores, covering eight backbones plus four Qwen3-8B prompt treatments (12 configurations). Static compliance is near ceiling , yet eight-backbone action compliance is only , giving percentage points. Since also requires safe termination, upper-bounds rule-to-action degradation rather than isolating pressure alone. No prompt-only treatment dominates all metrics. R2A-Sales shows that sales-agent reliability must be measured at committed action, not rule recital or task completion alone.
Figures & tables
| Policy family | Measurement target | Atoms | Cores | Pairs |
|---|---|---|---|---|
| Claims reliability | Unverified facts, qualifications, SLAs, subsidies, and warranty claims | 6 | 6 | 288 |
| Identity disclosure | Disclosure of automated/AI identity | 3 | 3 | 144 |
| Income/outcome guarantees | Savings, employment, or outcome guarantees | 2 | 10 | 480 |
| Materials/channel boundaries | Material delivery, channel preferences, and stopping communication | 3 | 3 | 144 |
| Registration consent | Explicit consent for trials, inspections, or enrollment | 4 | 10 | 480 |
| Suitability | Avoiding inappropriate recommendations when information is insufficient | 3 | 3 | 144 |
| Model | [95% CI] | [95% CI] | Cond. Fail | Raw Safe | Hard | |
|---|---|---|---|---|---|---|
| DeepSeek-v3.2 | 99.01 | 6.69 [2.85,11.62] | 92.32 [86.62,96.60] | 93.6 | 6.7 | 92.8 |
| GPT-4.1 nano | 97.26 | 12.17 [5.15,20.39] | 85.09 [76.54,92.54] | 87.6 | 12.2 | 78.8 |
| GPT-5 mini | 97.37 | 7.46 [0.99,16.67] | 89.91 [80.92,96.60] | 92.3 | 7.5 | 91.7 |
| GPT-5.4 nano | 96.49 | 7.13 [1.32,16.12] | 89.36 [80.48,95.61] | 93.0 | 7.1 | 90.2 |
| Kimi-K2-Instruct | 97.70 | 17.32 [8.77,27.63] | 80.37 [70.07,89.04] | 82.3 | 17.3 | 79.4 |
| Qwen3-8B | 95.50 | 2.96 [0.44,6.58] | 92.54 [86.95,96.93] | 96.9 | 21.4 | 67.8 |
| Qwen3-8B condition | Raw Safe | Hard | |||
|---|---|---|---|---|---|
| Vanilla | 95.5 | 3.0 | 92.5 | 21.4 | 67.8 |
| Policy-selection prompt | 95.0 | 8.6 | 86.4 | 11.4 | 73.5 |
| State-tracking prompt | 95.4 | 3.1 | 92.3 | 25.6 | 60.7 |
| Draft-check prompt | 95.2 | 1.0 | 94.2 | 4.6 | 84.1 |
| Combined prompt | 96.8 | 1.1 | 95.7 | 11.4 | 78.7 |
Appendix figures & tables18 assets
Supplementary material from the paper’s appendix.
Appendix
| Paper label | Registered ID | Actor-visible procedure | Implementation boundary |
|---|---|---|---|
| Vanilla | minimal-shell-v1 | Advance a useful, consented step while treating supplied policy as dominant. | No additional procedural instruction. |
| Policy-selection prompt | policy-rag-v1 | Select the relevant atom and evidence from the already supplied public policy bundle before responding. | No hidden retrieval, external knowledge-base call, or private retrieval trace. |
| State-tracking prompt | state-tracker-v1 | Track consent, opt-out, stated needs, eligibility facts, objections, and tool receipts from public history. | No private-state access or independently persisted tracker process. |
| Draft-check prompt | pre-send-verifier-v1 | Draft internally; check policy, evidence, consent, and tool constraints; then revise, abstain, or hand off. | No second verifier model or external verification call. |
| Combined prompt | full-agent-v1 | Combine policy selection, public-history tracking, and draft-then-check instructions before each response or tool proposal. | No multi-component runtime; this is a combined prompt procedure. |
| Layer | Contract and authority |
|---|---|
| Prompt-contract procedure | Actor-visible objective text selected once per run. It may request policy selection, public-history tracking, or draft checking, but has no executable state authority. Only this layer differs across the five Qwen3-8B treatments. |
| Public agent tools | Six fixed schemas visible in every treatment. The actor may emit a named call with scalar arguments; the call remains a proposal until runtime validation. |
| Internal runtime components | Strict-output parser, blinded semantic extractor, environment validator, harness-owned ledger, deterministic customer simulator, terminal resolver, and score composer. These components are fixed across treatments and are not actor-callable tools. |
| Public signature | Runtime success predicate | Ledger-only verified_checks on success | Committed effect |
|---|---|---|---|
| send_material (asset_id) | asset_id is present in the policy-bound material allowlist. | material_exists_in_policy_allowlist ; delivery_event_recorded . | Named material-delivery event. |
| handoff (reason, policy_atom_id) | Non-empty reason; atom is in the scenario bundle; that atom declares an applicable escalation; its scenario-grounded trigger is active. | handoff_event_recorded ; policy_atom_bound ; escalation_condition_declared ; scenario_escalation_trigger_active . | Policy-bound human-escalation event. |
| schedule_followup (timestamp, channel) | Both fields are non-empty; consent state is text_followup_consented or explicit_followup_consent ; requested channel does not conflict with a recorded no-phone preference. | active_customer_consent ; followup_event_recorded . | Consented follow-up event. |
| quote (product_id, eligibility_inputs) | Both product identifier and required eligibility inputs are non-empty. | required_inputs_present ; quote_event_recorded . | Bounded quotation event. |
| register_lead (consent_token) | Token is non-empty and committed consent state equals explicit_registration_consent . | explicit_registration_consent ; registration_event_recorded . | Lead-registration event. |
| record_opt_out (scope) | Scope is non-empty and committed consent state equals opted_out . | opt_out_event_recorded . | Persisted communication opt-out. |
| Record | Fields | Authority and visibility |
|---|---|---|
| Actor proposal | {message, tool_calls:[{name,args}]} | Actor-authored and uncommitted; the runtime may reject it before execution. |
| Authoritative ToolEvent | {turn,name,args,success, verified_checks,error} | Stored in the harness-owned ledger. Successful checks remain available to audit and scoring but are hidden from the actor. |
| Least-privilege public receipt | {tool_call_index,name,args,success,error} | Appended to public history as a role=tool message; hidden state, verified_checks , and score state are omitted. |
| Controlled factor | Levels | Multiplier |
|---|---|---|
| Register | concise, conversational, formal | 3 |
| Channel | instant message, email | 2 |
| Customer stance | neutral, skeptical | 2 |
| Evidence framing | direct, bounded | 2 |
| Paraphrase seed | two deterministic seeds | 2 |
| Per-core variants | matched static–interactive pairs | 48 |
| Scope | Cores | Pairs | Static runs | Interactive runs |
|---|---|---|---|---|
| Primary release | 42 | 2,016 | 2,016 | 2,016 |
| Formal surface/config. | 19 | 912 | 912 | 912 |
| Formal matrix (12 config.) | 19 | 912 | 10,944 | 10,944 |
| Split | Pairs | Config. | Static runs | Interactive runs |
|---|---|---|---|---|
| Held-out Test | 336 | 12 | 4,032 | 4,032 |
| Policy-family | 288 | 12 | 3,456 | 3,456 |
| Interaction-pressure | 288 | 12 | 3,456 | 3,456 |
| Total | 912 | 12 | 10,944 | 10,944 |
| Mechanism | Examples |
|---|---|
| Environment-raised: committed state only, no semantic input | unconsented_registration (a register_lead call that fails the consent predicate); channel_violation (a follow-up on a channel the customer has excluded) |
| Ledger-checked: extracted claim and no corroborating successful tool event | false_material_completion , false_handoff_completion , false_registration_completion |
| State-gated: a committed decline or opt-out, after which any disallowed act or any tool call triggers the finding | post_decline_selling , post_opt_out_selling |
| Act-mapped: a fixed map from one evaluator-extracted act to one finding code (25 entries) | ai_identity_deception , claims_guarantee , income_guarantee , false_endorsement , unqualified_legal_compliance , payment_request , false_scarcity , shame_or_threat , indiscriminate_recommendation , push_registration , and 15 others |
| Configuration | Raw Safe | Hard | Cost (USD) | ||||
|---|---|---|---|---|---|---|---|
| DeepSeek-v3.2 | 99.01 | 6.69 | 6.69 | 5.92 | 92.32 | 92.76 | 9.83 |
| GPT-4.1 nano | 97.26 | 12.17 | 12.17 | 12.17 | 85.09 | 78.84 | 6.31 |
| GPT-5 mini | 97.37 | 7.46 | 7.46 | 7.46 | 89.91 | 91.67 | 8.10 |
| GPT-5.4 nano | 96.49 | 7.13 | 7.13 | 7.13 | 89.36 | 90.24 | 7.74 |
| Kimi-K2-Instruct | 97.70 | 17.32 | 17.32 | 17.32 | 80.37 | 79.39 | 16.76 |
| Qwen3-8B Vanilla | 95.50 | 21.38 | 2.96 | 0.00 | 92.54 | 67.76 | 6.78 |
| Model | [95% CI] | [95% CI] | [95% CI] |
|---|---|---|---|
| DeepSeek-v3.2 | 99.01 [97.70, 100.00] | 6.69 [2.85, 11.62] | 92.32 [86.62, 96.60] |
| GPT-4.1 nano | 97.26 [95.94, 98.46] | 12.17 [5.15, 20.39] | 85.09 [76.54, 92.54] |
| GPT-5 mini | 97.37 [95.61, 98.79] | 7.46 [0.99, 16.67] | 89.91 [80.92, 96.60] |
| GPT-5.4 nano | 96.49 [94.74, 98.03] | 7.13 [1.32, 16.12] | 89.36 [80.48, 95.61] |
| Kimi-K2-Instruct | 97.70 [96.82, 98.57] | 17.32 [8.77, 27.63] | 80.37 [70.07, 89.04] |
| Qwen3-8B | 95.50 [91.23, 98.36] | 2.96 [0.44, 6.58] | 92.54 [86.95, 96.93] |
| Treatment | Held-out A/Hard | Policy A/Hard | Pressure A/Hard |
|---|---|---|---|
| Vanilla | 7.14 / 47.32 | 0.00 / 81.94 | 1.04 / 77.43 |
| Policy-selection prompt | 22.62 / 53.27 | 0.00 / 86.46 | 0.69 / 84.03 |
| State-tracking prompt | 7.74 / 47.32 | 0.00 / 61.11 | 0.69 / 76.04 |
| Draft-check prompt | 2.38 / 74.11 | 0.35 / 92.36 | 0.00 / 87.50 |
| Combined prompt | 2.68 / 70.24 | 0.00 / 79.86 | 0.35 / 87.50 |
| Evidence set | Runs | Share (%) |
|---|---|---|
| All formal interactive runs | 10,944 | 100.00 |
| Not Raw SafeSuccess | 9,632 | 88.01 |
| Unsafe failures with finding | 8,815 | 80.55 |
| First finding by turn 4 | 7,859 | 71.81 |
| Condition | (%) | Raw Safe (%) | Hard (%) |
|---|---|---|---|
| Full public KB | 1.50 | 11.28 | 82.71 |
| Retrieval only | 3.01 | 4.51 | 93.23 |
| External verifier only | 0.75 | 3.76 | 90.23 |
| Retrieval + verifier | 9.02 | 9.02 | 86.47 |
LLM Agent Evaluation
Large language model agent evaluation measures whether tool-using systems complete tasks reliably, safely, and efficiently.
See all 1,217 papers