Week of July 20, 2026 · 224 calls,
5,281 turns scored to turn-level sentiment and a rebuttal taxonomy ·
every figure generated by build.py (seed 4517) ·
no employer data appears in this workbook
The floor scored 224 calls and 5,281 turns this week, carrying 463 detected objections. Sentiment recovered on 56% of them. 19 of 27 reps carry a lag material enough to coach against their own tier, and the most common lag is affordability conversion (7 reps). The hardest objection on the floor is needs to consult a partner, recovering 46% of the time against a floor average of 56%.
224
Calls scored
5,281 turns labelled
463
Objections detected
2.07 per call
56%
Floor recovery rate
sentiment back inside 0.10 within 3 turns
19 of 27
Reps with a flagged lag
gap of at least 0.60 robust z below tier median
0.872
Label micro F1
against planted events, synthetic corpus
Rep against tier median · one row per rep, one flagged metric per rep
Rep
Calls
Recovery rate
Lift per objection
Close sentiment
Framing rate
Afford conversion
Focus this week
value
vs tier
vs range
value
vs tier
vs range
value
vs tier
vs range
value
vs tier
vs range
value
vs tier
vs range
Tier 1 (senior) · median recovery 70% · median framing 75% · median afford conversion 54%
Bettina Inglewood R-02
9
61%
-9pp
0.18
-0.05
-0.22
-0.35
56%
-19pp
43%
-11pp
Close sentiment
Greer Grimsby R-07
6
61%
-9pp
0.16
-0.07
0.13
-0.00
67%
-8pp
20%
-34pp
Afford conversion
Adaeze Danforth R-01
10
64%
-6pp
0.23
+0.01
0.01
-0.12
80%
+5pp
50%
-4pp
Close sentiment
Dashiell Standish R-04
5
70%
+0pp
0.16
-0.06
0.25
+0.12
40%
-35pp
33%
-20pp
Framing rate
Fennick Bellweather R-06
15
70%
+0pp
0.28
+0.05
0.13
+0.00
93%
+18pp
77%
+23pp
inside tier band
Elowen Yarborough R-05
7
71%
+1pp
0.25
+0.02
0.09
-0.04
71%
-4pp
57%
+4pp
inside tier band
Corwin Northcott R-03
7
80%
+10pp
0.28
+0.05
0.26
+0.13
86%
+11pp
100%
+46pp
inside tier band
Halcyon Lockhart R-08
14
81%
+11pp
0.22
-0.01
0.23
+0.10
79%
+4pp
64%
+10pp
inside tier band
Tier 2 (core) · median recovery 55% · median framing 48% · median afford conversion 60%
Linnea Eastmarch R-12
5
47%
-8pp
0.05
-0.08
-0.25
-0.16
80%
+32pp
0%
-60pp
Afford conversion
Perrin Zellwood R-16
7
47%
-8pp
0.08
-0.05
-0.21
-0.13
43%
-5pp
67%
+7pp
Close sentiment
Joric Vancourt R-10
11
50%
-5pp
0.13
-0.00
-0.02
+0.06
45%
-2pp
43%
-17pp
Afford conversion
Marguerite Jessup R-13
6
50%
-5pp
0.07
-0.06
-0.08
+0.00
50%
+2pp
n/a
n/a
n/a
Lift per objection
Rosalind Havelock R-18
7
50%
-5pp
0.21
+0.08
-0.14
-0.06
43%
-5pp
60%
+0pp
inside tier band
Quillon Coldwater R-17
4
60%
+5pp
0.13
-0.00
-0.20
-0.11
25%
-23pp
0%
-60pp
Afford conversion
Ismene Quintrell R-09
5
62%
+8pp
0.13
+0.00
0.12
+0.20
80%
+32pp
60%
+0pp
inside tier band
Norbert Ormsby R-14
7
65%
+10pp
0.16
+0.03
-0.08
-0.00
29%
-19pp
20%
-40pp
Afford conversion
Ottoline Thornbury R-15
12
67%
+12pp
0.17
+0.04
0.20
+0.29
83%
+36pp
67%
+7pp
inside tier band
Kestrel Calloway R-11
7
69%
+14pp
0.22
+0.09
-0.06
+0.03
57%
+9pp
71%
+11pp
inside tier band
Tier 3 (ramp) · median recovery 36% · median framing 60% · median afford conversion 12%
Zephyrine Underhill R-26
10
24%
-13pp
0.01
-0.08
-0.41
-0.11
50%
-10pp
20%
+8pp
Close sentiment
Verity Ashgrove R-22
6
25%
-11pp
0.02
-0.07
-0.27
+0.03
67%
+7pp
25%
+12pp
Recovery rate
Xanthe Kirkbride R-24
11
25%
-11pp
0.04
-0.05
-0.34
-0.04
82%
+22pp
0%
-12pp
Recovery rate
Sable Merriwether R-19
6
29%
-8pp
0.11
+0.02
-0.21
+0.09
50%
-10pp
25%
+12pp
Framing rate
Yorick Pemberton R-25
7
36%
+0pp
0.01
-0.07
-0.30
+0.00
43%
-17pp
0%
-12pp
Framing rate
Alistair Braxton R-27
15
41%
+5pp
0.14
+0.05
-0.35
-0.05
67%
+7pp
12%
+0pp
Close sentiment
Ulric Whitfield R-21
15
54%
+17pp
0.09
+0.00
-0.32
-0.02
60%
+0pp
0%
-12pp
Afford conversion
Tarquin Ravensworth R-20
4
56%
+19pp
0.18
+0.09
-0.24
+0.06
25%
-35pp
33%
+21pp
Framing rate
Wendeline Farrowgate R-23
6
100%
+64pp
0.24
+0.16
0.14
+0.44
67%
+7pp
0%
-12pp
Afford conversion
The bar behind each value is that rep on their own tier's range; the vertical rule is the tier median. A metric is flagged only when the rep sits at least 0.60 robust z below their tier median, so a rep inside the band gets no manufactured coaching item. Reserved capacity is the point: flagging everybody flags nobody.
What each metric counts
Metric
Definition
Objection recovery rate
Share of scored objections where customer sentiment returns to within 0.10 of its pre-objection level inside 3 turns.
Sentiment lift per objection
Mean gain from sentiment at the objection turn to the best customer sentiment inside the next 3 turns.
Close-window sentiment
Mean customer sentiment across the final 20% of turns on every scored call.
Proactive framing rate
Share of calls where the rep explains program mechanics before the first objection is raised, rather than after.
Affordability conversion
Enrolled share of calls that carried a cannot-afford objection. The hardest objection on the floor and the one that separates tiers.
One card per rep, the same five metrics on every card, in the same order. A workbook that reorders columns per rep cannot be read across a floor, and a director reading twenty-seven of these has to be able to scan the same position every time.
Bettina InglewoodR-02 · Tier 1 (senior)
9 calls · 18 objections · 44% enrolled
Metric
Rep
Tier med
Gap
z
Recovery rate
61%
70%
-9pp
-0.79
Lift per objection
0.18
0.23
-0.05
-0.63
Close sentiment
-0.22
0.13
-0.35
-2.19
Framing rate
56%
75%
-19pp
-1.38
Afford conversion
43%
54%
-11pp
-0.47
Coach this: Close-window sentiment
Call-ending review. Listen to the last ninety seconds of five calls and mark where the customer stopped engaging with the numbers.
Talk share 73% · 24.0 turns per call
Greer GrimsbyR-07 · Tier 1 (senior)
6 calls · 18 objections · 33% enrolled
Metric
Rep
Tier med
Gap
z
Recovery rate
61%
70%
-9pp
-0.79
Lift per objection
0.16
0.23
-0.07
-0.88
Close sentiment
0.13
0.13
-0.00
-0.01
Framing rate
67%
75%
-8pp
-0.59
Afford conversion
20%
54%
-34pp
-1.46
Coach this: Affordability conversion
Term and staging practice. On the next five affordability objections the rep offers a longer term or a staged start before defending the quoted payment.
Talk share 71% · 26.0 turns per call
Adaeze DanforthR-01 · Tier 1 (senior)
10 calls · 22 objections · 50% enrolled
Metric
Rep
Tier med
Gap
z
Recovery rate
64%
70%
-6pp
-0.56
Lift per objection
0.23
0.23
+0.01
0.10
Close sentiment
0.01
0.13
-0.12
-0.74
Framing rate
80%
75%
+5pp
0.35
Afford conversion
50%
54%
-4pp
-0.16
Coach this: Close-window sentiment
Call-ending review. Listen to the last ninety seconds of five calls and mark where the customer stopped engaging with the numbers.
Strength to protect: proactive framing rate (0.35 z above tier median).
Talk share 73% · 24.9 turns per call
Dashiell StandishR-04 · Tier 1 (senior)
5 calls · 10 objections · 60% enrolled
Metric
Rep
Tier med
Gap
z
Recovery rate
70%
70%
+0pp
0.00
Lift per objection
0.16
0.23
-0.06
-0.83
Close sentiment
0.25
0.13
+0.12
0.72
Framing rate
40%
75%
-35pp
-2.48
Afford conversion
33%
54%
-20pp
-0.88
Coach this: Proactive framing rate
Front-load the mechanics. The rep runs the dedicated-account and negotiation-sequence explanation immediately after the quote on the next ten calls, before any objection arrives.
Strength to protect: close-window sentiment (0.72 z above tier median).
Talk share 74% · 22.2 turns per call
Fennick BellweatherR-06 · Tier 1 (senior)
15 calls · 30 objections · 80% enrolled
Metric
Rep
Tier med
Gap
z
Recovery rate
70%
70%
+0pp
0.00
Lift per objection
0.28
0.23
+0.05
0.72
Close sentiment
0.13
0.13
+0.00
0.01
Framing rate
93%
75%
+18pp
1.30
Afford conversion
77%
54%
+23pp
1.02
No material lag this week
Every scored metric sits inside this rep's tier band. Hold the coaching slot and spend it on a call review of their choice.
Strength to protect: proactive framing rate (1.30 z above tier median).
Talk share 73% · 24.3 turns per call
Elowen YarboroughR-05 · Tier 1 (senior)
7 calls · 14 objections · 57% enrolled
Metric
Rep
Tier med
Gap
z
Recovery rate
71%
70%
+1pp
0.13
Lift per objection
0.25
0.23
+0.02
0.27
Close sentiment
0.09
0.13
-0.04
-0.27
Framing rate
71%
75%
-4pp
-0.25
Afford conversion
57%
54%
+4pp
0.16
No material lag this week
Every scored metric sits inside this rep's tier band. Hold the coaching slot and spend it on a call review of their choice.
Strength to protect: sentiment lift per objection (0.27 z above tier median).
Talk share 72% · 23.6 turns per call
Corwin NorthcottR-03 · Tier 1 (senior)
7 calls · 10 objections · 86% enrolled
Metric
Rep
Tier med
Gap
z
Recovery rate
80%
70%
+10pp
0.88
Lift per objection
0.28
0.23
+0.05
0.72
Close sentiment
0.26
0.13
+0.13
0.79
Framing rate
86%
75%
+11pp
0.76
Afford conversion
100%
54%
+46pp
2.02
No material lag this week
Every scored metric sits inside this rep's tier band. Hold the coaching slot and spend it on a call review of their choice.
Strength to protect: affordability conversion (2.02 z above tier median).
Talk share 74% · 22.0 turns per call
Halcyon LockhartR-08 · Tier 1 (senior)
14 calls · 37 objections · 50% enrolled
Metric
Rep
Tier med
Gap
z
Recovery rate
81%
70%
+11pp
0.98
Lift per objection
0.22
0.23
-0.01
-0.10
Close sentiment
0.23
0.13
+0.10
0.63
Framing rate
79%
75%
+4pp
0.25
Afford conversion
64%
54%
+10pp
0.44
No material lag this week
Every scored metric sits inside this rep's tier band. Hold the coaching slot and spend it on a call review of their choice.
Strength to protect: objection recovery rate (0.98 z above tier median).
Talk share 75% · 24.1 turns per call
Linnea EastmarchR-12 · Tier 2 (core)
5 calls · 15 objections · 0% enrolled
Metric
Rep
Tier med
Gap
z
Recovery rate
47%
55%
-8pp
-0.71
Lift per objection
0.05
0.13
-0.08
-1.25
Close sentiment
-0.25
-0.08
-0.16
-1.27
Framing rate
80%
48%
+32pp
1.52
Afford conversion
0%
60%
-60pp
-3.54
Coach this: Affordability conversion
Term and staging practice. On the next five affordability objections the rep offers a longer term or a staged start before defending the quoted payment.
Strength to protect: proactive framing rate (1.52 z above tier median).
Talk share 74% · 24.0 turns per call
Perrin ZellwoodR-16 · Tier 2 (core)
7 calls · 15 objections · 43% enrolled
Metric
Rep
Tier med
Gap
z
Recovery rate
47%
55%
-8pp
-0.71
Lift per objection
0.08
0.13
-0.05
-0.73
Close sentiment
-0.21
-0.08
-0.13
-1.03
Framing rate
43%
48%
-5pp
-0.23
Afford conversion
67%
60%
+7pp
0.39
Coach this: Close-window sentiment
Call-ending review. Listen to the last ninety seconds of five calls and mark where the customer stopped engaging with the numbers.
Strength to protect: affordability conversion (0.39 z above tier median).
Talk share 70% · 23.1 turns per call
Joric VancourtR-10 · Tier 2 (core)
11 calls · 26 objections · 55% enrolled
Metric
Rep
Tier med
Gap
z
Recovery rate
50%
55%
-5pp
-0.43
Lift per objection
0.13
0.13
-0.00
-0.06
Close sentiment
-0.02
-0.08
+0.06
0.47
Framing rate
45%
48%
-2pp
-0.11
Afford conversion
43%
60%
-17pp
-1.01
Coach this: Affordability conversion
Term and staging practice. On the next five affordability objections the rep offers a longer term or a staged start before defending the quoted payment.
Strength to protect: close-window sentiment (0.47 z above tier median).
Talk share 73% · 24.2 turns per call
Marguerite JessupR-13 · Tier 2 (core)
6 calls · 8 objections · 50% enrolled
Metric
Rep
Tier med
Gap
z
Recovery rate
50%
55%
-5pp
-0.43
Lift per objection
0.07
0.13
-0.06
-0.89
Close sentiment
-0.08
-0.08
+0.00
0.01
Framing rate
50%
48%
+2pp
0.11
Afford conversion
n/a
60%
n/a
n/a
n/a
Coach this: Sentiment lift per objection
Rebuttal bank review. The rep records three answers to their weakest objection and picks the one that ends on a question, not a claim.
Strength to protect: proactive framing rate (0.11 z above tier median).
Talk share 74% · 23.0 turns per call
Rosalind HavelockR-18 · Tier 2 (core)
7 calls · 16 objections · 43% enrolled
Metric
Rep
Tier med
Gap
z
Recovery rate
50%
55%
-5pp
-0.43
Lift per objection
0.21
0.13
+0.08
1.18
Close sentiment
-0.14
-0.08
-0.06
-0.45
Framing rate
43%
48%
-5pp
-0.23
Afford conversion
60%
60%
+0pp
0.00
No material lag this week
Every scored metric sits inside this rep's tier band. Hold the coaching slot and spend it on a call review of their choice.
Strength to protect: sentiment lift per objection (1.18 z above tier median).
Talk share 74% · 24.9 turns per call
Quillon ColdwaterR-17 · Tier 2 (core)
4 calls · 10 objections · 0% enrolled
Metric
Rep
Tier med
Gap
z
Recovery rate
60%
55%
+5pp
0.43
Lift per objection
0.13
0.13
-0.00
-0.05
Close sentiment
-0.20
-0.08
-0.11
-0.88
Framing rate
25%
48%
-23pp
-1.07
Afford conversion
0%
60%
-60pp
-3.54
Coach this: Affordability conversion
Term and staging practice. On the next five affordability objections the rep offers a longer term or a staged start before defending the quoted payment.
Strength to protect: objection recovery rate (0.43 z above tier median).
Talk share 76% · 24.8 turns per call
Ismene QuintrellR-09 · Tier 2 (core)
5 calls · 8 objections · 60% enrolled
Metric
Rep
Tier med
Gap
z
Recovery rate
62%
55%
+8pp
0.64
Lift per objection
0.13
0.13
+0.00
0.05
Close sentiment
0.12
-0.08
+0.20
1.60
Framing rate
80%
48%
+32pp
1.52
Afford conversion
60%
60%
+0pp
0.00
No material lag this week
Every scored metric sits inside this rep's tier band. Hold the coaching slot and spend it on a call review of their choice.
Strength to protect: close-window sentiment (1.60 z above tier median).
Talk share 74% · 21.8 turns per call
Norbert OrmsbyR-14 · Tier 2 (core)
7 calls · 17 objections · 29% enrolled
Metric
Rep
Tier med
Gap
z
Recovery rate
65%
55%
+10pp
0.83
Lift per objection
0.16
0.13
+0.03
0.39
Close sentiment
-0.08
-0.08
-0.00
-0.01
Framing rate
29%
48%
-19pp
-0.90
Afford conversion
20%
60%
-40pp
-2.36
Coach this: Affordability conversion
Term and staging practice. On the next five affordability objections the rep offers a longer term or a staged start before defending the quoted payment.
Strength to protect: objection recovery rate (0.83 z above tier median).
Talk share 70% · 24.1 turns per call
Ottoline ThornburyR-15 · Tier 2 (core)
12 calls · 18 objections · 75% enrolled
Metric
Rep
Tier med
Gap
z
Recovery rate
67%
55%
+12pp
0.99
Lift per objection
0.17
0.13
+0.04
0.62
Close sentiment
0.20
-0.08
+0.29
2.24
Framing rate
83%
48%
+36pp
1.68
Afford conversion
67%
60%
+7pp
0.39
No material lag this week
Every scored metric sits inside this rep's tier band. Hold the coaching slot and spend it on a call review of their choice.
Strength to protect: close-window sentiment (2.24 z above tier median).
Talk share 72% · 21.8 turns per call
Kestrel CallowayR-11 · Tier 2 (core)
7 calls · 16 objections · 71% enrolled
Metric
Rep
Tier med
Gap
z
Recovery rate
69%
55%
+14pp
1.17
Lift per objection
0.22
0.13
+0.09
1.28
Close sentiment
-0.06
-0.08
+0.03
0.22
Framing rate
57%
48%
+9pp
0.45
Afford conversion
71%
60%
+11pp
0.67
No material lag this week
Every scored metric sits inside this rep's tier band. Hold the coaching slot and spend it on a call review of their choice.
Strength to protect: sentiment lift per objection (1.28 z above tier median).
Talk share 74% · 24.7 turns per call
Zephyrine UnderhillR-26 · Tier 3 (ramp)
10 calls · 21 objections · 20% enrolled
Metric
Rep
Tier med
Gap
z
Recovery rate
24%
36%
-13pp
-0.74
Lift per objection
0.01
0.09
-0.08
-0.80
Close sentiment
-0.41
-0.30
-0.11
-1.64
Framing rate
50%
60%
-10pp
-0.67
Afford conversion
20%
12%
+8pp
0.41
Coach this: Close-window sentiment
Call-ending review. Listen to the last ninety seconds of five calls and mark where the customer stopped engaging with the numbers.
Strength to protect: affordability conversion (0.41 z above tier median).
Talk share 70% · 23.3 turns per call
Verity AshgroveR-22 · Tier 3 (ramp)
6 calls · 12 objections · 17% enrolled
Metric
Rep
Tier med
Gap
z
Recovery rate
25%
36%
-11pp
-0.67
Lift per objection
0.02
0.09
-0.07
-0.67
Close sentiment
-0.27
-0.30
+0.03
0.47
Framing rate
67%
60%
+7pp
0.45
Afford conversion
25%
12%
+12pp
0.67
Coach this: Objection recovery rate
Two live calls with a team lead on the line, stopping the moment an objection lands. The rep states the objection back in one sentence before answering it.
Strength to protect: affordability conversion (0.67 z above tier median).
Talk share 75% · 23.8 turns per call
Xanthe KirkbrideR-24 · Tier 3 (ramp)
11 calls · 24 objections · 9% enrolled
Metric
Rep
Tier med
Gap
z
Recovery rate
25%
36%
-11pp
-0.67
Lift per objection
0.04
0.09
-0.05
-0.47
Close sentiment
-0.34
-0.30
-0.04
-0.63
Framing rate
82%
60%
+22pp
1.47
Afford conversion
0%
12%
-12pp
-0.67
Coach this: Objection recovery rate
Two live calls with a team lead on the line, stopping the moment an objection lands. The rep states the objection back in one sentence before answering it.
Strength to protect: proactive framing rate (1.47 z above tier median).
Talk share 75% · 23.8 turns per call
Sable MerriwetherR-19 · Tier 3 (ramp)
6 calls · 14 objections · 33% enrolled
Metric
Rep
Tier med
Gap
z
Recovery rate
29%
36%
-8pp
-0.46
Lift per objection
0.11
0.09
+0.02
0.24
Close sentiment
-0.21
-0.30
+0.09
1.23
Framing rate
50%
60%
-10pp
-0.67
Afford conversion
25%
12%
+12pp
0.67
Coach this: Proactive framing rate
Front-load the mechanics. The rep runs the dedicated-account and negotiation-sequence explanation immediately after the quote on the next ten calls, before any objection arrives.
Strength to protect: close-window sentiment (1.23 z above tier median).
Talk share 76% · 24.7 turns per call
Yorick PembertonR-25 · Tier 3 (ramp)
7 calls · 11 objections · 0% enrolled
Metric
Rep
Tier med
Gap
z
Recovery rate
36%
36%
+0pp
0.00
Lift per objection
0.01
0.09
-0.07
-0.72
Close sentiment
-0.30
-0.30
+0.00
0.00
Framing rate
43%
60%
-17pp
-1.16
Afford conversion
0%
12%
-12pp
-0.67
Coach this: Proactive framing rate
Front-load the mechanics. The rep runs the dedicated-account and negotiation-sequence explanation immediately after the quote on the next ten calls, before any objection arrives.
Talk share 72% · 22.0 turns per call
Alistair BraxtonR-27 · Tier 3 (ramp)
15 calls · 29 objections · 7% enrolled
Metric
Rep
Tier med
Gap
z
Recovery rate
41%
36%
+5pp
0.30
Lift per objection
0.14
0.09
+0.05
0.50
Close sentiment
-0.35
-0.30
-0.05
-0.67
Framing rate
67%
60%
+7pp
0.45
Afford conversion
12%
12%
+0pp
0.00
Coach this: Close-window sentiment
Call-ending review. Listen to the last ninety seconds of five calls and mark where the customer stopped engaging with the numbers.
Strength to protect: sentiment lift per objection (0.50 z above tier median).
Talk share 75% · 24.4 turns per call
Ulric WhitfieldR-21 · Tier 3 (ramp)
15 calls · 26 objections · 7% enrolled
Metric
Rep
Tier med
Gap
z
Recovery rate
54%
36%
+17pp
1.04
Lift per objection
0.09
0.09
+0.00
0.00
Close sentiment
-0.32
-0.30
-0.02
-0.24
Framing rate
60%
60%
+0pp
0.00
Afford conversion
0%
12%
-12pp
-0.67
Coach this: Affordability conversion
Term and staging practice. On the next five affordability objections the rep offers a longer term or a staged start before defending the quoted payment.
Strength to protect: objection recovery rate (1.04 z above tier median).
Talk share 74% · 22.1 turns per call
Tarquin RavensworthR-20 · Tier 3 (ramp)
4 calls · 9 objections · 25% enrolled
Metric
Rep
Tier med
Gap
z
Recovery rate
56%
36%
+19pp
1.14
Lift per objection
0.18
0.09
+0.09
0.91
Close sentiment
-0.24
-0.30
+0.06
0.84
Framing rate
25%
60%
-35pp
-2.36
Afford conversion
33%
12%
+21pp
1.12
Coach this: Proactive framing rate
Front-load the mechanics. The rep runs the dedicated-account and negotiation-sequence explanation immediately after the quote on the next ten calls, before any objection arrives.
Strength to protect: objection recovery rate (1.14 z above tier median).
Talk share 73% · 24.0 turns per call
Wendeline FarrowgateR-23 · Tier 3 (ramp)
6 calls · 9 objections · 17% enrolled
Metric
Rep
Tier med
Gap
z
Recovery rate
100%
36%
+64pp
3.78
Lift per objection
0.24
0.09
+0.16
1.58
Close sentiment
0.14
-0.30
+0.44
6.26
Framing rate
67%
60%
+7pp
0.45
Afford conversion
0%
12%
-12pp
-0.67
Coach this: Affordability conversion
Term and staging practice. On the next five affordability objections the rep offers a longer term or a staged start before defending the quoted payment.
Strength to protect: close-window sentiment (6.26 z above tier median).
Talk share 73% · 20.7 turns per call
Objection economics · how each label behaves
Objection
Turns
Share
Sentiment drop
Lift after
Recovery rate
Calls carrying
Enroll rate
Cannot afford
157
34%
0.30
0.18
50%
149
38%
Needs time to think
150
32%
0.14
0.10
71%
124
27%
Needs to consult a partner
80
17%
0.33
0.14
46%
76
32%
Wants a loan instead
76
16%
0.34
0.20
47%
76
39%
Tier 1 (senior)Tier 2 (core)Tier 3 (ramp)
Why boundaries are written into the prompt: the two label pairs that actually collide are a stall wrapping a budget problem, and a stall wrapping a second decision maker. Left undefined, every hesitation lands in one bucket and the taxonomy stops carrying information. The boundary lines in the right-hand column are prompt text, not documentation written afterwards.
The taxonomy, and the boundary that keeps each label from swallowing its neighbour
Label
What it is
Where it stops
cant_afford
The customer says the proposed monthly program payment is beyond what their budget can carry, now or for the stated term.
Do not use this when the customer only wants a different funding structure at a similar payment. That is wants_loan. Do not use it for a general 'that is a lot of money' reaction with no budget claim.
wants_loan
The customer prefers new credit, a consolidation loan, a balance transfer, or a refinance over the program being offered.
Do not use this when the customer only asks how the program compares to a loan without stating a preference. Curiosity is not an objection.
consult_spouse
The customer defers the decision to a partner, spouse, parent, or another household decision maker who is not on the call.
Do not use this when the customer defers to their own further thought with no second person involved. That is needs_time.
needs_time
The customer asks for time before deciding, with no second decision maker and no budget or product objection attached.
Do not use this when the stall is a wrapper on a stated money problem or a stated preference for a loan. Label the underlying objection instead.
process_explained
An agent turn that explains the mechanics of the program: how the dedicated account funds, how negotiation with each creditor works, what the timeline looks like, what fees attach, or what happens to credit standing along the way.
Do not use this for benefit claims with no mechanism ('this will really help you'), for rapport, or for a bare price quote with no explanation of how the program works.
Tier reference · median with robust spread
Tier
Recovery rate
Lift per objection
Close sentiment
Framing rate
Afford conversion
Talk share
Enroll rate
Tier 1 (senior)
70% ±0.11
0.23 ±0.07
0.13 ±0.16
75% ±0.14
54% ±0.23
73%
54%
Tier 2 (core)
55% ±0.12
0.13 ±0.07
-0.08 ±0.13
48% ±0.21
60% ±0.17
74%
46%
Tier 3 (ramp)
36% ±0.17
0.09 ±0.10
-0.30 ±0.07
60% ±0.15
12% ±0.19
74%
17%
Spread is the median absolute deviation scaled to a standard-deviation equivalent, which is what the robust z in the rep cards divides by. Mean and standard deviation would let one rep with four calls and a bad Tuesday redefine the tier.
1. Extract
Call recordings land as transcripts with speaker labels and turn timestamps.
2. Window
Each call is split into windows of 40 turns with 4 turns of carry, so the model reads an objection with its run-up.
3. Score
One request per window against claude-sonnet-5, constrained to the turn-label JSON schema. The frozen system block carries the cache breakpoint.
4. Reconcile
Overlapping turns come back twice and are merged by confidence. Dropped turns are recorded as holes, never backfilled with a neutral score.
5. Fan out
Turn labels feed two consumers: the live agent's inference step, and this workbook.
Build versus buy, in one paragraph: the vendors quoting this capability wanted the call transcripts on their infrastructure, and their contracts reserved the right to train on them. Customer conversations about medical debt and lost hours are the last corpus a consumer finance company should hand over on those terms. The in-house layer is a prompt, a schema, a windowing rule, and a reconciliation step. It keeps the transcripts inside the account, and it makes the taxonomy an internal decision that a sales director can change on a Tuesday instead of a roadmap request.
Request shape · every knob visible
Parameter
Value
Model
claude-sonnet-5
Max tokens
16,000
Window size
40 turns, 4 overlapping
Output constraint
output_config.format, json_schema
Thinking parameter
not passed: bounded extraction against a fixed rubric
Prompt cache
ephemeral breakpoint on the frozen system block
Retry policy
SDK max_retries with exponential backoff on 429 and 5xx
Batch path
Batches API for corpus runs, 50% of list price
Credential
ANTHROPIC_API_KEY environment variable, read by the SDK
You are a quality analyst for a consumer finance sales floor. You read one
window of a recorded sales call at a time and return structured labels for
every turn in that window. You are scoring the conversation, not judging the
customer and not writing coaching copy. Another system does the coaching.
TASK
For each turn in the window, return three things:
1. sentiment: how the speaker of that turn sounds on this turn.
2. labels: which rebuttal taxonomy labels the turn carries, if any.
3. confidence: how sure you are about the labels on that turn.
Most turns carry no labels. An empty labels array is the correct and common
answer. Do not reach for a label to fill the field.
The schema the response is constrained to
{
"type": "object",
"properties": {
"turns": {
"type": "array",
"description": "One entry per turn in the supplied window, in order.",
"items": {
"type": "object",
"properties": {
"turn": {
"type": "integer",
"description": "Turn index, copied from the input window."
},
"sentiment": {
"type": "number",
"description": "Speaker sentiment on this turn, -1.0 to 1.0, against the anchor scale in the system prompt."
},
"labels": {
"type": "array",
"description": "Rebuttal taxonomy labels carried by this turn. Empty array when the turn carries none.",
"items": {
"type": "string",
"enum": [
"cant_afford",
"wants_loan",
"consult_spouse",
"needs_time",
"process_explained"
]
}
},
"confidence": {
"type": "number",
"description": "0.0 to 1.0 confidence in the labels on this turn."
},
"evidence": {
"type": "string",
"description": "Verbatim span from this turn that carries the label, at most 140 characters. Empty string when labels is empty."
}
},
"required": [
"turn",
"sentiment",
"labels",
"confidence",
"evidence"
],
"additionalProperties": false
}
}
},
"required": [
"turns"
],
"additionalProperties": false
}
The schema deliberately carries no numeric bounds. The API's JSON schema subset does not enforce minimum and maximum, so writing them in would read as a guarantee the platform never made. Bounds are enforced in validate_turn_record() instead, on every record, from both the live path and the fixture path.
What produced the committed numbers
Every score in this workbook came from src/fixture_scorer.py, not from an API call. The fixture reads the events the corpus generator planted, pushes them through a stated error model, and writes records in the exact shape src/score.py returns from Claude. That is what lets this repository run end to end with no key and no spend.
A fixture that echoed ground truth would score a perfect hundred on every label and make the quality tab decoration. The error model below reproduces the two things that actually happen in production: recall that varies by label, and false positives that cluster on the confusable pairs.
Fixture error model · the stated assumptions
Assumption
Value
Recall, cannot afford
94%
Recall, wants a loan
89%
Recall, consult a partner
95%
Recall, needs time
83%
Recall, process explained
91%
False positive rate, customer turns
2.2%
False positive rate, agent turns
3.4%
Sentiment gain toward neutral
0.94
Sentiment noise, standard deviation
0.070
0.888
Macro F1
unweighted mean across five labels
0.057
Sentiment MAE
mean absolute error on a -1 to 1 scale
97%
Sentiment agreement
turns within 0.15 of the planted value
15.9%
Label density
of 5,281 scored turns carry a label
Label quality against the planted events
Label
Support
Precision
Recall
F1
False pos
False neg
cant_afford
151
0.911
0.947
0.929
14
8
wants_loan
80
0.947
0.900
0.923
4
8
consult_spouse
73
0.875
0.959
0.915
10
3
needs_time
163
0.867
0.797
0.831
20
33
process_explained
322
0.782
0.916
0.844
82
27
micro
all
0.845
0.900
0.872
Confusion matrix · primary label per turn
true \ scored
cant_afford
wants_loan
consult_spouse
needs_time
process_explained
none
cant_afford
143
1
0
0
0
7
wants_loan
0
72
0
0
0
8
consult_spouse
0
0
70
2
0
1
needs_time
0
0
6
130
0
27
process_explained
0
0
0
0
295
27
none
14
3
4
18
82
4,371
What this measures and what it does not
It measures whether the scoring path recovers a signal that is known to be present. Every planted objection, every planted process explanation, every planted sentiment value has a scored counterpart, and the table above is the comparison.
It does not measure whether the taxonomy matches how a human quality analyst reads the same call. Ground truth here is the generator's own events, not adjudication. In production that second question is the one that gates a new label, and it is answered a different way: a double-scored sample, an inter-rater agreement check between two analysts, and a third pass on every disagreement. A label that cannot clear inter-rater agreement between two humans has no business setting a coaching priority for a twenty-seven person floor.
The number that would end the argument is a scored-versus-analyst agreement rate on a stratified sample, refreshed whenever the prompt version changes. Until that exists, every metric downstream of these labels is a directional read, and this workbook says so on its face.
463
Decision points
objection turns across the week
13
Held below confidence
2.8% of payloads
5
Modules in rotation
four objection routes plus de-escalation
Why the routing lives in a table: the sales enablement lead owns which module answers which objection, and that mapping changes faster than a deploy cycle. A table can be diffed when the win rate moves; a branch buried in a handler cannot. The scoring layer never speaks to a customer and never picks words. It supplies the data points, and the router decides.
Contract with the live agent
Term
Value
Schema version
1.2.0
Trigger
a customer turn carrying at least one objection label
Payload
flat, fixed keys, one level of nesting, no free text
Latency budget
p50 40 ms, p95 125 ms
Confidence floor
0.55; below it the payload ships flagged and the router holds
De-escalation override
sentiment at or below -0.45 overrides the objection routing
Failure posture
no payload is better than a wrong prompt on a live call
Personal data
none; the payload carries call and rep identifiers only
Objection to module · a table, not a branch
Objection label
Module
cant_afford
affordability_reframe
wants_loan
loan_comparison
consult_spouse
joint_decision_setup
needs_time
specific_question_close
Module routing across the week
Module
Decision points
Share
affordability_reframe
131
28%
specific_question_close
124
27%
de_escalate_and_slow
93
20%
joint_decision_setup
61
13%
loan_comparison
54
12%
One payload, verbatim from data/agent_features.jsonl
Customer sentimentCannot affordWants a loan insteadNeeds to consult a partnerNeeds time to thinkProcess explained
#
t
Speaker
Turn
Sentiment
Conf
0
00:00
agent
Tobias? Halcyon with Northwind Financial. You asked us to walk you through the options on your balances. Do you have about ten minutes?
0.38
0.93
1
00:13
customer
This is she. Now works, I am on a break.
0.38
0.89
2
00:21
agent
Great. Before anything else, nothing we do today changes your accounts. This is a conversation, and you decide at the end.
0.31
0.90
3
00:32
customer
I am with you.
0.42
0.94
4
00:35
agent
Let me start with the picture. Roughly what are you carrying across cards and personal loans right now?
0.33
0.92
5
00:46
customer
Honestly I stopped adding it up. Somewhere near $16,100.
0.31
0.84
6
00:52
agent
How many creditors are we talking about?
0.28
0.90
7
00:58
customer
3 accounts. Two of them are the bad ones.
0.33
0.93
8
01:05
agent
What changed? Most people I talk to can point at one month where it got away from them.
0.20
0.97
9
01:17
customer
My hours got cut in the spring and I have been covering the gap with the cards since.
0.26
0.91
10
01:26
agent
That is a common story and it is not a character flaw. The interest math does most of the damage.
0.13
0.99
11
01:37
agent
So on $16,100, what we would build is a 48 month plan at about $220 a month, targeting settlements that land near $8,500 in total.
0.15
0.89
12
01:50
customer
What does it do to my credit? needs_time
0.40
0.64
13
01:56
agent
Okay. Thank you for being straight with me about it. Stop me if any of this is unclear.
0.16
0.87
14
02:13
customer
Let me sit with it for a couple of days. needs_time
0.00
0.90
15
02:27
agent
Absolutely. Let me make the thinking easier by putting the numbers in writing. What is the one thing that would have to be true for this to be a yes? process_explained
0.37
0.90
16
02:43
customer
Okay, that is not what I expected. Say the term part again?
0.47
0.86
17
02:51
agent
Fair. Anything else in the way before we talk about next steps?
0.09
0.84
18
03:00
customer
We have equity in the house. Would it not be smarter to borrow against that and be done? wants_loan
0.16
0.83
19
03:10
agent
A consolidation loan is a real option and I will not talk you out of one you qualify for. The difference is that a loan moves $16,100 to a new lender at a new rate; this program negotiates the $16,100 itself down toward $8,500. If the loan gets approved at a rate you like, take it. process_explained
0.43
0.87
20
03:37
customer
Hm. That actually makes more sense than what I thought this was.
0.40
0.90
21
03:44
agent
Alright. Tell me what else is bothering you about it.
0.18
0.84
22
03:50
customer
I cannot do $220. If I had $220 a month sitting around I would not be having this conversation. cant_afford
0.06
0.98
23
04:08
agent
Then $220 is the wrong number and we should not pretend otherwise. Tell me what you can actually sustain every month without it becoming a second problem, and I will build backwards from that figure. process_explained
0.24
0.83
24
04:57
customer
Alright. If the number can move, I am still listening.
0.43
0.84
25
05:04
agent
So: does $220 a month over 48 months look like something you can live with? And I know that is a lot of numbers at once.
0.11
0.89
26
05:17
customer
Okay. Let us do it.
0.65
0.90
27
05:21
agent
Great, Tobias. Welcome in. You will hear from your account contact this week.
Customer sentimentCannot affordWants a loan insteadNeeds to consult a partnerNeeds time to thinkProcess explained
#
t
Speaker
Turn
Sentiment
Conf
0
00:00
agent
Good morning Ansel, Rosalind with Northwind Financial. I have your file open here. Are you somewhere you can talk numbers?
0.36
0.90
1
00:12
customer
I can talk, but I have to leave in about fifteen.
-0.38
0.99
2
00:18
agent
Perfect. Just so you know up front, nothing gets enrolled on this call without you saying yes to it. And I know that is a lot of numbers at once.
0.24
0.92
3
00:35
customer
Okay.
-0.21
0.99
4
00:37
agent
Give me the rough total across the cards. Ballpark is fine, I will pull the exact figures later.
0.06
0.95
5
00:49
customer
Honestly I stopped adding it up. Somewhere near $57,400.
-0.39
0.97
6
00:56
agent
Is that on one card or several? Does that part make sense so far?
0.22
0.85
7
01:05
customer
6 accounts. Two of them are the bad ones.
-0.40
0.98
8
01:10
agent
Has anything shifted on the income side in the last year?
0.23
0.91
9
01:18
customer
We went down to one income for four months. I was making minimums and that was it.
-0.49
0.93
10
01:29
agent
Understood. You are not the first person to tell me that this week. Stop me if any of this is unclear.
0.09
0.95
11
01:41
agent
So on $57,400, what we would build is a 28 month plan at about $1,555 a month, targeting settlements that land near $35,300 in total.
0.30
0.95
12
01:55
customer
What does it do to my credit?
-0.28
0.90
13
02:15
agent
That tracks. Minimum payments are designed to keep the balance where it is.
0.21
0.81
14
02:48
customer
I would have to talk to my husband first. The accounts are joint. consult_spouse
-0.71
0.98
15
02:56
agent
Okay. Well, the offer is on the table.
0.30
0.91
16
03:01
customer
I feel like you are reading off a script.
-0.72
0.95
17
03:07
agent
Understood. What is the other piece you are weighing?
0.28
0.90
18
03:12
customer
$1,555 a month is not happening. My rent went up in June and there is nothing left after groceries. cant_afford
-0.98
0.87
19
03:23
agent
I hear you on $1,555. Two levers exist: we can stretch the term past 28 months, which lowers the monthly, or we can start with fewer accounts and add the rest at month four. Which of those is easier on the budget? I would rather over-explain than have you sign something you did not follow.
0.23
0.93
20
04:08
customer
Hm. That actually makes more sense than what I thought this was.
-0.85
0.84
21
04:16
agent
Fair. Anything else in the way before we talk about next steps? Does that part make sense so far?
0.21
0.89
22
04:25
customer
We have equity in the house. Would it not be smarter to borrow against that and be done? wants_loan
-0.92
0.99
23
04:56
agent
Right, but most people find the value once they get started. Take a second with that if you need it.
0.12
0.92
24
05:07
customer
You are not really answering me though.
-1.00
0.96
25
05:13
agent
Honest read from you. Is this a fit, or is it not?
0.27
0.91
26
05:19
customer
No, I do not think this is for me.
-0.95
0.88
27
05:25
agent
Understood, Ansel. Thank you for the time either way.
Customer sentimentCannot affordWants a loan insteadNeeds to consult a partnerNeeds time to thinkProcess explained
#
t
Speaker
Turn
Sentiment
Conf
0
00:00
agent
Hi Rosa, this is Xanthe with Northwind Financial, calling back about the request you put in on our site. Is now still a workable time? I want to make sure I am not going too fast here.
0.11
0.79
1
00:19
customer
I can talk, but I have to leave in about fifteen.
0.04
0.88
2
00:26
agent
Perfect. Just so you know up front, nothing gets enrolled on this call without you saying yes to it.
0.39
0.90
3
00:38
customer
I am with you.
0.19
0.96
4
00:41
agent
Let me start with the picture. Roughly what are you carrying across cards and personal loans right now? Take a second with that if you need it.
0.20
0.94
5
00:56
customer
About $21,200. Maybe a little more with the interest this month.
0.12
0.91
6
01:03
agent
And how many separate accounts is that spread across? Stop me if any of this is unclear.
0.45
0.93
7
01:14
customer
Spread over 5 cards. needs_time
0.11
0.66
8
01:18
agent
Were you keeping up until something happened, or has it been tight for a while? Stop me if any of this is unclear.
0.27
0.75
9
01:30
customer
My hours got cut in the spring and I have been covering the gap with the cards since.
0.07
0.90
10
02:02
agent
Understood. You are not the first person to tell me that this week.
0.14
0.87
11
02:11
agent
So on $21,200, what we would build is a 33 month plan at about $440 a month, targeting settlements that land near $12,300 in total. I would rather over-explain than have you sign something you did not follow.
0.45
0.89
12
02:30
customer
And who is holding the money in the meantime?
0.27
0.92
13
02:37
agent
Mechanically it works like this. You fund a dedicated account you control at $440 a month. As it builds, we negotiate each creditor one at a time, starting with the account most likely to settle, and every settlement is paid out of that account. Our fee only applies to balances we actually resolve. process_explained
0.20
0.88
14
03:02
customer
$440 a month is not happening. My rent went up in June and there is nothing left after groceries. cant_afford
-0.19
0.83
15
03:14
agent
Sure. Anyway, as I was saying, the program really does work well for people in your situation. And I know that is a lot of numbers at once. process_explained
0.10
0.68
16
03:29
customer
That does not address what I asked.
-0.33
0.94
17
03:35
agent
Fair. Anything else in the way before we talk about next steps?
0.26
0.87
18
04:10
customer
Let me talk to my daughter. She helps me with the financial side of things. needs_time
-0.68
0.64
19
04:35
agent
Understood. So the conversation is useful rather than a rerun: the three numbers that matter are $440 a month, about 33 months, and roughly $12,300 resolved. Bring those to them. Take a second with that if you need it.
0.10
0.89
20
04:54
customer
Alright. If the number can move, I am still listening.
-0.57
0.92
21
05:00
agent
Okay. What else is sitting on this for you? Does that part make sense so far?
0.01
0.89
22
05:21
customer
I need to think about it. This is a lot to take in on one call. needs_time
-0.81
0.91
23
05:31
agent
Absolutely. Let me make the thinking easier by putting the numbers in writing. What is the one thing that would have to be true for this to be a yes? And I know that is a lot of numbers at once. process_explained
0.09
0.94
24
05:51
customer
That is fair. I appreciate you not dodging the credit question.
-0.59
0.92
25
05:58
agent
Where does that leave you? If the numbers work, I can build the plan while we are on the line. I would rather over-explain than have you sign something you did not follow.
0.15
0.89
26
06:16
customer
Yeah, call me back later in the week. needs_time
-0.48
0.87
27
06:23
agent
Fair enough. I will follow up Wednesday. Nothing changes on your file in the meantime. I want to make sure I am not going too fast here.
Customer sentimentCannot affordWants a loan insteadNeeds to consult a partnerNeeds time to thinkProcess explained
#
t
Speaker
Turn
Sentiment
Conf
0
00:00
agent
Cyrus? Quillon with Northwind Financial. You asked us to walk you through the options on your balances. Do you have about ten minutes? I would rather over-explain than have you sign something you did not follow.
0.14
0.97
1
00:17
customer
Sure, go ahead. I have been meaning to deal with this.
-0.00
0.87
2
00:25
agent
Great. Before anything else, nothing we do today changes your accounts. This is a conversation, and you decide at the end. I would rather over-explain than have you sign something you did not follow.
0.28
0.95
3
00:42
customer
Right.
0.29
0.94
4
00:45
agent
How much total would you say is sitting on the revolving accounts? I would rather over-explain than have you sign something you did not follow.
0.27
0.85
5
00:59
customer
It is around $36,200, give or take.
0.26
0.88
6
01:03
agent
How many creditors are we talking about?
0.18
0.94
7
01:09
customer
About 6, plus one store card I barely use.
0.27
0.89
8
01:15
agent
Were you keeping up until something happened, or has it been tight for a while?
0.09
0.99
9
01:22
customer
We went down to one income for four months. I was making minimums and that was it.
0.26
0.98
10
01:32
agent
That is a common story and it is not a character flaw. The interest math does most of the damage.
0.35
0.88
11
01:42
agent
For $36,200 spread across 6 accounts, the plan runs about 36 months at $830 a month, and we are negotiating toward roughly $23,700. Does that part make sense so far? process_explained
0.29
0.54
12
01:57
agent
On the credit side I want to be straight with you: as accounts go delinquent during negotiation, the score takes a hit, and it recovers as accounts resolve. The program runs about 36 months. Anyone who tells you the score is untouched is selling you something else. process_explained
0.15
0.97
13
02:19
customer
How long does something like this take?
0.48
0.89
14
02:25
agent
Okay. Thank you for being straight with me about it. I would rather over-explain than have you sign something you did not follow.
0.31
0.90
15
02:36
customer
That is more than my car payment. I do not see where $830 comes from. cant_afford
0.02
0.99
16
02:45
agent
Then $830 is the wrong number and we should not pretend otherwise. Tell me what you can actually sustain every month without it becoming a second problem, and I will build backwards from that figure. Stop me if any of this is unclear.
0.13
0.92
17
03:06
customer
Okay, that is not what I expected. Say the term part again?
0.36
0.99
18
03:13
agent
Fair. Anything else in the way before we talk about next steps?
0.18
0.96
19
03:22
customer
Let me sit with it for a couple of days. needs_time
0.05
0.84
20
03:29
agent
Take the time, this is not a decision to rush. One thing to weigh while you think: at the current minimums the balance moves slowly, so the wait has a price attached. Can I call Thursday? process_explained
0.30
0.94
21
03:46
customer
Alright. If the number can move, I am still listening.
0.40
0.92
22
03:53
agent
Understood. What is the other piece you are weighing? Does that part make sense so far?
0.26
0.94
23
04:26
customer
A loan seems cleaner. One payment, one lender, no negotiating. wants_loan
-0.08
0.80
24
04:34
agent
That is the right instinct. The catch I see most often is approval at a rate that is not much better than the cards, on a balance that has not moved. If your pre-approval is real and the rate is good, go take it. If it comes back thin, this is here.
0.23
0.84
25
04:58
customer
That is fair. I appreciate you not dodging the credit question.
0.24
0.94
26
05:15
agent
So: does $830 a month over 36 months look like something you can live with? I would rather over-explain than have you sign something you did not follow.
0.19
0.94
27
05:54
customer
Thursday works. Send the paperwork first. consult_spouse
0.31
0.51
28
06:00
agent
Fair enough. I will follow up Wednesday. Nothing changes on your file in the meantime.
0.23
0.92
This is the grain everything else is built from. The workbook aggregates these turns; the live agent reads them as they arrive. Nothing in the coaching board exists that cannot be traced back to a row on a page like this one.
Corpus at a glance
Measure
Value
Reps on the roster
27
Tiers
3 (Tier 1 (senior), Tier 2 (core), Tier 3 (ramp))
Calls scored
224
Turns scored
5,281
Mean call length
5m 03s
Objections detected
463
Generator seed
4517
Week
July 20, 2026
Disposition mix
Disposition
Calls
Share
enrolled
87
39%
callback
70
31%
declined
46
21%
not_qualified
21
9%
What the pipeline writes
File
Size
What it is
data/transcripts.jsonl
224 calls, 5,281 turns
the corpus. Carries no labels at all, exactly like a production extract.
data/ground_truth.jsonl
224 records
the events the generator planted. Read only by the evaluation harness; the scoring path never sees it.
data/scores.jsonl
5,281 scored turns
pre-generated turn labels in the exact shape the live scorer returns.
data/agent_features.jsonl
463 payloads
one flat payload per decision point for the live agent's inference step.
data/workbook_data.json
one document
everything this page renders, so the numbers can be diffed between runs.
Reproducibility: one seed drives the roster, the skill parameters, every call, every turn of text, the latent sentiment path, and the fixture scorer's error draws. Running python3 build.py twice produces byte-identical files, which is the only way a change in a number can be attributed to a change in the method rather than to the weather.
One scored record, verbatim from data/scores.jsonl