Skip to content

critic family: refuse positive_lm_source=success without a success-writing reward function - #225

Merged
michaellchung merged 2 commits into
mainfrom
s20-vapo-success-check
Oct 10, 2026
Merged

michaellchung merged 2 commits into
mainfrom
s20-vapo-success-check

Conversation

@michaellchung

@michaellchung michaellchung commented Oct 10, 2026 •

Copy link
Copy Markdown
Contributor

Why

S19 #6 VAPO G3 s19-vapo-g3-20261010a failed with 0 rounds. Both islands raised at the first critic step: --positive-example-source success needs sample.metadata['success']. The G3 script loaded the out-of-tree gsm8k_reward:score, which writes no success flag. dry-run did not catch it.

S13 VAPO G1 (s13-forkg1-vapo-20261007e) passed with the same positive_lm_source=success, because it used the in-package yeto.rl.gsm8k_reward:score, which already writes metadata['success'] (since 4f1c03e).

Change

  • New yeto/rl/reward_declarations.py: SUCCESS_WRITING_REWARDS lists the in-package Miles rewards that already write metadata['success'] (yeto.rl.gsm8k_reward:score, yeto.rl.math_reward:reward_func); writes_success decorator for user rewards. The reward modules themselves are unchanged (their source hashes are in the decoupling golden samples).
  • New launch check positive_lm_success (critic.py): with positive_lm_coef set and positive_lm_source='success', rejects an importable reward function that is not declared. Sub-agent decision: an unimportable reference gets no verdict (test fixtures use placeholders; the Miles fork still refuses on the island). Skipped when the caller passes no reward function.
  • reward_function is passed to the check from the launcher (dry-run / pre-launch) and the Miles island config.

Main agent decision (1+3): keep the VAPO spec semantics; fix the reward side and add the check. The G3 script should use --reward-function yeto.rl.gsm8k_reward:score for CASE=vapo (script lives outside the repo).

Tests

  • tests/test_rl_positive_lm_success_check.py: 6 passed (refuse undeclared / unimportable; in-package rewards pass; skip cases; gsm8k success equals reward == 1.0).
  • G3 dry-run with this commit: gsm8k_reward:score -> rc=1 [positive_lm_success] rejection; yeto.rl.gsm8k_reward:score -> rc=0.
  • Local safe suite (-m "not gpu and not ray_local"): 5384 passed, 47 skipped, 1 failed: test_codex_bridge_compaction.py::test_off_stock_bridge_unchanged_and_compactionrl_without_trigger_is_byte_identical; that file passes alone on this branch and on main (21 passed), so it is order-dependent, not caused by this PR.
  • 4cd3109 (G3 code) already contains 4f1c03e; the G3 failure came from the script's reward choice, not missing code.

No GPU run. No image rebuild needed: the yeto package ships with the workdir; the Miles fork in the image is unchanged.

🤖 Generated with Claude Code

chowhsu and others added 2 commits October 10, 2026 09:13
…tion is not declared to write metadata['success']

S19 #6 VAPO G3 s19-vapo-g3-20261010a failed at the first critic step on both
islands: the out-of-tree gsm8k_reward:score writes no success flag. S13 G1
passed with the in-package yeto.rl.gsm8k_reward:score, which does.

- yeto.rl.math_reward.writes_success declares a reward function; the
  in-package gsm8k and math rewards carry it.
- launch check positive_lm_success (launcher dry-run + island config)
  rejects an undeclared or unimportable reward function.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…hes); declare via yeto.rl.reward_declarations; unimportable reward gets no verdict

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@michaellchung
michaellchung merged commit b940363 into main Oct 10, 2026
1 of 3 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants