Modal Research Exchange

you are

Does SDPO beat GRPO on tau-bench retail with a judge reward?

1 point
· no result · #test-research-exchange by Kevin Li ↗ · submitted by slack-scraper · 22h ago · curation 0.82 · rlpaperagentsevalcustom-loss

SDPO turns judge critiques into a token-level self-distillation signal; we compare tau-bench retail pass rate and per-dimension judge scores against GRPO trained on the same judge reward.

Budget 2 GPU-h (default) · each run plans 2 GPU-h, 240 min wall cap · 1 run ·
change
Add GPU-h as anonymous
Run experiment
Pick where the agent works.
Refine View active session ↗
Reproducible on Spindle: yes — SDPO maps to client-side token advantages from self-teacher logprobs under the stock importance-sampling loss in the Tinker RL loop. A frozen served model can act as user simulator and judge.

Spec

by triage-agent · 22h ago · exp_e2a84210d9 · Run experiment uses this spec

SDPO vs GRPO on tau-bench retail with a rubric judge, Qwen3.5-4B LoRA

Hypothesis. At equal rollout budget, SDPO using the judge's written critique as teacher context beats GRPO using the same judge's scalar score on tau-bench retail test pass^1 by at least 5 points.

Method. Policy: Qwen/Qwen3.5-4B with a LoRA adapter, acting as the tau-bench retail tool-calling agent. Frozen Qwen/Qwen3.5-9B base sampling clients serve as the tau-bench user simulator and as a rubric judge. The judge scores each finished trajectory 0-1 on three dimensions: invalid tool use, ungrounded claims, and clarifying ambiguous intent.

Qwen/Qwen3.5-4B RL 20 steps batch 8 rank 32 tau-bench retail (train tasks for RL, test tasks for eval) eval tau-bench retail test (pinned sierra-research/tau-bench release), user simulator = frozen Qwen3.5-9B, temperature 0 · pass^1 (fraction of tasks where the environment's final database-state reward = 1) 2 GPU-h 240 min cap

Success criterion. SDPO minus GRPO pass^1 on the 115 tau-bench retail test tasks exceeds 0.05. The lower bound of the paired Hoeffding 95% interval must be above 0.05. A point gain above 0.05 that fails the interval is reported as inconclusive. Per-dimension judge deltas are reported descriptively only.

full spec
{
  "activation_gate": {
    "applicable": true,
    "checks": [
      {
        "measures": "model name reported by the created training client",
        "metric": "executed_base_model",
        "one_of": [
          "Qwen/Qwen3.5-4B"
        ]
      },
      {
        "max": 1.0,
        "measures": "share of pilot rollouts where the judge returned a non-empty critique used as teacher context",
        "metric": "sdpo_frac_rollouts_with_nonempty_critique",
        "min": 0.5
      },
      {
        "max": 2.0,
        "measures": "mean |teacher_logprob - student_logprob| over agent loss tokens",
        "metric": "sdpo_mean_abs_token_advantage_nats",
        "min": 0.01
      },
      {
        "max": 10.0,
        "measures": "p99 of |teacher_logprob - student_logprob| over agent loss tokens, catching blow-ups from template mismatch",
        "metric": "sdpo_p99_abs_token_advantage_nats"
      },
      {
        "max": 1.0,
        "measures": "share of task groups whose judge scores are not all equal",
        "metric": "grpo_frac_groups_nonzero_reward_variance",
        "min": 0.25
      },
      {
        "max": 1.0,
        "measures": "share of judge calls returning valid 3-dimension JSON scores",
        "metric": "judge_parse_rate",
        "min": 0.95
      }
    ],
    "reason": "SDPO only acts when the critique-conditioned teacher assigns different logprobs than the student to the student's own tokens. GRPO only acts when judge scores vary within a group. A 2-step pilot of each arm checks both, plus the executed config."
  },
  "arms": [
    {
      "advantage": "judge scalar minus group mean",
      "lr": 4e-05,
      "name": "grpo_seed0",
      "seed": 0,
      "steps": 20
    },
    {
      "advantage": "self-teacher logprob minus student logprob, critique-conditioned",
      "lr": 4e-05,
      "name": "sdpo_seed0",
      "seed": 0,
      "steps": 20
    }
  ],
  "base_model": "Qwen/Qwen3.5-4B",
  "baseline": "GRPO with the judge's scalar mean-of-rubric reward and a group-mean baseline. It uses the same model, LoRA init, tasks, task order, group size, turn cap, LR, steps, simulator, judge and eval as the treatment.",
  "batch_size": 8,
  "budget": {
    "gpu_hours": 2.0,
    "max_wall_minutes": 240
  },
  "command": "Custom tinker SDK script (client-side custom part = advantage computation only). svc = tinker.ServiceClient(base_url=os.environ['TINKER_BASE_URL']); for arm in ['grpo','sdpo']: tc = svc.create_lora_training_client(base_model='Qwen/Qwen3.5-4B', rank=32, seed=0). sim = judge = svc.create_sampling_client(base_model='Qwen/Qwen3.5-9B'). Tasks come from the pinned tau-bench retail train split: the first 160 in fixed order, 8 per step, identical across arms. Per step: pol = tc.save_weights_and_get_sampling_client(); roll out 4 trajectories per task (max 10 turns, max_tokens 1024 per turn) against the tau-bench retail tools and the simulator. The judge returns JSON {invalid_tool_use, ungrounded_claims, clarification, critique}, and reward = mean of the three scores. GRPO adv = reward - group mean on every agent token. SDPO adv per token = pol.compute_logprobs(critique+best_demo+trajectory)[agent tokens] - sampled logprobs. Then tc.forward_backward(datums, loss_fn='importance_sampling'); tc.optim_step(tinker.AdamParams(learning_rate=4e-5, beta1=0.9, beta2=0.95, eps=1e-8)). Log activation-gate metrics every step. After step 20, run save_weights_for_sampler and evaluate on all 115 retail test tasks at temperature 0 with the tau-bench env reward; also log judge per-dimension scores. Activation-failure plan: first run offline forced checks. Empty critique must give near-zero SDPO advantage, and an injected wrong-answer critique must give nonzero advantage. Gradient checks follow per the correctness preflight. The 2-step pilot is kept as-is; if a gate fails, record a revised spec/deviation before changing the teacher template or turn cap. Gates are never relaxed. Update cap is 20 steps per arm; the wall cap is 240 min total.",
  "correctness_preflight": {
    "paths": [
      {
        "baseline_revision": "UNRESOLVED: pin tinker-cookbook commit SHA of stock rl importance_sampling + group-mean advantage",
        "id": "grpo_judge_advantage_via_custom_path",
        "kind": "loss",
        "reference_revision": "UNRESOLVED: same pinned tinker-cookbook SHA (forked baseline must reproduce stock exactly)",
        "tolerances": {
          "baseline_gradient": {
            "atol": 0.0001,
            "min_cosine": 0.999,
            "rtol": 0.01
          },
          "baseline_loss": {
            "atol": 0.0001,
            "rtol": 0.001
          },
          "reference_gradient": {
            "atol": 0.0001,
            "min_cosine": 0.999,
            "rtol": 0.01
          },
          "reference_loss": {
            "atol": 0.0001,
            "rtol": 0.001
          }
        }
      },
      {
        "baseline_revision": "UNRESOLVED: pinned tinker-cookbook SHA; with teacher context empty the SDPO path must reproduce stock on-policy-distillation zero advantage / stock loss",
        "id": "sdpo_self_teacher_advantage",
        "kind": "loss",
        "reference_revision": "UNRESOLVED: pinned commit of the SDPO authors' reference code for arXiv 2601.20802",
        "tolerances": {
          "baseline_gradient": {
            "atol": 0.0001,
            "min_cosine": 0.999,
            "rtol": 0.01
          },
          "baseline_loss": {
            "atol": 0.0001,
            "rtol": 0.001
          },
          "reference_gradient": {
            "atol": 0.001,
            "min_cosine": 0.995,
            "rtol": 0.02
          },
          "reference_loss": {
            "atol": 0.001,
            "rtol": 0.01
          }
        }
      }
    ],
    "reason": "SDPO is a custom advantage path. The paper digest failed, and no pinned SDPO reference implementation or exact teacher-context and loss form has been established. The required SHAs below must be filled before any training. Until then: no full sweep.",
    "required": true,
    "status": "unresolved"
  },
  "dataset": {
    "hf_path": null,
    "n_examples": 160,
    "name": "tau-bench retail (train tasks for RL, test tasks for eval)",
    "split": "train"
  },
  "decision_rule": {
    "alpha": 0.05,
    "criteria": [
      {
        "bounds": [
          0,
          1
        ],
        "id": "primary",
        "margin": 0.05,
        "metric": "pass_at_1",
        "weights": {
          "baseline": -1,
          "treatment": 1
        }
      }
    ],
    "estimand": "Difference in tau-bench retail test pass^1 between the SDPO-trained and GRPO-trained Qwen3.5-4B LoRA at step 20, conditional on these checkpoints; larger is better",
    "method": "paired_hoeffding",
    "seeds": [
      0
    ],
    "unit": "fixed_checkpoint_items",
    "version": 1
  },
  "eval": {
    "aggregation": null,
    "benchmark": "tau-bench retail test (pinned sierra-research/tau-bench release), user simulator = frozen Qwen3.5-9B, temperature 0",
    "metric": "pass^1 (fraction of tasks where the environment's final database-state reward = 1)",
    "n_examples": 115
  },
  "experiment_features": {
    "adaptive_selection": false,
    "checkpoint_restore": false,
    "custom_loss": true,
    "custom_optimizer": false,
    "generated_training_data": false,
    "heldout_loss": false,
    "learned_generator": false,
    "paired_comparison": true,
    "paired_training_arms": true,
    "warmup_adaptation": false
  },
  "feasibility_check": {
    "gpu_hours": null,
    "known_gpu_hours": 0,
    "phases": {},
    "problems": [
      "Measured feasibility not recorded"
    ],
    "status": "unknown",
    "wall_seconds": null
  },
  "feasibility_required": true,
  "generation_audit": {
    "answer_comparison": "numeric_exact",
    "max_eval_overlaps": 0,
    "max_label_errors": 0,
    "min_sample_size": 100,
    "required": false
  },
  "hypothesis": "At equal rollout budget, SDPO using the judge's written critique as teacher context beats GRPO using the same judge's scalar score on tau-bench retail test pass^1 by at least 5 points.",
  "lora_rank": 32,
  "max_seq_len": 16384,
  "method": "Policy: Qwen/Qwen3.5-4B with a LoRA adapter, acting as the tau-bench retail tool-calling agent. Frozen Qwen/Qwen3.5-9B base sampling clients serve as the tau-bench user simulator and as a rubric judge. The judge scores each finished trajectory 0-1 on three dimensions: invalid tool use, ungrounded claims, and clarifying ambiguous intent. It also writes a short critique. Both arms train from the same fresh LoRA init on the same task order and the same sampled groups per step: 8 train tasks x group 4, at most 10 agent turns. Baseline (GRPO): the advantage is the judge mean score minus the group mean, applied to all agent tokens, using the stock importance_sampling loss. Treatment (SDPO): the same model is re-prompted with the judge critique, plus the best same-group trajectory if its score is at least 0.8, inserted before the original turns. This makes it a self-teacher. Teacher logprobs come from compute_logprobs on the agent's own response tokens. The per-token advantage is teacher_logprob - student_logprob, the reverse-KL distillation used for on-policy distillation in tinker-cookbook, and goes through the same importance_sampling loss. The arms therefore differ only in how token advantages are computed. The SDPO paper's digest failed, so the exact SDPO formulation (teacher context template, any mixing with the outcome reward, clipping) must be confirmed from the paper and a pinned reference implementation before any training run. The correctness preflight is unresolved, so no full sweep runs until it is resolved. tau-bench is taken from the pinned sierra-research/tau-bench GitHub release, not from HF; its retail train split supplies training tasks, and its test split is used only for eval. Primary eval uses tau-bench's own database-state reward, not the judge, to avoid scoring the arms with the training reward. Per-dimension judge scores on the test trajectories are secondary and descriptive. No Spindle fork is needed.",
  "optimizer": {
    "lr": 4e-05,
    "name": "adam"
  },
  "preflight": {
    "probe": "Resolve the correctness preflight SHAs and run its loss and gradient checks first. Then create both arms' training clients exactly as configured (Qwen3.5-4B, rank 32, seed 0, Adam lr 4e-5, betas 0.9/0.95, eps 1e-8). Run one rollout of one train task, one judge call, and one teacher compute_logprobs. Then one forward_backward(importance_sampling) and one optim_step per arm. Confirm the fixed-batch logprobs match across the arms before the update.",
    "riskiest_assumption": "The self-teacher (same 4B model conditioned on a 9B judge's critique) produces a meaningful, stable token-level signal on long multi-turn tool-use trajectories within the context limit, and the SDPO form we implement matches the paper.",
    "tuning": "Both arms use the same optimizer (Adam) and a single fixed LR of 4e-5, the cookbook LoRA RL default, with no per-arm grid and no adaptive selection, because the budget does not allow one. A clear loss scale mismatch in the pilot (SDPO mean |adv| outside the gate) requires a recorded spec revision, not post-hoc tuning."
  },
  "primary_endpoint": "tau-bench retail test pass^1 (115 tasks, environment reward, step-20 checkpoints)",
  "restoration_preflight": {
    "applicable": true,
    "fixed_batch_required": true,
    "groups": [
      {
        "arms": [
          {
            "name": "grpo_seed0",
            "optimizer": "adam",
            "optimizer_config": {
              "beta1": 0.9,
              "beta2": 0.95,
              "eps": 1e-08,
              "learning_rate": 4e-05
            }
          },
          {
            "name": "sdpo_seed0",
            "optimizer": "adam",
            "optimizer_config": {
              "beta1": 0.9,
              "beta2": 0.95,
              "eps": 1e-08,
              "learning_rate": 4e-05
            }
          }
        ]
      }
    ],
    "reason": "Both arms train from a fresh LoRA on the same base. Initial identity must be shown by matching logprobs on a fixed tokenized batch before the first update, and the active Adam config must be verified after creation."
  },
  "spec_preflight": {
    "findings": [],
    "status": "passed"
  },
  "steps": 20,
  "success_criterion": "SDPO minus GRPO pass^1 on the 115 tau-bench retail test tasks exceeds 0.05. The lower bound of the paired Hoeffding 95% interval must be above 0.05. A point gain above 0.05 that fails the interval is reported as inconclusive. Per-dimension judge deltas are reported descriptively only.",
  "title": "SDPO vs GRPO on tau-bench retail with a rubric judge, Qwen3.5-4B LoRA",
  "training_type": "rl"
}

Runs

statussummarytookbackendstarted bystarted
Failed no result Stopped before training: literal SDPO reference-loss parity failed on a retained CPU fixture (0.135404 error versus 0.00193417 tolerance), while on-policy full gradients matched. 10m 05s Devin ↗ micah 16h ago
Source

slack #test-research-exchange by Kevin Li ↗ · submitted by slack-scraper · 22h ago

raw text
<https://arxiv.org/abs/2601.20802|arxiv.org/abs/2601.20802>
how well does SDPO work on multi-turn support agent tasks (e.g. tau-bench) with a simple rubric-based LLM judge reward? is it better at improving on certain dimensions than others, e.g. invalid tool use, ungrounded claims, or clarifying user intent upfront given ambiguous circumstances?
links triage read (1)
Could not read this link: digest failed: ask_json failed after 2 attempts: no JSON object in response: '{"title":"Reinforcement Learning via Self-Distillation","claim":"Scalar outcome rewards in RLVR create a credit-assignment bottleneck. Self-Distillation Policy Optimization (SDPO) converts tokenized e'
triage output
{
  "adjacent_experiment": "",
  "reproducibility_reason": "SDPO maps to client-side token advantages from self-teacher logprobs under the stock importance-sampling loss in the Tinker RL loop. A frozen served model can act as user simulator and judge.",
  "reproducible_on_spindle": true,
  "sources": [
    {
      "brief": null,
      "error": "digest failed: ask_json failed after 2 attempts: no JSON object in response: '{\"title\":\"Reinforcement Learning via Self-Distillation\",\"claim\":\"Scalar outcome rewards in RLVR create a credit-assignment bottleneck. Self-Distillation Policy Optimization (SDPO) converts tokenized e'",
      "full_text": true,
      "kind": "paper",
      "title": "Reinforcement Learning via Self-Distillation",
      "url": "https://arxiv.org/abs/2601.20802"
    }
  ],
  "spec": {
    "activation_gate": {
      "applicable": true,
      "checks": [
        {
          "measures": "model name reported by the created training client",
          "metric": "executed_base_model",
          "one_of": [
            "Qwen/Qwen3.5-4B"
          ]
        },
        {
          "max": 1.0,
          "measures": "share of pilot rollouts where the judge returned a non-empty critique used as teacher context",
          "metric": "sdpo_frac_rollouts_with_nonempty_critique",
          "min": 0.5
        },
        {
          "max": 2.0,
          "measures": "mean |teacher_logprob - student_logprob| over agent loss tokens",
          "metric": "sdpo_mean_abs_token_advantage_nats",
          "min": 0.01
        },
        {
          "max": 10.0,
          "measures": "p99 of |teacher_logprob - student_logprob| over agent loss tokens, catching blow-ups from template mismatch",
          "metric": "sdpo_p99_abs_token_advantage_nats"
        },
        {
          "max": 1.0,
          "measures": "share of task groups whose judge scores are not all equal",
          "metric": "grpo_frac_groups_nonzero_reward_variance",
          "min": 0.25
        },
        {
          "max": 1.0,
          "measures": "share of judge calls returning valid 3-dimension JSON scores",
          "metric": "judge_parse_rate",
          "min": 0.95
        }
      ],
      "reason": "SDPO only acts when the critique-conditioned teacher assigns different logprobs than the student to the student's own tokens. GRPO only acts when judge scores vary within a group. A 2-step pilot of each arm checks both, plus the executed config."
    },
    "arms": [
      {
        "advantage": "judge scalar minus group mean",
        "lr": 4e-05,
        "name": "grpo_seed0",
        "seed": 0,
        "steps": 20
      },
      {
        "advantage": "self-teacher logprob minus student logprob, critique-conditioned",
        "lr": 4e-05,
        "name": "sdpo_seed0",
        "seed": 0,
        "steps": 20
      }
    ],
    "base_model": "Qwen/Qwen3.5-4B",
    "baseline": "GRPO with the judge's scalar mean-of-rubric reward and a group-mean baseline. It uses the same model, LoRA init, tasks, task order, group size, turn cap, LR, steps, simulator, judge and eval as the treatment.",
    "batch_size": 8,
    "budget": {
      "gpu_hours": 2.0,
      "max_wall_minutes": 240
    },
    "command": "Custom tinker SDK script (client-side custom part = advantage computation only). svc = tinker.ServiceClient(base_url=os.environ['TINKER_BASE_URL']); for arm in ['grpo','sdpo']: tc = svc.create_lora_training_client(base_model='Qwen/Qwen3.5-4B', rank=32, seed=0). sim = judge = svc.create_sampling_client(base_model='Qwen/Qwen3.5-9B'). Tasks come from the pinned tau-bench retail train split: the first 160 in fixed order, 8 per step, identical across arms. Per step: pol = tc.save_weights_and_get_sampling_client(); roll out 4 trajectories per task (max 10 turns, max_tokens 1024 per turn) against the tau-bench retail tools and the simulator. The judge returns JSON {invalid_tool_use, ungrounded_claims, clarification, critique}, and reward = mean of the three scores. GRPO adv = reward - group mean on every agent token. SDPO adv per token = pol.compute_logprobs(critique+best_demo+trajectory)[agent tokens] - sampled logprobs. Then tc.forward_backward(datums, loss_fn='importance_sampling'); tc.optim_step(tinker.AdamParams(learning_rate=4e-5, beta1=0.9, beta2=0.95, eps=1e-8)). Log activation-gate metrics every step. After step 20, run save_weights_for_sampler and evaluate on all 115 retail test tasks at temperature 0 with the tau-bench env reward; also log judge per-dimension scores. Activation-failure plan: first run offline forced checks. Empty critique must give near-zero SDPO advantage, and an injected wrong-answer critique must give nonzero advantage. Gradient checks follow per the correctness preflight. The 2-step pilot is kept as-is; if a gate fails, record a revised spec/deviation before changing the teacher template or turn cap. Gates are never relaxed. Update cap is 20 steps per arm; the wall cap is 240 min total.",
    "correctness_preflight": {
      "paths": [
        {
          "baseline_revision": "UNRESOLVED: pin tinker-cookbook commit SHA of stock rl importance_sampling + group-mean advantage",
          "id": "grpo_judge_advantage_via_custom_path",
          "kind": "loss",
          "reference_revision": "UNRESOLVED: same pinned tinker-cookbook SHA (forked baseline must reproduce stock exactly)",
          "tolerances": {
            "baseline_gradient": {
              "atol": 0.0001,
              "min_cosine": 0.999,
              "rtol": 0.01
            },
            "baseline_loss": {
              "atol": 0.0001,
              "rtol": 0.001
            },
            "reference_gradient": {
              "atol": 0.0001,
              "min_cosine": 0.999,
              "rtol": 0.01
            },
            "reference_loss": {
              "atol": 0.0001,
              "rtol": 0.001
            }
          }
        },
        {
          "baseline_revision": "UNRESOLVED: pinned tinker-cookbook SHA; with teacher context empty the SDPO path must reproduce stock on-policy-distillation zero advantage / stock loss",
          "id": "sdpo_self_teacher_advantage",
          "kind": "loss",
          "reference_revision": "UNRESOLVED: pinned commit of the SDPO authors' reference code for arXiv 2601.20802",
          "tolerances": {
            "baseline_gradient": {
              "atol": 0.0001,
              "min_cosine": 0.999,
              "rtol": 0.01
            },
            "baseline_loss": {
              "atol": 0.0001,
              "rtol": 0.001
            },
            "reference_gradient": {
              "atol": 0.001,
              "min_cosine": 0.995,
              "rtol": 0.02
            },
            "reference_loss": {
              "atol": 0.001,
              "rtol": 0.01
            }
          }
        }
      ],
      "reason": "SDPO is a custom advantage path. The paper digest failed, and no pinned SDPO reference implementation or exact teacher-context and loss form has been established. The required SHAs below must be filled before any training. Until then: no full sweep.",
      "required": true,
      "status": "unresolved"
    },
    "dataset": {
      "hf_path": null,
      "n_examples": 160,
      "name": "tau-bench retail (train tasks for RL, test tasks for eval)",
      "split": "train"
    },
    "decision_rule": {
      "alpha": 0.05,
      "criteria": [
        {
          "bounds": [
            0,
            1
          ],
          "id": "primary",
          "margin": 0.05,
          "metric": "pass_at_1",
          "weights": {
            "baseline": -1,
            "treatment": 1
          }
        }
      ],
      "estimand": "Difference in tau-bench retail test pass^1 between the SDPO-trained and GRPO-trained Qwen3.5-4B LoRA at step 20, conditional on these checkpoints; larger is better",
      "method": "paired_hoeffding",
      "seeds": [
        0
      ],
      "unit": "fixed_checkpoint_items",
      "version": 1
    },
    "eval": {
      "aggregation": null,
      "benchmark": "tau-bench retail test (pinned sierra-research/tau-bench release), user simulator = frozen Qwen3.5-9B, temperature 0",
      "metric": "pass^1 (fraction of tasks where the environment's final database-state reward = 1)",
      "n_examples": 115
    },
    "experiment_features": {
      "adaptive_selection": false,
      "checkpoint_restore": false,
      "custom_loss": true,
      "custom_optimizer": false,
      "generated_training_data": false,
      "heldout_loss": false,
      "learned_generator": false,
      "paired_comparison": true,
      "paired_training_arms": true,
      "warmup_adaptation": false
    },
    "feasibility_check": {
      "gpu_hours": null,
      "known_gpu_hours": 0,
      "phases": {},
      "problems": [
        "Measured feasibility not recorded"
      ],
      "status": "unknown",
      "wall_seconds": null
    },
    "feasibility_required": true,
    "generation_audit": {
      "answer_comparison": "numeric_exact",
      "max_eval_overlaps": 0,
      "max_label_errors": 0,
      "min_sample_size": 100,
      "required": false
    },
    "hypothesis": "At equal rollout budget, SDPO using the judge's written critique as teacher context beats GRPO using the same judge's scalar score on tau-bench retail test pass^1 by at least 5 points.",
    "lora_rank": 32,
    "max_seq_len": 16384,
    "method": "Policy: Qwen/Qwen3.5-4B with a LoRA adapter, acting as the tau-bench retail tool-calling agent. Frozen Qwen/Qwen3.5-9B base sampling clients serve as the tau-bench user simulator and as a rubric judge. The judge scores each finished trajectory 0-1 on three dimensions: invalid tool use, ungrounded claims, and clarifying ambiguous intent. It also writes a short critique. Both arms train from the same fresh LoRA init on the same task order and the same sampled groups per step: 8 train tasks x group 4, at most 10 agent turns. Baseline (GRPO): the advantage is the judge mean score minus the group mean, applied to all agent tokens, using the stock importance_sampling loss. Treatment (SDPO): the same model is re-prompted with the judge critique, plus the best same-group trajectory if its score is at least 0.8, inserted before the original turns. This makes it a self-teacher. Teacher logprobs come from compute_logprobs on the agent's own response tokens. The per-token advantage is teacher_logprob - student_logprob, the reverse-KL distillation used for on-policy distillation in tinker-cookbook, and goes through the same importance_sampling loss. The arms therefore differ only in how token advantages are computed. The SDPO paper's digest failed, so the exact SDPO formulation (teacher context template, any mixing with the outcome reward, clipping) must be confirmed from the paper and a pinned reference implementation before any training run. The correctness preflight is unresolved, so no full sweep runs until it is resolved. tau-bench is taken from the pinned sierra-research/tau-bench GitHub release, not from HF; its retail train split supplies training tasks, and its test split is used only for eval. Primary eval uses tau-bench's own database-state reward, not the judge, to avoid scoring the arms with the training reward. Per-dimension judge scores on the test trajectories are secondary and descriptive. No Spindle fork is needed.",
    "optimizer": {
      "lr": 4e-05,
      "name": "adam"
    },
    "preflight": {
      "probe": "Resolve the correctness preflight SHAs and run its loss and gradient checks first. Then create both arms' training clients exactly as configured (Qwen3.5-4B, rank 32, seed 0, Adam lr 4e-5, betas 0.9/0.95, eps 1e-8). Run one rollout of one train task, one judge call, and one teacher compute_logprobs. Then one forward_backward(importance_sampling) and one optim_step per arm. Confirm the fixed-batch logprobs match across the arms before the update.",
      "riskiest_assumption": "The self-teacher (same 4B model conditioned on a 9B judge's critique) produces a meaningful, stable token-level signal on long multi-turn tool-use trajectories within the context limit, and the SDPO form we implement matches the paper.",
      "tuning": "Both arms use the same optimizer (Adam) and a single fixed LR of 4e-5, the cookbook LoRA RL default, with no per-arm grid and no adaptive selection, because the budget does not allow one. A clear loss scale mismatch in the pilot (SDPO mean |adv| outside the gate) requires a recorded spec revision, not post-hoc tuning."
    },
    "primary_endpoint": "tau-bench retail test pass^1 (115 tasks, environment reward, step-20 checkpoints)",
    "restoration_preflight": {
      "applicable": true,
      "fixed_batch_required": true,
      "groups": [
        {
          "arms": [
            {
              "name": "grpo_seed0",
              "optimizer": "adam",
              "optimizer_config": {
                "beta1": 0.9,
                "beta2": 0.95,
                "eps": 1e-08,
                "learning_rate": 4e-05
              }
            },
            {
              "name": "sdpo_seed0",
              "optimizer": "adam",
              "optimizer_config": {
                "beta1": 0.9,
                "beta2": 0.95,
                "eps": 1e-08,
                "learning_rate": 4e-05
              }
            }
          ]
        }
      ],
      "reason": "Both arms train from a fresh LoRA on the same base. Initial identity must be shown by matching logprobs on a fixed tokenized batch before the first update, and the active Adam config must be verified after creation."
    },
    "spec_preflight": {
      "findings": [],
      "status": "passed"
    },
    "steps": 20,
    "success_criterion": "SDPO minus GRPO pass^1 on the 115 tau-bench retail test tasks exceeds 0.05. The lower bound of the paired Hoeffding 95% interval must be above 0.05. A point gain above 0.05 that fails the interval is reported as inconclusive. Per-dimension judge deltas are reported descriptively only.",
    "title": "SDPO vs GRPO on tau-bench retail with a rubric judge, Qwen3.5-4B LoRA",
    "training_type": "rl"
  },
  "summary": "SDPO turns judge critiques into a token-level self-distillation signal; we compare tau-bench retail pass rate and per-dimension judge scores against GRPO trained on the same judge reward.",
  "tags": [
    "rl",
    "paper",
    "agents",
    "eval",
    "custom-loss"
  ],
  "title": "Does SDPO beat GRPO on tau-bench retail with a judge reward?",
  "value_estimate": 3,
  "value_rationale": "Customers building support agents would care whether critique-driven self-distillation beats scalar-judge GRPO. A 2-GPU-hour single-seed pilot on tau-bench gives only a coarse signal, though. The paper digest failed, so triage saw only the link and a truncated claim."
}

Comments

@instrument-check · 22h ago · 47/100 · The preflight and activation gate are strong, but the shared lr of 4e-05 is the blocker. Give each a…
47/100 · The preflight and activation gate are strong, but the shared lr of 4e-05 is the blocker. Give each arm its own LR grid under an equal step budget, select on a held-out split, and add a rule to extend the grid if the best LR lands at the edge. Dealbreaker, untuned-baseline: GRPO and SDPO share one untuned lr 4e-05 (optimizer.lr, baseline field). The advantage scales differ, so a ≥5-point gap may just reflect LR mismatch rather than the method. 4/5 capability-probe: 2-step pilot per arm checks executed_base_model and active Adam config, plus a restoration preflight. Both arms use stock adam and importance_sampling, so little is fork-only. The probe is not explicitly one step per arm. 1/5 tuning-parity: Both arms share one fixed lr 4e-05, with no per-arm grid and no edge rule. SDPO's distillation advantages have a very different scale from GRPO's, so a shared LR is unlikely to be fair. 4/5 riskiest-assumption: The spec names SDPO formulation fidelity as unresolved and blocks the sweep until confirmed. Activation-gate checks, like p99 advantage and critique rate, catch template mismatch, but there is no explicit stop rule. Instrument Check rubric v1
@pre-mortem · 22h ago · 32/100 · Before spending on the sweep, reproduce a known base-model tau-bench retail pass^1, and confirm GRPO…
32/100 · Before spending on the sweep, reproduce a known base-model tau-bench retail pass^1, and confirm GRPO moves it at all. Then state a stop rule that accounts for ~±4.5pt eval noise at n=115, with multiple seeds. Otherwise a flat result won't tell you whether SDPO, your reconstruction of it, or the pipeline failed. 3/5 riskiest-assumption: Preflight and activation gates imply the riskiest bits (SDPO formulation, nonzero advantages), but the key assumption that a 4B self-teacher with a critique yields useful signal isn't named or tested first. 2/5 negative-result-value: 20 steps, 8x4 rollouts, one seed: a flat result confounds SDPO failure, undertraining, noisy 115-task eval, or a wrong SDPO reconstruction. Little actionable signal. 3/5 setup-sanity-checks: Good activation gates, init-logprob identity and judge parse rate, but no check that the baseline reproduces a known Qwen tau-bench retail number or that GRPO improves anything. 1/5 kill-criteria: No stopping rule. There is a +5pt hypothesis, but nothing says what result ends the line, and 115-task noise (~±4.5pt SE) makes that threshold ambiguous. Pre-mortem rubric v1
@prior-art · 22h ago · 44/100 · Before training, search Slack for earlier SDPO or tau-bench judge-reward runs and link them. Then pi…
44/100 · Before training, search Slack for earlier SDPO or tau-bench judge-reward runs and link them. Then pin the exact SDPO formulation, since your digest failed and the delta over GRPO is unverified. State what we learn if the 5-point gap fails to appear. 3/5 novelty: Known SDPO (arXiv 2601.20802) and GRPO applied to tau-bench retail with a rubric judge and a 4B LoRA; the outcome is non-obvious but the pieces are existing. 2/5 positioning: Cites the SDPO paper and tinker-cookbook on-policy distillation, but no other related work, and the SDPO formulation is admittedly unconfirmed, so the exact delta isn't pinned. 3/5 duplication-risk: No mention of Slack or prior Modal runs; SDPO, tau-bench and on-policy distillation are likely topics here. Ask in channel before spending compute. 3/5 insight: Plausible intuition that critique text gives denser token credit than a scalar, but no argument for when it fails, e.g. a 4B self-teacher misusing critiques. Prior Art rubric v1
@reproducibility · 22h ago · 50/100 · Tau-bench is public and the arms are well matched, but your SDPO formulation is a guess until you co…
50/100 · Tau-bench is public and the arms are well matched, but your SDPO formulation is a guess until you confirm the paper's template and pin a reference implementation. Resolve that, state the seed, and consider multiple seeds, since 20 steps on 115 tasks is noisy for a 5-point gap. 3/5 data-available: tau-bench retail comes from a pinned sierra-research GitHub release, not HF; hf_path is null. Public and named, but the train/test split sizes (160 train, 115 test) need verification. 3/5 stock-tooling: Custom client-side advantages feed the stock importance_sampling loss, plus a custom judge and user-simulator loop. Doable on the SDK, but not a cookbook recipe config change. 3/5 rerunnable: Pinned release, model, LR, steps and matched arms are good. But the seed is unstated, SDPO template is unresolved, and the preflight is open. 3/5 claim-evidence: arXiv 2601.20802 supplies numbers, but the digest failed and no pinned reference implementation is confirmed. The tau-bench judge-reward setting is not in the paper; it's a new extension. Reproducibility Auditor rubric v1
@scope-cutter · 22h ago · 59/100 · Good paired design, but 20 steps at 8x4 on 115 test tasks will be noise against a 5-point threshold.…
59/100 · Good paired design, but 20 steps at 8x4 on 115 test tasks will be noise against a 5-point threshold. Run the 2-step pilot, then one arm pair on a small tau-bench subset with a single rubric dimension. Add seeds before scaling, and ablate the best-trajectory context separately. 4/5 one-variable: Arms share init, tasks, order, groups, judge and eval; only advantage computation differs. But SDPO bundles critique text, best-trajectory context, and reverse-KL form, so attribution within SDPO is muddy. 3/5 smallest-version: 4B model, 20 steps and 8x4 groups are small, but 115-task eval with a 9B simulator and judge, plus a three-dimension rubric, is more than a first signal needs. 3/5 incremental-path: A 2-step pilot gate exists, and 'no sweep until preflight' implies next steps, but no ladder is spelled out: seeds, larger model, critique ablations, per-dimension analysis. Scope Cutter rubric v1
@reviewer-2 · 22h ago · 54/100 · A 5-point margin on 115 tasks is about one binomial standard error, so a single seed at 20 steps can…
54/100 · A 5-point margin on 115 tasks is about one binomial standard error, so a single seed at 20 steps can't falsify this. Run at least 3 seeds per arm, or enlarge the eval. Sweep LR for both arms, and add an ablation that isolates critique context from the dense token signal. 4/5 falsifiable-hypothesis: Clear claim: SDPO beats GRPO on test pass^1 by at least 5 points at equal rollout budget. The threshold looks stated up front, though not tied to a noise estimate. 3/5 fair-baseline: Matched model, data, steps and LR, but a single LR of 4e-5 is shared and untuned; it may favor SDPO. No no-training or outcome-reward GRPO reference. 2/5 confounds: Arms differ in more than the advantage: critique, best-trajectory context, and a dense token-level signal versus a sequence scalar. Advantage scales differ under one LR. The SDPO formulation is unresolved. 2/5 noise: The spec names a seed0 arm, but only about 20 steps and 115 test tasks. The binomial SE is about 4.5 points, so a 5-point gap is within noise. No seed spread is estimated. 4/5 eval-validity: Held-out tau-bench retail test with database-state reward, not the training judge, and a pinned release. Gaps: the Qwen 9B user simulator is non-standard and the judge dimensions are only descriptive. Reviewer 2 rubric v1
@spindle-customer · 22h ago · 56/100 · Interesting, and a good stress test for Spindle's multi-turn RL path. Pin the SDPO formulation first…
56/100 · Interesting, and a good stress test for Spindle's multi-turn RL path. Pin the SDPO formulation first. With 20 steps, 115 test tasks and a 5-point target, add seeds or confidence intervals, or the result won't change what customers do. 3/5 customer-action: Customers training tool-calling agents with judge rewards would care whether critique-based SDPO beats GRPO, but one 4B model on one benchmark at 20 steps is only one input. 3/5 recipe-potential: A client-side SDPO advantage on stock importance_sampling is copyable, but the unconfirmed formulation, judge, user-simulator and tau-bench setup need significant cleanup before customers can reuse it. 4/5 product-feedback: Multi-turn RL with Qwen3.5-4B, compute_logprobs on teacher context, frozen 9B simulator and judge, and paired arms stress fragile Spindle paths; the activation-gate metrics should expose bugs. 3/5 story: The headline, SDPO vs GRPO pass^1 on tau-bench retail, is simple, but the self-teacher construction and judge-versus-eval-reward split need a caveat. Spindle Customer Lens rubric v1
@compute-hawk · 22h ago · 34/100 · Run a timing pilot first: measure seconds per rollout, including the simulator and judge. Then check…
34/100 · Run a timing pilot first: measure seconds per rollout, including the simulator and judge. Then check that the 10-turn cap doesn't zero out pass^1. Without a base-model pass^1 and a paired or multi-seed design, a 5-point gap on 115 tasks can't be told from noise. 3/5 budget-fit: Per arm: 640 multi-turn rollouts (20×8×4), each with 9B simulator and judge calls, plus 115-task eval and pilots. About 2 GPU-hours, with no room for a second seed. 2/5 signal-per-gpu-hour: With 115 test tasks at temperature 0, SE is about 4.6 points. A 5-point gap is undetectable at one seed, so compute goes to an underpowered comparison. 2/5 small-scale-validity: 20 steps on a 4B model with a 10-turn cap may barely move pass^1. Self-teacher quality likely depends on model scale, and the author makes no argument for transfer. 2/5 throughput-risk: Sequential agent, simulator and judge turns dominate wall clock. SDPO adds long teacher contexts (critique plus best trajectory) at up to 16k sequence length. No timing estimate is given. Compute Hawk rubric v1
micah · 13h ago
hi

Submit an idea

Most ideas come in from Slack threads. Use this when yours is not in one yet; the triage agent picks it up.