Modal Research Exchange

you are

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

Failed no result Devin Qwen/Qwen3.5-4B RL 2.0 GPU-h budget started 16h ago 10m 05s
Redo
Pick where the agent works.
View session in Devin ↗

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. The hypothesis remains untested; resolve the surrogate/lag and zero-gradient acceptance contracts and rerun correctness before any GPU pilot.

No result No result: insufficient evidence.

Result 2 kept from interim updates

No arm results yet.

discovery_seconds
1.254
optimizer_updates
0
retail_train_tasks_available
500
retail_test_tasks_available
115
created_training_clients
0
correctness_on_policy_sdpo_loss_absolute_error
0.1354
correctness_on_policy_sdpo_gradient_max_absolute_error
0
correctness_stale_sdpo_gradient_relative_l2_error
0.807
completed_comparison_steps
0
correctness_on_policy_sdpo_loss_acceptance_bound
0.001934
correctness_stale_sdpo_gradient_cosine
0.5952
correctness_cpu_seconds
0.03523
Changes from the spec 0 · original hypothesis not tested

None reported: ran as specified.

Original hypothesis tested: no

Tested instead: Offline CPU float32 synthetic linear-softmax fixture with complete 55-parameter gradients, variable-length token masks and packed/unpacked on-policy and stale-input cases; no Qwen rollout or model update.

Checks · activation unverified · evaluator unknown · feasibility unknown
Custom implementation correctness: failed
sdpo_self_teacher_advantage: reference_loss; grpo_judge_advantage_via_custom_path: matching reference_revision; grpo_judge_advantage_via_custom_path: matching baseline_revision; sdpo_self_teacher_advantage: matching reference_revision; sdpo_self_teacher_advantage: matching baseline_revision; sdpo_self_teacher_advantage: baseline_gradient cosine/tolerance
Validates executor-reported evidence; autonomous training calls are not blocked by this server.
Executor reported inconclusive; shown as no result.
Parity errors and accepted tolerances
[
  {
    "check": "baseline_loss",
    "measured": {
      "cosine_similarity": 1.0,
      "max_abs_error": 0.0,
      "reference_max_abs": 0.00714289303869009,
      "relative_l2_error": 0.0
    },
    "path": "grpo_judge_advantage_via_custom_path",
    "status": "passed",
    "tolerance": {
      "atol": 0.0001,
      "rtol": 0.001
    }
  },
  {
    "check": "baseline_gradient",
    "measured": {
      "cosine_similarity": 0.9999999999999998,
      "max_abs_error": 0.0,
      "reference_max_abs": 0.0452161505818367,
      "relative_l2_error": 0.0
    },
    "path": "grpo_judge_advantage_via_custom_path",
    "status": "passed",
    "tolerance": {
      "atol": 0.0001,
      "min_cosine": 0.999,
      "rtol": 0.01
    }
  },
  {
    "check": "reference_loss",
    "measured": {
      "cosine_similarity": 1.0,
      "max_abs_error": 0.0,
      "reference_max_abs": 0.00714289303869009,
      "relative_l2_error": 0.0
    },
    "path": "grpo_judge_advantage_via_custom_path",
    "status": "passed",
    "tolerance": {
      "atol": 0.0001,
      "rtol": 0.001
    }
  },
  {
    "check": "reference_gradient",
    "measured": {
      "cosine_similarity": 0.9999999999999998,
      "max_abs_error": 0.0,
      "reference_max_abs": 0.0452161505818367,
      "relative_l2_error": 0.0
    },
    "path": "grpo_judge_advantage_via_custom_path",
    "status": "passed",
    "tolerance": {
      "atol": 0.0001,
      "min_cosine": 0.999,
      "rtol": 0.01
    }
  },
  {
    "check": "baseline_loss",
    "measured": {
      "cosine_similarity": null,
      "max_abs_error": 0.0,
      "reference_max_abs": 0.0,
      "relative_l2_error": null
    },
    "path": "sdpo_self_teacher_advantage",
    "status": "passed",
    "tolerance": {
      "atol": 0.0001,
      "rtol": 0.001
    }
  },
  {
    "check": "baseline_gradient",
    "measured": {
      "cosine_similarity": null,
      "max_abs_error": 0.0,
      "reference_max_abs": 0.0,
      "relative_l2_error": null
    },
    "path": "sdpo_self_teacher_advantage",
    "status": "unverified",
    "tolerance": {
      "atol": 0.0001,
      "min_cosine": 0.999,
      "rtol": 0.01
    }
  },
  {
    "check": "reference_loss",
    "measured": {
      "cosine_similarity": -1.0,
      "max_abs_error": 0.13540398702025414,
      "reference_max_abs": 0.0934171825647354,
      "relative_l2_error": 1.4494548358533836
    },
    "path": "sdpo_self_teacher_advantage",
    "status": "failed",
    "tolerance": {
      "atol": 0.001,
      "rtol": 0.01
    }
  },
  {
    "check": "reference_gradient",
    "measured": {
      "cosine_similarity": 1.0,
      "max_abs_error": 0.0,
      "reference_max_abs": 0.04461999982595444,
      "relative_l2_error": 0.0
    },
    "path": "sdpo_self_teacher_advantage",
    "status": "passed",
    "tolerance": {
      "atol": 0.001,
      "min_cosine": 0.995,
      "rtol": 0.02
    }
  }
]
Treatment activation: unverified
Not reported: executed_base_model, sdpo_frac_rollouts_with_nonempty_critique, sdpo_mean_abs_token_advantage_nats, sdpo_p99_abs_token_advantage_nats, grpo_frac_groups_nonzero_reward_variance, judge_parse_rate.
executed_base_model
not reported needs one of Qwen/Qwen3.5-4B · missing
sdpo_frac_rollouts_with_nonempty_critique
not reported needs >= 0.5 and <= 1 · missing
sdpo_mean_abs_token_advantage_nats
not reported needs >= 0.01 and <= 2 · missing
sdpo_p99_abs_token_advantage_nats
not reported needs <= 10 · missing
grpo_frac_groups_nonzero_reward_variance
not reported needs >= 0.25 and <= 1 · missing
judge_parse_rate
not reported needs >= 0.95 and <= 1 · missing
Initialization / optimizer verification: unverified
Missing initialization_provenance version 1.
Research decision: uncertain
Decision evidence was not recorded.
Inference unit: fixed_checkpoint_items · 1 scheduled seed(s). Bounded Hoeffding confidence interval.
Evaluator comparability: unknown
Evaluator provenance was not recorded.
Feasibility projection: unknown
Projected costs, not measured GPU usage.
Projected wall time
unknown
Projected GPU allocation
unknown
  • Measured feasibility not recorded
Timing, sample counts and allocation evidence
{
  "gpu_hours": null,
  "known_gpu_hours": 0,
  "phases": {},
  "problems": [
    "Measured feasibility not recorded"
  ],
  "record": null,
  "recorded_at": 1793797069.1672747,
  "status": "unknown",
  "wall_seconds": null
}
Generated task audit: not applicable
spec.generation_audit opts out and no feature it covers is true
Answer agreement with recorded independent solutions does not establish semantic correctness. Normalized exact overlap does not detect paraphrases.
Spec exp_e2a84210d9
Experiment version
exp_e2a84210d9
Execute the selected saved experiment version.

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.

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.

tau-bench retail (train tasks for RL, test tasks for eval) 20 steps batch 8 LoRA r32 lr 4e-05 240 min wall budget
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.
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.
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"
}
Evidence 20

Partial · Download manifest. Recorded files are retained copies; checkpoint references do not include model weights.

Not recorded: predictions, checkpoint references.

Evidence import problems: file 9: invalid file name or kind.

All metrics
discovery_seconds
1.254
optimizer_updates
0
retail_train_tasks_available
500
retail_test_tasks_available
115
created_training_clients
0
correctness_on_policy_sdpo_loss_absolute_error
0.1354
correctness_on_policy_sdpo_gradient_max_absolute_error
0
correctness_stale_sdpo_gradient_relative_l2_error
0.807
completed_comparison_steps
0
correctness_on_policy_sdpo_loss_acceptance_bound
0.001934
correctness_stale_sdpo_gradient_cosine
0.5952
correctness_cpu_seconds
0.03523
Interim updates from Devin (6, first Nov 4, 12:58 UTC)
Artifact references
  • instructions · launch-instructions.md sha256 ce6b64e8bbf7
  • script · discover.py sha256 b395f48cc050
  • script · check_correctness.py sha256 d2c1edd7b28e
  • script · build_report.py sha256 92173a7e7a8e
  • script · reference-extracts.py sha256 a85127a98335
  • effective_config · spec.json sha256 8a18e7a19e69
  • effective_config · effective-spec-pinned.json sha256 8b3dbbc28c69
  • effective_config · fixed-fixture.json sha256 35ceda61dccc
  • effective_config · authors-actor.yaml sha256 38fd7f75508b
  • code_revision · cookbook-distillation-source.py sha256 16fb7309b009
  • code_revision · code-revisions.json sha256 36a50c43108b
  • code_revision · dataset-discovery.json sha256 226f637c482e
  • code_revision · reference-notes.md sha256 d481c8a2eae6
  • metrics · discovery.json sha256 93a9b1d0d883
  • metrics · correctness-preflight.json sha256 e1c4ffb398e8
  • metrics · correctness-results.json sha256 94b245f899b7
  • metrics · full-gradients.json sha256 e5039176e8b7
  • metrics · validator-stdout.json sha256 63cf1500c33b
  • metrics · resource-ledger.json sha256 67ccdd29bca1
  • metrics · run-report.md sha256 ecb00de8e166
  1. Nov 4, 13:07 UTC · failed · 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. The hypothesis remai…
  2. Nov 4, 13:04 UTC · running · Correctness gate adjudicated as failed; full training prohibited. CPU float32 fixture and full parameter gradients retained, validator exited 1 as expected. Evidence assembly remains.
  3. Nov 4, 13:02 UTC · running · Instruction integrity verified. Offline necessary-condition correctness fixture blocks training: specified SDPO importance-sampling scalar loss exceeds reference tolerance; on-policy full gradients m…
  4. Nov 4, 13:01 UTC · running · Both required models are served; pinned data has 500 retail train and 115 test tasks. Checking the specified IS surrogate against the SDPO authors' sampled reverse-KL loss before allocating training …
  5. Nov 4, 13:00 UTC · running · Spindle serves both required models (Qwen3.5-4B and Qwen3.5-9B); pinned SDPO, cookbook, and tau-bench references. No training clients or optimizer updates yet.
  6. Nov 4, 12:58 UTC · running · Verified SHA256 and read all 552 launch-instruction lines; resolving pinned algorithm/data references before any training.
Artifacts
correctness_preflight
{'required': True, 'paths': [{'id': 'grpo_judge_advantage_via_custom_path', 'fixed_input': {'sha256': '35ceda61dccc81731e96c435d31ae788035c8e00a875820651125d82bd376cc6', 'description': 'fixed-fixture.json: CPU float32 synthetic linear-softmax policy, identical weights, token identities, masks; full parameter gradients. No optimizer or remote execution.'}, 'baseline_revision': '6daabe0838736557f0e802020b710073eb340287', 'reference_revision': '6daabe0838736557f0e802020b710073eb340287', 'implementation_revision': 'd2c1edd7b28edd82aad3a5409ab5cde86c3d6b76d594957071d94bbfd142e513', 'precision': 'CPU torch.float32; no mixed precision; not a Spindle backend parity test', 'normalization': 'sum of masked token losses / 14 loss tokens; no reward mixing; no clipping in specified IS path', 'errors': {'baseline_loss': {'max_abs_error': 0.0, 'reference_max_abs': 0.00714289303869009, 'relative_l2_error': 0.0, 'cosine_similarity': 1.0}, 'baseline_gradient': {'max_abs_error': 0.0, 'reference_max_abs': 0.0452161505818367, 'relative_l2_error': 0.0, 'cosine_similarity': 0.9999999999999998}, 'reference_loss': {'max_abs_error': 0.0, 'reference_max_abs': 0.00714289303869009, 'relative_l2_error': 0.0, 'cosine_similarity': 1.0}, 'reference_gradient': {'max_abs_error': 0.0, 'reference_max_abs': 0.0452161505818367, 'relative_l2_error': 0.0, 'cosine_similarity': 0.9999999999999998}}, 'lr_scaling': [], 'scope': 'Necessary-condition offline test only; cannot certify server precision, init, or optimizer.'}, {'id': 'sdpo_self_teacher_advantage', 'fixed_input': {'sha256': '35ceda61dccc81731e96c435d31ae788035c8e00a875820651125d82bd376cc6', 'description': 'fixed-fixture.json: CPU float32 synthetic linear-softmax policy, identical weights, token identities, masks; full parameter gradients. No optimizer or remote execution.'}, 'baseline_revision': '6daabe0838736557f0e802020b710073eb340287', 'reference_revision': '7c457fc1b1f636ae794eb0362ba37d4743b06fbc', 'implementation_revision': 'd2c1edd7b28edd82aad3a5409ab5cde86c3d6b76d594957071d94bbfd142e513', 'precision': 'CPU torch.float32; no mixed precision; not a Spindle backend parity test', 'normalization': 'sum of masked token losses / 14 loss tokens; no reward mixing; no clipping in specified IS path', 'errors': {'baseline_loss': {'max_abs_error': 0.0, 'reference_max_abs': 0.0, 'relative_l2_error': None, 'cosine_similarity': None}, 'baseline_gradient': {'max_abs_error': 0.0, 'reference_max_abs': 0.0, 'relative_l2_error': None, 'cosine_similarity': None}, 'reference_loss': {'max_abs_error': 0.13540398702025414, 'reference_max_abs': 0.0934171825647354, 'relative_l2_error': 1.4494548358533836, 'cosine_similarity': -1.0}, 'reference_gradient': {'max_abs_error': 0.0, 'reference_max_abs': 0.04461999982595444, 'relative_l2_error': 0.0, 'cosine_similarity': 1.0}}, 'lr_scaling': [], 'scope': 'Necessary-condition offline test only; cannot certify server precision, init, or optimizer.'}]}
correctness_validation
{'status': 'failed', 'required': True, 'checks': [{'path': 'grpo_judge_advantage_via_custom_path', 'check': 'baseline_loss', 'status': 'passed', 'tolerance': {'atol': 0.0001, 'rtol': 0.001}, 'measured': {'max_abs_error': 0.0, 'reference_max_abs': 0.00714289303869009, 'relative_l2_error': 0.0, 'cosine_similarity': 1.0}}, {'path': 'grpo_judge_advantage_via_custom_path', 'check': 'baseline_gradient', 'status': 'passed', 'tolerance': {'atol': 0.0001, 'rtol': 0.01, 'min_cosine': 0.999}, 'measured': {'max_abs_error': 0.0, 'reference_max_abs': 0.0452161505818367, 'relative_l2_error': 0.0, 'cosine_similarity': 0.9999999999999998}}, {'path': 'grpo_judge_advantage_via_custom_path', 'check': 'reference_loss', 'status': 'passed', 'tolerance': {'atol': 0.0001, 'rtol': 0.001}, 'measured': {'max_abs_error': 0.0, 'reference_max_abs': 0.00714289303869009, 'relative_l2_error': 0.0, 'cosine_similarity': 1.0}}, {'path': 'grpo_judge_advantage_via_custom_path', 'check': 'reference_gradient', 'status': 'passed', 'tolerance': {'atol': 0.0001, 'rtol': 0.01, 'min_cosine': 0.999}, 'measured': {'max_abs_error': 0.0, 'reference_max_abs': 0.0452161505818367, 'relative_l2_error': 0.0, 'cosine_similarity': 0.9999999999999998}}, {'path': 'sdpo_self_teacher_advantage', 'check': 'baseline_loss', 'status': 'passed', 'tolerance': {'atol': 0.0001, 'rtol': 0.001}, 'measured': {'max_abs_error': 0.0, 'reference_max_abs': 0.0, 'relative_l2_error': None, 'cosine_similarity': None}}, {'path': 'sdpo_self_teacher_advantage', 'check': 'baseline_gradient', 'status': 'unverified', 'tolerance': {'atol': 0.0001, 'rtol': 0.01, 'min_cosine': 0.999}, 'measured': {'max_abs_error': 0.0, 'reference_max_abs': 0.0, 'relative_l2_error': None, 'cosine_similarity': None}}, {'path': 'sdpo_self_teacher_advantage', 'check': 'reference_loss', 'status': 'failed', 'tolerance': {'atol': 0.001, 'rtol': 0.01}, 'measured': {'max_abs_error': 0.13540398702025414, 'reference_max_abs': 0.0934171825647354, 'relative_l2_error': 1.4494548358533836, 'cosine_similarity': -1.0}}, {'path': 'sdpo_self_teacher_advantage', 'check': 'reference_gradient', 'status': 'passed', 'tolerance': {'atol': 0.001, 'rtol': 0.02, 'min_cosine': 0.995}, 'measured': {'max_abs_error': 0.0, 'reference_max_abs': 0.04461999982595444, 'relative_l2_error': 0.0, 'cosine_similarity': 1.0}}], 'reason': 'sdpo_self_teacher_advantage: reference_loss; grpo_judge_advantage_via_custom_path: matching reference_revision; grpo_judge_advantage_via_custom_path: matching baseline_revision; sdpo_self_teacher_advantage: matching reference_revision; sdpo_self_teacher_advantage: matching baseline_revision; sdpo_self_teacher_advantage: baseline_gradient cosine/tolerance', 'evidence_source': 'executor report; remote execution is not attested', 'applicability': 'required', 'reported_verdict': 'inconclusive'}
decision_validation
{'status': 'uncertain', 'issues': ['Decision evidence was not recorded.'], 'criteria': [], 'outcome_reason': 'insufficient_evidence', 'unit': 'fixed_checkpoint_items', 'n_seeds': 1, 'alpha': 0.05, 'method': 'paired_hoeffding', 'applicability': {'check': 'decision_rule', 'status': 'required', 'enforce': True, 'reasons': ['experiment_features: paired_comparison is true'], 'features': {'paired_comparison': True, 'adaptive_selection': False}}}
feasibility
{'status': 'unknown', 'problems': ['Measured feasibility not recorded'], 'wall_seconds': None, 'gpu_hours': None, 'known_gpu_hours': 0, 'phases': {}, 'record': None, 'recorded_at': 1793797069.1672747}
feasibility_required
True
generation_audit_validation
{'status': 'not_applicable', 'reasons': ['spec.generation_audit opts out and no feature it covers is true'], 'applicability': {'check': 'generation_audit', 'status': 'not_applicable', 'enforce': False, 'reasons': ['spec.generation_audit opts out and no feature it covers is true'], 'features': {'generated_training_data': False}}}
launch
{'experiment_id': 'exp_e2a84210d9', 'context_status': 'snapshotted', 'superseded': False, 'mode': 'ordinary', 'purpose': 'Execute the selected saved experiment version.'}
launch_instructions
{'name': 'launch-instructions-ce6b64e8bbf7.md', 'sha256': 'ce6b64e8bbf72916acd8309c1888a1e3dbf86b3c9ed8e0522e26ee5b5b95b935', 'url': 'https://rx.modal.dev/api/runs/run_299304ba85/evidence/ce6b64e8bbf72916acd8309c1888a1e3dbf86b3c9ed8e0522e26ee5b5b95b935'}
reported_outcome_reason
incomplete_execution
reported_verdict
inconclusive
restoration_validation
{'status': 'unverified', 'required': True, 'checks': [{'check': 'format', 'status': 'unverified', 'reason': 'Missing initialization_provenance version 1.'}, {'check': 'grpo_seed0', 'status': 'unverified', 'reason': 'grpo_seed0: missing or duplicate arm evidence.'}, {'check': 'sdpo_seed0', 'status': 'unverified', 'reason': 'sdpo_seed0: missing or duplicate arm evidence.'}], 'reason': 'Missing initialization_provenance version 1.', 'applicability': 'required'}
slack_started
True
verdict_report
{'margin': 0.05, 'reasoning': 'The specified IS surrogate and the authors sampled reverse-KL surrogate are first-order equivalent on this on-policy fixture but have different scalar values; stale-input gradients also differ. This is a reference/acceptance-contract blocker, not a scientific comparison result. Runtime initialization, optimizer, activation and feasibility remain unverified.'}
Agent trace full trace with commands in Devin ↗
Details
run
run_299304ba85
backend
Devin
session
devin-87f5a13e50c34f97b30ded541c7eeb34
experiment
exp_e2a84210d9
created
Nov 4, 12:57 UTC
started
Nov 4, 12:57 UTC
finished
Nov 4, 13:07 UTC
duration
10m 05s
GPU-h budget
2.0
wall budget
240 min
base model
Qwen/Qwen3.5-4B
training
RL
dataset
tau-bench retail (train tasks for RL, test tasks for eval)
result
final
outcome reason
insufficient evidence

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.