Data analytics · workflow choice
Why Cautela starts with unrecognized-charge disputes
12,297of 67,095 complaints
are “cargo no reconocido”, a charge the customer does not recognize (called disputes on this page): 18.3% of all complaints, the largest of 10 complaint types, ahead of the next one by only 103 complaints (their 95% intervals overlap).
Organizer dataset, which is synthetic: nothing here describes a real bank. Warehouse warehouse_real.duckdb, gold run 20260927T012755Z-994fa0.
- SLA breached
- 20.4%of disputes
- 2,507 of 12,297 disputes
- Resolution time
- 15days median, 27 at p90
- measured on the 2,862 disputes with a resolution time
- Daily demand
- 11.2disputes per day
- p95 18 per day, max 26 per day, over 1,098 days
- Largest intake channel
- 50.4%Call Center
- 6,192 of 12,297 disputes
01
The largest complaint type, by a thin margin
Five complaint types sit within a few hundred complaints of each other. The volume lead alone would not justify the choice; the checks below and the fact that a disputed charge can be verified against the customer's own transactions do.
Complaints by type
Count of complaints per type, out of 67,095. Highlighted bar: unrecognized charge.
Show the numbers
| Complaint type | Complaints | Share | 95% CI |
|---|---|---|---|
| Transactions: unrecognized charge (Cargo no reconocido) | 12,297 | 18.3% | 18.0% to 18.6% |
| Fees: wrongful charge or fee (Cobro indebido) | 12,194 | 18.2% | 17.9% to 18.5% |
| Technical: app problem (Problema con app) | 12,128 | 18.1% | 17.8% to 18.4% |
| Branch: branch service (Atención en sucursal) | 11,892 | 17.7% | 17.4% to 18.0% |
| Service: service quality (Calidad de servicio) | 11,886 | 17.7% | 17.4% to 18.0% |
| Branch, no subcategory | 1,469 | 2.2% | 2.1% to 2.3% |
| Fees, no subcategory | 1,359 | 2.0% | 1.9% to 2.1% |
| Service, no subcategory | 1,308 | 1.9% | 1.8% to 2.1% |
| Transactions, no subcategory | 1,283 | 1.9% | 1.8% to 2.0% |
| Technical, no subcategory | 1,279 | 1.9% | 1.8% to 2.0% |
Source: data_analytics/reports/workflow_comparison.json
SLA breached, by complaint type
Share of each type's complaints whose SLA was breached, with its 95% interval. Axis from 15% to 25%. Every type falls between 18.1% and 20.6%, so this metric cannot rank workflows.
Show the numbers
| Complaint type | SLA breached | Rate | 95% CI | Resolution p50 / p90 (days) |
|---|---|---|---|---|
| Transactions: unrecognized charge (Cargo no reconocido) | 2,507 / 12,297 | 20.4% | 19.7% to 21.1% | 15 / 27 |
| Fees: wrongful charge or fee (Cobro indebido) | 2,431 / 12,194 | 19.9% | 19.2% to 20.6% | 16 / 27 |
| Technical: app problem (Problema con app) | 2,429 / 12,128 | 20.0% | 19.3% to 20.8% | 16 / 28 |
| Branch: branch service (Atención en sucursal) | 2,421 / 11,892 | 20.4% | 19.6% to 21.1% | 16 / 28 |
| Service: service quality (Calidad de servicio) | 2,412 / 11,886 | 20.3% | 19.6% to 21.0% | 16 / 28 |
| Branch, no subcategory | 303 / 1,469 | 20.6% | 18.6% to 22.8% | 16 / 28 |
| Fees, no subcategory | 249 / 1,359 | 18.3% | 16.4% to 20.5% | 14 / 28 |
| Service, no subcategory | 259 / 1,308 | 19.8% | 17.7% to 22.1% | 16 / 28 |
| Transactions, no subcategory | 232 / 1,283 | 18.1% | 16.1% to 20.3% | 16 / 28 |
| Technical, no subcategory | 252 / 1,279 | 19.7% | 17.6% to 22.0% | 16 / 27 |
Source: data_analytics/reports/workflow_comparison.json
02
Seven candidate workflows, ranked by the hours they leave unresolved
Contact reasons stand in for the workflows a bank could automate. Ranked by agent-hours spent on contacts not resolved the first time, disputes come last; the choice rests on verifiability instead.
Scroll sideways inside the table for all 8 columns.
| Rank | Workflow(team judgment) and data proxy(team judgment) | Contacts per year | Handling time | First-contact resolution | Agent-hours per year | Unresolved-contact hours per year | Verifiable against records(team judgment), and the record that settles it(team judgment) |
|---|---|---|---|---|---|---|---|
| 1 | (not a named workflow) general complaintscontact reason Complaint | 38,900 | 435 s | 43.6% | 4,696.2 h | 2,648.7 h | nocomplaint types are mixed and 0 complaints link to a contact; only the dispute subtype names a fact a record can check |
| 2 | (not a named workflow) technical supportcontact reason Technical | 34,206 | 361 s | 69.9% | 3,425.0 h | 1,029.8 h | noapp faults have no record in the data |
| 3 | Credit-product information and eligibilitycontact reason Commercial | 18,243 | 540 s | 65.2% | 2,736.1 h | 951.9 h | nono approved eligibility policy in the data; the problem statement requires a labeled synthetic policy service |
| 4 | Account or payment inquiriescontact reason Transactional | 79,800 | 221 s | 91.5% | 4,894.5 h | 415.6 h | partlybalances and transactions answer the question, but what the customer asked is not recorded (one detected-intent value over all transcripts) |
| 5 | Card-service supportcontact reason Product | 50,150 | 266 s | 89.6% | 3,710.9 h | 385.0 h | partlyproduct status and expiry are recorded; card actions (block, replace) have no outcome record |
| 6 | (not a named workflow) retentioncontact reason Retention | 6,841 | 479 s | 60.2% | 910.6 h | 362.8 h | noa retention offer has no right answer in the records |
| 7 | Transaction-dispute intake (unrecognized charge)chosenunrecognized-charge complaints (Cargo no reconocido); handling time and FCR of the Complaint reason | 4,088 | 435 s | 43.6% | 493.5 h | 278.3 h | yesthe customer's own transactions, with merchant, channel, amount and date |
Team judgment, not measured: the workflow each contact reason stands for, whether its outcome can be verified, and the record that would settle it. Unresolved-contact hours = agent-hours per year × (1 − first-contact resolution). All contact-center handling adds up to 20,373.3 agent-hours per year.
Disputes rank 7 of 7 by these hours (278.3 h per year). They were chosen for verifiability: the customer’s own transactions settle each outcome, and 73.2% (8,998 of 12,297) of dispute complaints have a charge of the customer in the 90 days before, where the agent looks.
Source: data_analytics/reports/insights.json, workflow_ranking
03
Where disputes arrive, and how complaint contacts end
Half of the disputes come in by phone. In the contact center, complaint contacts have the lowest first-contact resolution of any reason.
Disputes by reception channel
Share of 12,297 unrecognized-charge complaints, by the channel that received them.
Show the numbers
| Channel | Complaints | Share |
|---|---|---|
| Call Center | 6,192 | 50.4% |
| 2,388 | 19.4% | |
| Web | 1,807 | 14.7% |
| App | 1,299 | 10.6% |
| Branch | 473 | 3.8% |
| Regulator | 138 | 1.1% |
Source: data_analytics/reports/dispute_channel_mix.json
First-contact resolution, by contact reason
Share of contact-center interactions resolved on the first contact, with its 95% interval. All reasons together: 76.6%.
Show the numbers
| Contact reason | Resolved first time | Rate | 95% CI | Mean handling (s) |
|---|---|---|---|---|
| Complaint | 51,021 / 117,021 | 43.6% | 43.3% to 43.9% | 435 |
| Retention | 12,380 / 20,578 | 60.2% | 59.5% to 60.8% | 479 |
| Commercial | 35,786 / 54,879 | 65.2% | 64.8% to 65.6% | 540 |
| Technical | 71,959 / 102,899 | 69.9% | 69.7% to 70.2% | 360 |
| Product | 135,213 / 150,863 | 89.6% | 89.5% to 89.8% | 266 |
| Transactional | 219,671 / 240,056 | 91.5% | 91.4% to 91.6% | 221 |
Source: data_analytics/reports/fcr_by_contact_reason.json
Read with care. 43.6% is the contact center’s first-contact resolution for the Complaint reason (51,021 / 117,021). It cannot be linked to disputes: 0 of 67,095 complaints name the interaction they came from, and which reason a disputed-charge call is filed under is not recorded. Filed as Transactional, its rate would be 91.5%.
04
When disputes arrive
Tuesday to Friday carry the load, Monday is lower and weekends drop. Across the hours of the day the profile is nearly flat.
Disputes by weekday
Unrecognized-charge complaints per ISO weekday, out of 12,297.
Show the numbers
| Weekday | Complaints | Share |
|---|---|---|
| Mon | 1,657 | 13.5% |
| Tue | 1,995 | 16.2% |
| Wed | 2,067 | 16.8% |
| Thu | 2,065 | 16.8% |
| Fri | 2,066 | 16.8% |
| Sat | 1,416 | 11.5% |
| Sun | 1,031 | 8.4% |
Source: data_analytics/reports/demand_by_weekday.json
Disputes by hour of day
Complaints per hour as stored, out of 12,297. The data dictionary gives no timezone, so the hours may be shifted.
Show the numbers
| Hour | Complaints | Share |
|---|---|---|
| 00:00 | 485 | 3.9% |
| 01:00 | 539 | 4.4% |
| 02:00 | 521 | 4.2% |
| 03:00 | 509 | 4.1% |
| 04:00 | 489 | 4.0% |
| 05:00 | 525 | 4.3% |
| 06:00 | 517 | 4.2% |
| 07:00 | 507 | 4.1% |
| 08:00 | 513 | 4.2% |
| 09:00 | 537 | 4.4% |
| 10:00 | 518 | 4.2% |
| 11:00 | 531 | 4.3% |
| 12:00 | 497 | 4.0% |
| 13:00 | 475 | 3.9% |
| 14:00 | 494 | 4.0% |
| 15:00 | 535 | 4.4% |
| 16:00 | 506 | 4.1% |
| 17:00 | 528 | 4.3% |
| 18:00 | 508 | 4.1% |
| 19:00 | 522 | 4.2% |
| 20:00 | 521 | 4.2% |
| 21:00 | 534 | 4.3% |
| 22:00 | 455 | 3.7% |
| 23:00 | 531 | 4.3% |
Source: data_analytics/reports/demand_by_hour.json
05
By country and segment
Every country and segment files about 81 to 83 disputes per 1,000 customers. The need is the same everywhere, so one workflow can serve all three countries, each with its own claim-window rules: law where the team verified one, synthetic policy elsewhere.
Disputes per 1,000 customers, by country
Unrecognized-charge complaints divided by the country's customers, times 1,000.
Show the numbers
| Country | Complaints | Customers | Per 1,000 | SLA breached | Resolution p50 / p90 (days) |
|---|---|---|---|---|---|
| Mexico | 6,149 | 74,907 | 82.09 | 20.4% | 15 / 27 |
| Colombia | 3,727 | 45,251 | 82.36 | 20.2% | 15 / 28 |
| Argentina | 2,421 | 29,842 | 81.13 | 20.5% | 16 / 27 |
Source: data_analytics/reports/dispute_breakdowns.json
Disputes per 1,000 customers, by segment
Unrecognized-charge complaints divided by the segment's customers, times 1,000.
Show the numbers
| Segment | Complaints | Customers | Per 1,000 | SLA breached | Resolution p50 / p90 (days) |
|---|---|---|---|---|---|
| Basic | 7,414 | 89,756 | 82.6 | 20.1% | 16 / 27 |
| Plus | 3,029 | 37,547 | 80.67 | 21.6% | 15 / 28 |
| Premium | 1,229 | 15,207 | 80.82 | 20.9% | 15 / 26.19999999999999 |
| Student | 625 | 7,490 | 83.44 | 17.0% | 14 / 27 |
Source: data_analytics/reports/dispute_breakdowns.json
06
Does the disposition model act safely?
Offline evaluation on the fresh test split (test_fresh), evaluated once: 1,240 generated cases (749 with one matching charge, 243 ambiguous, 248 with none). A decision is correct when the system acts on the right charge, asks with the right charge among its options when the case is ambiguous, or stops when nothing matches; unsafe means it acted when it should not have: on the wrong charge when one matched, or on any charge when the case was ambiguous or nothing matched (ml/metrics.py).
- Correct decisions
- 89.8%vs 82.2% for the tuned rules baseline
- Unsafe actions
- 4of 1,240 cases, vs 24 for the baseline
Correct decisions, by system
Share of 1,240 cases decided correctly, with its 95% interval. Axis from 60% to 100%.
Show the numbers
| System | Correct | 95% CI | Acted | Asked | Stopped |
|---|---|---|---|---|---|
| Rules, fixed thresholds | 69.6% | 66.2% to 72.9% | 706 | 534 | 0 |
| Rules, tuned thresholds (baseline) | 82.2% | 79.5% to 84.8% | 617 | 241 | 382 |
| Learned ranker, calibrated thresholds | 76.5% | 73.9% to 79.2% | 600 | 157 | 483 |
| Learned ranker and disposition model (proposed) | 89.8% | 87.9% to 91.8% | 666 | 247 | 327 |
Source: ml/reports/results_fresh.json
Unsafe actions, by system
Cases where the system acted on the wrong charge, or acted at all on an ambiguous or no-match case, out of 1,240.
Show the numbers
| System | Unsafe | Cases | Acted on |
|---|---|---|---|
| Rules, fixed thresholds | 55 | 1,240 | 706 |
| Rules, tuned thresholds (baseline) | 24 | 1,240 | 617 |
| Learned ranker, calibrated thresholds | 19 | 1,240 | 600 |
| Learned ranker and disposition model (proposed) | 4 | 1,240 | 666 |
Source: ml/reports/results_fresh.json
07
What the dispute flow saves, and what one resolution costs
The range runs from the deployed configuration on chat disputes only to the decision component with call-center disputes routed to the same flow. Labor savings at this scale are small; section 02 gives the reason for the choice.
Conservative, chat only
50.9
agent-hours saved per year
USD 509 net per year
- Reach
- 25.3% of disputes (App and Web disputes)
- Automation rate
- 40.8%, end-to-end safe automated resolution, deployed
- Share of contact-center hours
- 0.25%
- Handoffs to a person
- 611 per year
Optimistic, with the call centerassumption
212.3
agent-hours saved per year
USD 2,123 net per year
- Reach
- 75.6% of disputes (App, Web and call-center disputes)
- Automation rate
- 56.9%, safe act rate (component)
- Share of contact-center hours
- 1.04%
- Handoffs to a person
- 1,332 per year
0 h487.1 h per year, highest scenario in the grid
Central handling time (7.24 min per dispute), USD 10 per agent-hour as a placeholder. A conversation the bot does not resolve safely is charged its tokens and then the full human handling time. Offline projection: no saving was measured in production.
Full grid: 12 scenarios of handling time, reach and rate
Scroll sideways inside the table for all 9 columns.
| Handling time | Reach | Rate | Disputes sent to the bot per year | Agent-hours saved per year | Agent-hours still needed per year | Share of contact-center hours | LLM cost per year | Net saved per year |
|---|---|---|---|---|---|---|---|---|
| low | App and Web disputes (25.3%) | end-to-end safe automated resolution, deployed (40.8%) | 1,032.6 | 25.9 h | 37.5 h | 0.13% | USD 0.21 | USD 258 |
| low | App and Web disputes (25.3%) | safe act rate (component) (56.9%) | 1,032.6 | 36.0 h | 27.3 h | 0.18% | USD 0.21 | USD 360 |
| low | App, Web and call-center disputes (75.6%) assumption | end-to-end safe automated resolution, deployed (40.8%) | 3,090.8 | 77.4 h | 112.2 h | 0.38% | USD 0.64 | USD 773 |
| low | App, Web and call-center disputes (75.6%) assumption | safe act rate (component) (56.9%) | 3,090.8 | 107.9 h | 81.7 h | 0.53% | USD 0.64 | USD 1,078 |
| central | App and Web disputes (25.3%) | end-to-end safe automated resolution, deployed (40.8%) | 1,032.6 | 50.9 h | 73.8 h | 0.25% | USD 0.21 | USD 509 |
| central | App and Web disputes (25.3%) | safe act rate (component) (56.9%) | 1,032.6 | 70.9 h | 53.7 h | 0.35% | USD 0.21 | USD 709 |
| central | App, Web and call-center disputes (75.6%) assumption | end-to-end safe automated resolution, deployed (40.8%) | 3,090.8 | 152.3 h | 220.8 h | 0.75% | USD 0.64 | USD 1,522 |
| central | App, Web and call-center disputes (75.6%) assumption | safe act rate (component) (56.9%) | 3,090.8 | 212.3 h | 160.8 h | 1.04% | USD 0.64 | USD 2,123 |
| high | App and Web disputes (25.3%) | end-to-end safe automated resolution, deployed (40.8%) | 1,032.6 | 116.7 h | 169.2 h | 0.57% | USD 0.21 | USD 1,167 |
| high | App and Web disputes (25.3%) | safe act rate (component) (56.9%) | 1,032.6 | 162.7 h | 123.2 h | 0.80% | USD 0.21 | USD 1,627 |
| high | App, Web and call-center disputes (75.6%) assumption | end-to-end safe automated resolution, deployed (40.8%) | 3,090.8 | 349.4 h | 506.6 h | 1.71% | USD 0.64 | USD 3,493 |
| high | App, Web and call-center disputes (75.6%) assumption | safe act rate (component) (56.9%) | 3,090.8 | 487.1 h | 368.8 h | 2.39% | USD 0.64 | USD 4,871 |
Source: data_analytics/reports/insights.json, projection_range
Cost of one resolution
- Human handling per dispute
- 7.24 mincomplaint-contact mean, one contact
- LLM cost per safe automated resolution
- 0.0006297USD, tokens only, measured
- LLM cost per conversation
- 0.0002068USD, tokens only, measured
- Hosting and compute
- not definednot measured, excluded from every figure
| Agent cost (placeholder) | Human cost per dispute | Cost per dispute sent to the bot, conservative rate |
|---|---|---|
| USD 5 per agent-hour | USD 0.60 | USD 0.3574 |
| USD 10 per agent-hour | USD 1.21 | USD 0.7146 |
| USD 20 per agent-hour | USD 2.41 | USD 1.4291 |
The bot column adds the tokens of every conversation and the full human cost of each one it does not resolve safely.
Source: data_analytics/reports/insights.json, cost_per_resolution
08
The queue a person still handles
Every dispute the bot does not resolve safely reaches a person with the full handling time. In every scenario that is a few handoffs a day and a fraction of one agent in the busiest hour.
- Disputes per day, all channels
- 11.2mean; p95 18.0, max 26 per day
- Agent-minutes in the busiest hour, heaviest scenario
- 2.3 minWednesday 08:00, disputes as stored
- Agent-minutes the contact center already handles in its busiest hour
- 170.4 minTuesday 03:00, all contact reasons
Scroll sideways inside the table for all 8 columns.
| Reach | Rate | Handoffs, share of disputes | Handoffs per day, mean | Handoffs per day, p95 | Handoffs in the busiest hour | Agent-minutes in the busiest hour | Agent-minutes on a p95 day |
|---|---|---|---|---|---|---|---|
| App and Web disputes | end-to-end safe automated resolution, deployed | 14.9% | 1.7 | 2.7 | 0.11 | 0.76 min | 19.5 min |
| App and Web disputes | safe act rate (component) | 10.9% | 1.2 | 2.0 | 0.08 | 0.55 min | 14.2 min |
| App, Web and call-center disputes assumption | end-to-end safe automated resolution, deployed | 44.8% | 5.0 | 8.1 | 0.31 | 2.27 min | 58.3 min |
| App, Web and call-center disputes assumption | safe act rate (component) | 32.6% | 3.7 | 5.9 | 0.23 | 1.65 min | 42.5 min |
Handoffs = disputes × reach × (1 − safe automated resolution), each at 7.24 agent-minutes. The busiest hour is the weekday-hour cell with the most disputes (Wednesday 08:00, 0.70 disputes a week against 0.51 in the median cell, over 156.9 weeks). Hours are as stored; the data gives no timezone.
Source: data_analytics/reports/insights.json, handoff_queue
09
What the two review thresholds send to a person
Both thresholds are read from agent/policy/rules.yaml and measured on every disputable charge in the window, with amounts converted to USD the way the policy engine does.
SYN-AMOUNT-001 USD 450 or more
- Disputable charges sent to a person
- 45.5%of 3,586,032 charges
- Purchase p90, March 2024
- USD 452.6012,611 purchases with a USD amount
- Monthly purchase p90, 37 months
- USD 447.90to USD 452.97
- p50
- USD 414.10
- p75
- USD 1,510.78
- p90
- USD 5,786.86
- p95
- USD 7,892.47
- p99
- USD 9,575.13
USD amount of every disputable charge in the window, by percentile; the first percentile at or above the threshold is marked. The threshold sits at the purchase p90 of the month the rule cites, and every month’s purchase p90 is close to it. Transfers and payments are larger, so they carry most of the 45.5%.
SYN-FRAUD-001 Fraud score 50 or more, or the fraud flag
- Disputable charges sent to a person
- 0.098%by the fraud rule
- Highest score of an unflagged charge
- 30.0threshold 50
- Sent by the score alone
- 0charges without the flag
In this data the score threshold adds nothing beyond the flag. No unflagged charge scores above 30.0, so every charge the rule sends to a person is already flagged. Together the two rules send 45.5% of disputable charges to a person.
Source: data_analytics/reports/insights.json, thresholds (rules version 2026-09-26.2)
10
Satisfaction follows first-contact resolution
Survey scores move with whether the contact was resolved the first time, which makes a dispute taken end to end in one conversation the customer outcome to aim for.
- CSAT, resolved on the first contact
- 3.00of 4; 97,851 surveys
- CSAT, not resolved on the first contact
- 2.00of 4; 30,005 surveys
- Difference
- 1.00 pointson a 1 to 4 scale
Scroll sideways inside the table for all 6 columns.
| Contact reason | Surveys | Mean CSAT | Mean CSAT, resolved first time | Mean CSAT, not resolved | First-contact resolution of the surveyed |
|---|---|---|---|---|---|
| Complaint | 21,843 | 2.43 of 4 | 3.00 of 4 | 2.00 of 4 | 43.4% |
| Retention | 3,798 | 2.61 of 4 | 3.00 of 4 | 2.00 of 4 | 60.4% |
| Commercial | 10,243 | 2.66 of 4 | 2.99 of 4 | 2.03 of 4 | 65.3% |
| Technical | 19,193 | 2.70 of 4 | 3.00 of 4 | 2.00 of 4 | 69.4% |
| Product | 27,942 | 2.90 of 4 | 3.00 of 4 | 2.01 of 4 | 89.7% |
| Transactional | 44,837 | 2.91 of 4 | 3.00 of 4 | 1.99 of 4 | 91.5% |
Mean CSAT by reason follows its first-contact resolution; Complaint, where disputes are filed, is lowest. Surveys link to contact-center interactions and never to complaints, so no survey can be tied to a dispute.
Dispute resolution satisfaction has a small sample. The complaint-level score (1 to 5) exists for 471 of 12,297 disputes (3.8%) and averages 3.07, against 3.01 for other complaints (2,013 of 54,798). It cannot measure a dispute outcome.
Source: data_analytics/reports/insights.json, satisfaction
Assumptions behind the business figures
- USD 10 per agent-hour is an illustrative placeholder (not sourced; replace with the bank's loaded cost).
- Only in the second reach scenario: the bank sends call-center disputes to the same flow; nothing in the data measures that they would use it
- A conversation the bot does not resolve safely costs its tokens and then the whole human handling time; a structured handoff may shorten the human contact, not measured
- Handling time per dispute is the Complaint contact-reason mean (complaints cannot be linked to contacts).
- The workflow-to-contact-reason mapping and the verifiable column are team judgments.
11
How Cautela decides
What the assistant does on its own, when it asks, when it needs a yes and when a person takes over, with the thresholds the service runs (policy version 2026-09-26.2). Rules marked law come from a legal text; synthetic policy is a team value the bank would replace with its own.
1Acts alone
Reads the customer’s own charges, profile and the dispute policy with read-only tools. Explains a Declined or Reversed charge without opening anything, since no money is left to recover. It never writes on its own.
SYN-STATUS-002synthetic policySYN-STATUS-003synthetic policy
2Asks the customer
Names one charge only when the model’s match probability is at least 0.79; otherwise it lists up to 3 candidates and the customer picks. Before opening a dispute it shows the charge as the tools read it and asks whether the customer recognizes it.
3Confirms before writing
open_dispute_case and block_card run only after an explicit yes bound to that action and its arguments. Only Approved or Pending charges can be disputed, inside the country’s claim window.
SYN-CONFIRM-001synthetic policySYN-STATUS-001synthetic policy
4Hands off to a person
At USD 450 or more (the case is filed, then a person reviews it); at a fraud score of 50 or more, or a fraud flag (it also offers to block the card); when the charge is outside its claim window; when the USD amount cannot be established; when nothing fits (no-match probability at least 0.0464); when the customer asks for a person, the request is outside dispute intake, a security check fires or a tool fails.
SYN-AMOUNT-001synthetic policySYN-FRAUD-001synthetic policySYN-DATA-001synthetic policySYN-HUMAN-001synthetic policySYN-SCOPE-001synthetic policySYN-SEC-001synthetic policy
Policy can only narrow a model proposal. The model proposes, and the policy engine decides what is allowed: a proposal can remove an action or add an escalation, never add an action the rules did not allow, skip a confirmation or cite a reason the rules do not know (agent/policy/engine.py, narrow).
Thresholds
Scroll sideways inside the table for all 5 columns.
| Threshold | Value | Governs | Kind | Source |
|---|---|---|---|---|
| Match probability to act | ≥ 0.79 | Names one charge instead of asking | fitted on the validation split, at most 1% unsafe decisions | ml/reports/fitted.json |
| Act floor | ≥ 0.60 | Lowest match probability that may ever act | business rule, set before any test result | ml/reports/fitted.json |
| No-match probability to hand off | ≥ 0.0464 | Hands off instead of asking | fitted on the validation split | ml/reports/fitted.json |
| Options shown | up to 3 | Candidates listed when it asks | fixed | ml/reports/fitted.json |
| Rule baseline, no trained model | top < 0.60 or margin < 0.15 | Asks instead of acting | fixed rule | agent/tools/ranking.py |
| Human review amount | USD 450 | Filed, then reviewed by a person | synthetic policy | SYN-AMOUNT-001synthetic policyagent/policy/rules.yaml |
| Fraud | score ≥ 50 or fraud flag | Hands off, offers a card block | synthetic policy | SYN-FRAUD-001synthetic policyagent/policy/rules.yaml |
| Exchange rates, per USD | COP 4,000, ARS 350, MXN 17 | USD value of a charge with no USD amount | synthetic policy, measured on the dataset | SYN-FX-001synthetic policyagent/policy/rules.yaml |
Claim windows
Scroll sideways inside the table for all 6 columns.
| Rule | Country | Applies to | Customer has | Bank answers within | Verification |
|---|---|---|---|---|---|
| MX-WINDOW-001law | Mexico | any product, any channel | 90 calendar days | 45 calendar days | from team research, not re-read for this build |
| CO-WINDOW-001law | Colombia | any product, Web and App | 5 business days | 15 business days | from team research, not re-read for this build |
| CO-WINDOW-002synthetic policy | Colombia | any product, any channel | 90 calendar days | not set | not verified |
| AR-WINDOW-001law | Argentina | credit cards, any channel | 30 calendar days | 15 calendar days (60 for a charge made abroad) | read in the primary legal text |
| AR-WINDOW-002synthetic policy | Argentina | any product, any channel | 30 calendar days | 10 business days | not verified |
Where two rules cover a country, the more specific one applies (Colombia’s law covers Web and App; Argentina’s covers credit cards) and the other covers the rest. Windows are counted from the transaction date, because the dataset has no statement dates; that can only shorten a window, never lengthen it. Sources: agent/policy/rules.yaml, agent/tools/ranking.py, ml/reports/fitted.json.
What these numbers cannot tell you
- The dataset is synthetic and templated. The five main complaint types differ by at most 3.5% in volume; all 12,297 dispute descriptions share one identical text, and 171,321 call transcripts hold 42 distinct customer turns. Outcome metrics barely vary, so they describe the data generator more than any bank.
- The 43.6% first-contact resolution is not a dispute metric. It is the contact center’s rate for the Complaint reason; no complaint links to an interaction, so the dispute workflow’s own first-contact resolution cannot be measured here.
- The evaluation is offline, on generated scenarios. 1,240 cases built over organizer transactions with team-written messages (data version 0189e386ce7fe882). It measures the decision component, not production traffic, and it was run without a language model.
- Hours carry no timezone. Hour-of-day and weekday shares are as stored and may be shifted.
Reproduce: make analytics; full write-up in data_analytics/reports/why-this-workflow.md and ml/reports/results.md.