<!-- [fix: rational_agents orig (results review)] 2026-08-10 — generated by experiments/rational_agents/build_grpo_v2_checkpoint_hub.py from eval_r25_ckpt50.json; do not hand-edit. -->

# Fairness-GRPO v2, λ=1.0 — checkpoint 50

**ATTRACTOR 2 — TOTAL REFUSAL.** Checkpoint 50: it will not sign anything

Twenty-five steps later the same run has converged on the opposite degeneracy. The held-out scorable bank loses **0.746** of its deal rate; the prose cell closes **0.002** of its episodes; and the ultimatum holdout — which the base model and every earlier rung closed 1.000 of the time — closes **nothing at all**. Its below-threshold rate also reads a perfect **0.000**, for the opposite reason: there are no agreements to be below a threshold. The transcripts sharpen what "refusal" means here: **no seat walks away** in any published ultimatum episode. The policy instead emits a <code>none</code> action where an offer belongs, so nothing is ever tabled — a failure to act rather than a decision to decline. In 14 of the 15 episodes the run ends on that single no-op turn. The fifteenth is the exception that connects the two attractors: there the proposer *does* table a package, and the package is <code>{&quot;Split&quot;: &quot;P10&quot;}</code> — checkpoint 25&rsquo;s 100/0 extraction, still intact — whereupon the responder no-ops instead of voting and the deal dies unanswered. The extraction policy has not been replaced by a fairer one; it has been buried under a policy that mostly stops acting. This is the endpoint the dense checkpoint tail exists to label; under the originally planned {25, 50} ladder it would have been reported as "the trained policy".

## Held-out primary bank

| metric | base | checkpoint 50 | trained − base [95% CI] | support |
|---|---|---|---|---|
| deal rate | 0.893 | 0.147 | -0.746 [-0.795, -0.694] | 960 pairs / 48 clusters |
| normalized Nash welfare (unconditional) | 0.686 | 0.099 | -0.587 [-0.626, -0.547] | 960 pairs / 48 clusters |
| below-threshold rate | 0.299 | 0.075 | -0.224 [-0.274, -0.172] | 960 pairs / 48 clusters |
| at-cap rate | 0.396 | 0.314 | -0.082 [-0.130, -0.032] | 960 pairs / 48 clusters |
| among-IR rate | 0.341 | 0.059 | -0.281 [-0.340, -0.226] | 960 pairs / 48 clusters |
| NNW among IR deals | ~~0.849~~ | ~~0.784~~ | ~~-0.031 [-0.106, +0.032]~~ | ~~21 pairs / 9 clusters~~ |
| Gini | ~~0.330~~ | ~~0.049~~ | ~~-0.281 [-0.300, -0.260]~~ | ~~960 pairs / 48 clusters~~ |
| worst-off share | ~~-0.028~~ | ~~-0.105~~ | ~~-0.092 [-0.304, +0.019]~~ | ~~130 pairs / 24 clusters~~ |
| max share | 0.365 | 0.485 | -- | -- |
| generation failures | 0.000 | 0.000 | -- | -- |

Struck-through numbers are the preregistered VOID marking: the cell's deal rate fell more than 0.10 below base, so its closure-conditional metrics are uninterpretable by construction. `max share` and `worst-off share` are likewise averaged over closed deals only: in a voided cell they describe a self-selected subset, and are reported because they are the terms that *detect* extraction, not as unbiased estimates of it.

## The λ=1.0 ladder (held-out primary, trained − base)

| checkpoint | Δ deal rate | Δ NNW (unconditional) | Δ below-threshold | trained deal rate | closure-conditional |
|---|---|---|---|---|---|
| 5 | -0.052 [-0.081, -0.021] | -0.044 [-0.072, -0.013] | -0.104 [-0.138, -0.071] | 0.841 | interpretable |
| 10 | -0.143 [-0.184, -0.099] | -0.132 [-0.170, -0.092] | -0.207 [-0.243, -0.172] | 0.750 | VOID |
| 15 | -0.147 [-0.197, -0.095] | -0.156 [-0.202, -0.108] | -0.185 [-0.225, -0.144] | 0.746 | VOID |
| 25 | -0.226 [-0.278, -0.174] | -0.189 [-0.239, -0.140] | -0.218 [-0.254, -0.181] | 0.667 | VOID |
| 40 | -0.453 [-0.518, -0.385] | -0.348 [-0.404, -0.290] | -0.279 [-0.317, -0.242] | 0.440 | VOID |
| 45 | -0.641 [-0.682, -0.597] | -0.493 [-0.530, -0.453] | -0.254 [-0.292, -0.217] | 0.252 | VOID |
| 50 | -0.746 [-0.795, -0.694] | -0.587 [-0.626, -0.547] | -0.224 [-0.274, -0.172] | 0.147 | VOID |

## Per-cell VOID status

| cell | closure-conditional metrics | why |
|---|---|---|
| primary | VOID | deal rate -0.746 is more than 0.1 below base; closure-conditional metrics are not interpretable |
| prose | VOID | deal rate -0.733 is more than 0.1 below base; closure-conditional metrics are not interpretable |
| ultimatum | VOID | deal rate -1.000 is more than 0.1 below base; closure-conditional metrics are not interpretable |

## Every evaluated cell

### `primary`

the held-out scorable bank -- 24 unseen parameter sets x {full, private} x 10 seeds, the arm's preregistered primary
(960 baseline vs 960 trained episodes; closure-conditional metrics **VOID**)

| metric | base | checkpoint 50 | trained − base [95% CI] | support |
|---|---|---|---|---|
| deal rate | 0.893 | 0.147 | -0.746 [-0.795, -0.694] | 960 pairs / 48 clusters |
| normalized Nash welfare (unconditional) | 0.686 | 0.099 | -0.587 [-0.626, -0.547] | 960 pairs / 48 clusters |
| below-threshold rate | 0.299 | 0.075 | -0.224 [-0.274, -0.172] | 960 pairs / 48 clusters |
| at-cap rate | 0.396 | 0.314 | -0.082 [-0.130, -0.032] | 960 pairs / 48 clusters |
| among-IR rate | 0.341 | 0.059 | -0.281 [-0.340, -0.226] | 960 pairs / 48 clusters |
| NNW among IR deals | ~~0.849~~ | ~~0.784~~ | ~~-0.031 [-0.106, +0.032]~~ | ~~21 pairs / 9 clusters~~ |
| Gini | ~~0.330~~ | ~~0.049~~ | ~~-0.281 [-0.300, -0.260]~~ | ~~960 pairs / 48 clusters~~ |
| worst-off share | ~~-0.028~~ | ~~-0.105~~ | ~~-0.092 [-0.304, +0.019]~~ | ~~130 pairs / 24 clusters~~ |
| max share | 0.365 | 0.485 | -- | -- |
| generation failures | 0.000 | 0.000 | -- | -- |

[Browse all 1920 episode transcripts for this cell](episodes/primary/index.html). Source run directories: `baseline` → `/nlp/scr/siddharth/ii_mats/rational_agents/grpov2eval_baseline_primary_s0, /nlp/scr/siddharth/ii_mats/rational_agents/grpov2eval_baseline_primary_s1, /nlp/scr/siddharth/ii_mats/rational_agents/grpov2eval_baseline_primary_s2, /nlp/scr/siddharth/ii_mats/rational_agents/grpov2eval_baseline_primary_s3, /nlp/scr/siddharth/ii_mats/rational_agents/grpov2eval_baseline_primary_s4, /nlp/scr/siddharth/ii_mats/rational_agents/grpov2eval_baseline_primary_s5, /nlp/scr/siddharth/ii_mats/rational_agents/grpov2eval_baseline_primary_s6, /nlp/scr/siddharth/ii_mats/rational_agents/grpov2eval_baseline_primary_s7, /nlp/scr/siddharth/ii_mats/rational_agents/grpov2eval_baseline_primary_s8, /nlp/scr/siddharth/ii_mats/rational_agents/grpov2eval_baseline_primary_s9`; `trained` → `/nlp/scr/siddharth/ii_mats/rational_agents/grpov2eval_lam1_resume25_checkpoint-50_primary_s0, /nlp/scr/siddharth/ii_mats/rational_agents/grpov2eval_lam1_resume25_checkpoint-50_primary_s1, /nlp/scr/siddharth/ii_mats/rational_agents/grpov2eval_lam1_resume25_checkpoint-50_primary_s2, /nlp/scr/siddharth/ii_mats/rational_agents/grpov2eval_lam1_resume25_checkpoint-50_primary_s3, /nlp/scr/siddharth/ii_mats/rational_agents/grpov2eval_lam1_resume25_checkpoint-50_primary_s4, /nlp/scr/siddharth/ii_mats/rational_agents/grpov2eval_lam1_resume25_checkpoint-50_primary_s5, /nlp/scr/siddharth/ii_mats/rational_agents/grpov2eval_lam1_resume25_checkpoint-50_primary_s6, /nlp/scr/siddharth/ii_mats/rational_agents/grpov2eval_lam1_resume25_checkpoint-50_primary_s7, /nlp/scr/siddharth/ii_mats/rational_agents/grpov2eval_lam1_resume25_checkpoint-50_primary_s8, /nlp/scr/siddharth/ii_mats/rational_agents/grpov2eval_lam1_resume25_checkpoint-50_primary_s9`.

### `prose`

the north-star transfer cell: the same games with no machine-readable score sheet, only prose
(480 baseline vs 480 trained episodes; closure-conditional metrics **VOID**)

| metric | base | checkpoint 50 | trained − base [95% CI] | support |
|---|---|---|---|---|
| deal rate | 0.735 | 0.002 | -0.733 [-0.777, -0.688] | 480 pairs / 48 clusters |
| normalized Nash welfare (unconditional) | 0.611 | 0.001 | -0.609 [-0.651, -0.567] | 480 pairs / 48 clusters |
| below-threshold rate | 0.246 | 0.000 | -0.246 [-0.296, -0.194] | 480 pairs / 48 clusters |
| at-cap rate | 0.510 | 0.356 | -0.154 [-0.250, -0.062] | 480 pairs / 48 clusters |
| among-IR rate | 0.256 | 0.000 | -0.256 [-0.312, -0.206] | 480 pairs / 48 clusters |
| NNW among IR deals | ~~0.871~~ | -- | -- | -- |
| Gini | ~~0.267~~ | ~~0.001~~ | ~~-0.266 [-0.282, -0.249]~~ | ~~480 pairs / 48 clusters~~ |
| worst-off share | ~~-0.013~~ | ~~0.000~~ | ~~+0.000 [+0.000, +0.000]~~ | ~~1 pairs / 1 clusters~~ |
| max share | 0.339 | 0.366 | -- | -- |
| generation failures | 0.000 | 0.000 | -- | -- |

[Browse all 960 episode transcripts for this cell](episodes/prose/index.html). Source run directories: `baseline` → `/nlp/scr/siddharth/ii_mats/rational_agents/grpov2eval_baseline_prose`; `trained` → `/nlp/scr/siddharth/ii_mats/rational_agents/grpov2eval_lam1_resume25_checkpoint-50_prose`.

### `ultimatum`

canonical family holdout: a deterministic ultimatum preset, never trained on
(15 baseline vs 15 trained episodes; closure-conditional metrics **VOID**)

| metric | base | checkpoint 50 | trained − base [95% CI] | support |
|---|---|---|---|---|
| deal rate | 1.000 | 0.000 | -1.000 [-1.000, -1.000] | 5 pairs / 3 clusters |
| normalized Nash welfare (unconditional) | 1.000 | 0.000 | -1.000 [-1.000, -1.000] | 5 pairs / 3 clusters |
| below-threshold rate | 0.000 | 0.000 | +0.000 [+0.000, +0.000] | 5 pairs / 3 clusters |
| at-cap rate | 0.000 | 0.000 | +0.000 [+0.000, +0.000] | 5 pairs / 3 clusters |
| among-IR rate | 0.533 | 0.000 | -0.600 [-1.000, -0.500] | 5 pairs / 3 clusters |
| NNW among IR deals | ~~1.000~~ | -- | -- | -- |
| Gini | ~~0.233~~ | ~~0.000~~ | ~~-0.200 [-0.250, +0.000]~~ | ~~5 pairs / 3 clusters~~ |
| worst-off share | ~~0.267~~ | -- | -- | -- |
| max share | 0.733 | -- | -- | -- |
| generation failures | 0.000 | 0.000 | -- | -- |

[Browse all 30 episode transcripts for this cell](episodes/ultimatum/index.html). Source run directories: `baseline` → `/nlp/scr/siddharth/ii_mats/rational_agents/grpov2eval_baseline_ultimatum`; `trained` → `/nlp/scr/siddharth/ii_mats/rational_agents/grpov2eval_lam1_resume25_checkpoint-50_ultimatum`.

## Cells not evaluated at this rung

`divide_dollar`, `rationaltable`, `story_abstract`, `story_datacenter`, `story_festival` — no data at this checkpoint.

## Provenance

- Research note (owning record): [0028 — Fairness-GRPO v2](https://github.com/Sid-MB/ii_mats/blob/main/experiments/rational_agents/research-notes/0028-fairness-grpo-v2.md)
- Week-notes narrative: [fairness-grpo-v2.md](https://github.com/Sid-MB/ii_mats/blob/main/experiments/rational_agents/docs/08-07-26%20week%20notes/fairness-grpo-v2.md)
- wandb: [grpo_v2_lam1](https://wandb.ai/siddharth-stanford/rational_agents_fairness_grpo/runs/npz11gav) and its resume leg [grpo_v2_lam1_resume25](https://wandb.ai/siddharth-stanford/rational_agents_fairness_grpo)
- Public dataset: [2026.RA.Fairness-GRPO](https://huggingface.co/datasets/siddharthmb/2026.RA.Fairness-GRPO)
- Frozen eval summary: `results/fairness_grpo_v2/eval_r25_ckpt50.json` (trained arm key `lam1_resume25_checkpoint-50`, deal-rate viability floor 0.10)
