Reinforcement Learning
Transformers
English
post-training
distillation
agentic-coding
composer-2.5
cursor
kimi-k2
grpo
dapo
diloco
openenv
trl
verl
research
methodology
Instructions to use Codeseys/composer-replication-framework with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- Transformers
How to use Codeseys/composer-replication-framework with Transformers:
# pip install -U transformers accelerate # Load model directly from transformers import AutoModel model = AutoModel.from_pretrained("Codeseys/composer-replication-framework", device_map="auto") - Notebooks
- Google Colab
- Kaggle
Commit History
-
docs(wave2): archive point-in-time wave reviews + dated review bundles
Move historical, point-in-time artifacts into _archive/ (preserving git history via rename) and leave one-line redirect stubs at every original path so nothing 404s — including the prose references baked into immutable accepted ADRs (ADR-007/008/012) and off-limits spike verdicts, which cannot be edited to point at the new location. Docs-only; no source files touched. Moved -> docs/research/_archive/ : WAVE_7_10_FINAL_REVIEW, WAVE_13/14/15_FINAL_REVIEW (cross-model reviews). Moved -> docs/_archive/ : DEEP_WORK_LOOP_LOG, WAVE_COMPOSER_DATAGEN_RL_2026-05-29, and the two dated review bundles (reviews/cross-family-adr-008-009-010-2026-05-29/ and reviews/final-verify-deep-work-2026-05-29/). Each origin path keeps a redirect stub pointing to the archived copy and to the current source-of-truth (METHODOLOGY / BACKLOG / V1_V8_COVERAGE / ADRs). Added docs/_archive/README.md and docs/research/_archive/README.md indexing what was archived and why ("point-in-time, superseded by current d…f00833d -
docs(wave1): correctness pass — channel-3 provenance, gap honesty, dead links
Propagate ADR-014 ground truth into the living docs and fix every dead relative link. Docs-only; no source files touched. Provenance (Fact A) — stop blurring the additive trace-replay-DPO channel into Cursor's recipe: - README v0.1 roadmap cell, HF_REPO_LAYOUT v0/v1 variant rows: reframe "Composer recipe" = channels 1 (Dr.GRPO) + 2 (SDPO) only; trace-replay is the framework's own addition (link ADR-014). Gap honesty (Fact D) — do not imply the full A1-A4 LMA ladder is runnable: - VISION_VALIDATION status banner + ALTERED_MINDS_TIE_IN Phase-3: only A1 (GRPO-only) has a real Modal runner; A2/A3/A4 are scaffold + plan-builder only, blocked on dataset construction. Real 8B run is additionally budget-gated. PO menu / strip_thinking / main-lag (Facts B, E, F): - VISION_VALIDATION: base RL objective is a selectable menu (default Dr.GRPO) per ADR-014, not hardcoded. - ALTERED_MINDS_TIE_IN: note SDPO requires strip_thinking=False on real traces (~67% of error-recovery turns are…20e3bd9
-
feat(trainer): policy-optimization objective MENU (ADR-014)
Adds make_po_config(objective=..., **overrides) — RL's base objective is no longer hardcoded to Dr.GRPO. Six selectable named presets over trl 1.5.0's verified GRPOConfig knob-space (introspected the installed package, not a GitHub snapshot): grpo | vanilla GRPO (std-norm advantage) dr_grpo | DEFAULT; no length-std bias (Composer 2.5's base objective) bnpo | batch-normalized dapo | decoupled clip-higher (epsilon_high=0.28) + overlong mask + KL off gspo | sequence-level importance ratio (Qwen3; long-CoT / MoE stable) cispo | detached-IS REINFORCE (every token keeps a gradient; MiniMax-M1) Every preset is PURE CONFIG (trl already implements each loss_type branch + importance_sampling_level/epsilon_high) — no custom _compute_loss. Drift guards assert loss_type / IS-level / epsilon_high actually applied so a preset can't silently degrade (e.g. GSPO with IS overridden back to token raises). 10 unit tests green against real trl 1.5.0. Research-grounded: Composer …aae66fa
-
docs(adr-013): close acceptance-gate boxes 1-5; only user-gated spend remains
The LMA-side runner scaffold (the one outstanding non-budget-gated box) now exists in the sister repo: llm-mental-alterations/composer_replication_runs/ with 15 green mock-driven tests (collect+pass with no torch/trl/modal/framework installed), documented in LMA ADR-0017. Marks boxes 1-5 done; the only open item is the explicit user go/no-go on real LMA-checkpoint / Modal budget spend.7b34ebf -
fix(phase-8): close all 5 cross-family final-verify findings + regression tests
The deep-work-loop exit gate (2 independent confirmations). A final 3-family scatter of the session diff found and we fixed: - [P0 latent] SDPO sentinel-mask used only student_response_valid; now requires BOTH valid masks AND non-sentinel indices (a future divergent teacher tail could have distilled against clamped position 0). - [P1 convergent, GPT-5.5+Gemini] curriculum shared one n_effort denominator for turns+think_tokens; split into independent n_turns/n_think counters. - [P1] docker E2E test ran pip-install under --network none (would fail when the gate activates); replaced with stdlib python -c expression runner, no network. - [P1] MMLU reward: Answer: A or B hedge scored full credit; _HEDGE_RE now penalizes it as multiple-answers. - [P1] HackMonitor read-markers matched import in important / cat in concatenate and scanned the agent patch as read-evidence; whole-word regex + exclude patch/diff payloads from BOTH layers (a legit patch can no longer self-incriminate…678d10b -
feat(b4-gpu+b6): GPU train-proof on A10G + docker-gated substrate E2E test
B4-GPU: modal_b4_gpu_smoke.py ran real Qwen2.5-0.5B-Instruct on a Modal A10G in bf16, 30 steps of the real 3-channel composition. PASS: all-finite, SDPO channel fired nonzero (max JSD 0.1855), loss converged 4.7262 -> 0.0050 monotone. This is the genuine "it trains on GPU" proof the CPU smoke could not give. Result + curve in gpu_smoke_result.json; README documents both CPU and GPU proofs. B6: test_docker_substrate_e2e.py — the docker-gated 4-gate substrate-inversion E2E now EXISTS (was only referenced). Runs the gates against a real python:3.11-slim container + real subprocess pytest on a minimal synthetic feature-deletion task, plus a cache-scrub-in-container test. Skips cleanly with no Docker (2 skipped here), runs the moment a Docker host executes the suite. ADR-010 [~] gate updated: mechanics gate is now ready-to-close, not just wired. Cost: ~1-3 USD A10G. No LMA budget touched.c009712 -
feat(wave-b): ADR-013 LMA integration + B4 end-to-end SDPO-fires proof + doc refresh
ADR-013: composer_replication/integrations/altered_minds/ (generic, framework-side) - MMLUFormatReward: structured-answer reward, scores only the final letter (not rationale style), unparseable/multiple-answer penalties, option-order randomization, always-C exploit detectable via logged option distribution. - dual_kl_logger: KL(policy||altered-init) AND KL(policy||unaltered-base) as the washout-vs-amplification instrument (neither optimized). - channel_ladder_configs: A0-A4 isolated-channel ladder (alpha=0.02/beta=0.05), replacing the uninterpretable combined alpha=0.2/beta=0.4 recipe per the cross-family research critique (SDPO can AMPLIFY an altered model). B4: examples/altered_minds_channel_ladder/run.py PROVES the SDPO channel FIRES nonzero (JSD=0.0565, grad flows) through the REAL shipped collator alignment indices — the thing the old smoke could not show (it only proved init). Honest stub-with-differing-tokens proof; real-model path gated behind ALTERED_MINDS_REAL_MODE…21647a4 -
feat(wave-a): close ADR-011 (SDPO alignment indices) + ADR-012 (review findings)
B1/ADR-011: collator emits student/teacher_response_idx + valid masks via _mask_to_padded_indices; loss sentinel-masks padding. Strict SDPO no longer raises against the real collator (the regression my review-fix introduced). B2/ADR-012: - k1-KL: found TRL 1.5.0 uses k3 not k1; corrected docstring honestly + documenting test. - hint routing: style/communication/effort sites now reach the judge (error-kind aware). - HackMonitor: added patch-provenance layer defeating string-concat obfuscation; ADR-010 language corrected AST->signature+patch-provenance. - curriculum: optional turns/think_tokens effort signals, backward-compatible. 210 passed / 16 skipped (was 192). Two Opus-4.8 workers in parallel.d02d724 -
architect: ADR-011/012/013 + research (alignment-index fix, review-findings closure, LMA channel-ladder)
b4a584a -
review+fix: cross-family adversarial ADR review (owed item) + remediation
Ran the owed 5-family adversarial review of ADR-008/009/010 (unblocked once OpenRouter credits were restored). 4/5 clean reviews (GPT-5.5, Gemini 3.1 Pro, DeepSeek V4 Pro, Grok 4.3; Kimi starved its token budget). Verdicts: ADR-008 3-REJECT/1-fix, ADR-009 unanimous-fix, ADR-010 3-REJECT/1-fix — all REJECTs were "accepted-status outran the evidence," not "design wrong." The review caught a real policy-corrupting P0 the solo pre-mortem missed: the SDPO alignment guard was a shape-check, so hint-shifted teacher tokens could silently misalign and distill garbage into the policy. Verified every convergent finding against code, then fixed (192 pass/16 skip, was 187): - SDPO alignment (composer_trainer.py): require collator-emitted student_response_idx/teacher_response_idx; gather aligned post-hint logits before JSD; strict-mode raises on missing/mismatched indices. Tests rewritten to the corrected contract (different-length sequences now exercised). - Sandbox scrub (sandbox.py): boo…185cce2 -
docs: wave summary — Composer 2.5 data-gen + targeted-RL textual-feedback
8498e8f -
feat(datagen): ADR-010 FeatureDeletionEnv synthetic-data subsystem; accepted
Track A of the deep-work-loop — Composer 2.5's named synthetic-data generator (Feature Deletion) as a reusable subsystem. New composer_replication.datagen: - schema.py: FeatureDeletionTask (broken_repo + FAIL_TO_PASS reward target + PASS_TO_PASS functional guard; golden_diff HELD OUT of repr/observation). - sandbox.py: Sandbox Protocol + FakeSandbox (unit tests) + LocalSubprocessSandbox (real); SANDBOX_DENYLIST blocks find/strings/unzip/decompilers/git (the tools Composer's reported reward-hacks used to recover deleted signatures). - monitor.py: HackMonitor — flags cache/bytecode-provenance hacks so the grader masks reward (defense-in-depth behind the sandbox lockdown). - curriculum.py: DifficultyCurriculum — online pass-rate gate; up-weights the ~0.5 frontier (w ∝ p(1-p)), retires aced tasks, quarantines all-fail tasks (raw rate, not smoothed). Implements the blog's "select for harder tasks dynamically". - validator.py: 4-gate solvability validator (baseline-green / del…9336af3 -
feat(hints): ADR-009 layered HintGenerator; accepted
Track B of the deep-work-loop. Extends hint_generator.py from a flat dispatch registry into a layered, cost-ordered HintGenerator behind a typed Protocol — the SDPO textual-feedback hint source (Composer 2.5's hint mechanism is unstated in every Cursor artifact; this is our reconstruction). Layers (tried cheapest-first, first non-None wins): 1. TemplateHintGenerator — the existing 5 templates (free, deterministic; byte-identical to dispatch(), preserved). 2. RawErrorHintGenerator — raw env/tool error text as the hint (free; covers any message-bearing site templates miss). SDPO "environment feedback as conditioning signal". 3. LLMJudgeHintGenerator — <=2-sentence corrective hint via an injected complete() callable (optional, OFF unless provided; in-memory + disk cache keyed on error-context hash; covers style/communication/effort). CompositeHintGenerator.as_collator_hook() returns a callable matching the existing CollatorConfig.hint_generator signature (…84740d4 -
feat(trainer): ADR-008 gate-3 live GRPO+SDPO smoke PASS; ADR-008 accepted
The composer_grpo_sdpo_smoke instantiates a real trl.GRPOTrainer via ComposerReplicationTrainer on Qwen2.5-0.5B with the Dr. GRPO config (loss_type=dr_grpo, scale_rewards=none, num_iterations=1) and alpha_sdpo=1.0, runs 1 step, and confirms loss/sdpo_kl is logged — the SDPO channel is wired into the live Dr. GRPO loop. PASS. Surfaced + fixed a real API drift: TRL 1.5.0 dropped GRPOConfig.max_prompt_length. All 4 ADR-008 acceptance gates green -> status proposed->accepted; gate checkboxes ticked with evidence; index updated.2a34df4 -
feat(trainer): ADR-008 Dr.GRPO config + SDPO strict-alignment guard
Phase-6 execution of ADR-008 (gates 1, 2, 5 green; gate 3 = the live GRPOTrainer smoke runs detached separately). - make_dr_grpo_config(): builds trl.GRPOConfig to the Dr. GRPO recipe (loss_type=dr_grpo => no length-standardization bias; scale_rewards=none => no std-dev advantage normalization; num_iterations=1 => single-epoch), with a drift-guard assertion. TRL 1.5.0 natively supports these knobs and its own help text cites the Dr. GRPO paper for both. - ComposerReplicationTrainer.strict_sdpo_alignment (default True): the student/teacher logit shape-mismatch path now RAISES instead of silently zeroing the SDPO channel (closes the ADR-008 trust-gap, composer_trainer.py lines 158-160). Opt-out to warn-and-skip for production resilience. - prime_rl/composer_loss.py: NotImplementedError(alpha_sdpo>0) message now points at the TRL host as the SDPO home (documents the ADR-006 amendment). - Tests: 7 new (config knobs asserted; strict raises / non-strict skips / aligned fir…bde5c5e -
docs(adr): add ADR-008/009/010 (Dr.GRPO+SDPO, layered hints, FeatureDeletionEnv)
Phase-4 of the deep-work-loop. Three proposed ADRs translating the Composer 2.5 data-gen + targeted-textual-feedback research into durable decisions, each with mechanized acceptance gates (status stays `proposed` until gates green): - ADR-008: target Dr. GRPO (length-std off, no std-norm, k1 KL, Adam, single-epoch — per arXiv:2603.24477) and host the live SDPO channel in the TRL ComposerReplicationTrainer. amends ADR-006 (SDPO needs full logits -> TRL-only; PRIME-RL hosts channels 1+3). preserves ADR-007. - ADR-009: layered HintGenerator (template -> raw-error -> LLM-judge -> SDPO sibling-bootstrap) behind a typed Protocol; preserves the existing templates + CollatorConfig.hint_generator hook. - ADR-010: FeatureDeletionEnv synthetic-data subsystem inverting OSS SWE substrates (SWE-bench-Lite/SWE-Gym/R2E-Gym/SWE-rebench) + online difficulty gate + reward-hacking safeguards. ADR-006 patched: Amended-by header + stale matrix row qualified. Index added. Prior-ADR audit (ad…36ab61e -
research: Composer 2.5 data-gen + targeted-textual-feedback deep-research wave
Phase-3 of the deep-work-loop bringing Composer 2.5's dataset-generation and targeted-RL-with-textual-feedback methods into the framework. 5 new research docs (130KB), all with primary-source citations: - 06-feature-deletion-datagen.md: Feature Deletion env design (online pass-rate difficulty gate, reward-hacking safeguards, 5 OSS substrates w/ HF ids + licenses, deletion mechanics, FeatureDeletionEnv + TRL reward_fn adapter). - 07-sdpo-hint-generator.md: layered HintGenerator (template -> raw-error -> LLM-judge -> introspection -> learned -> SDPO sibling-bootstrap), actual template strings, judge prompt, slots into existing CollatorConfig hook. - 08-sdpo-grpo-integration.md: ComposerGRPOTrainer(GRPOTrainer) design adding SDPO KL at error turns on top of Dr. GRPO; PRIME-RL recipe blocked (log-probs only), TRL subclass is the host; CPU smoke plan. - 09-composer-blog-delta-2026.md: blog re-extraction delta; found the Composer 2 arXiv tech report; SDPO successful-rollout-as…6049d00 -
examples: add sdpo_real_trace_train_smoke — close the forward+backward+step link
The framework proved the SDPO data path (validate_real_trace_alignment: 832/832 mask alignment on real ~/.claude traces) and the loss math (test_gradient_flow: SDPO routes finite grads on TinyLM) in isolation, but never connected them: an actual compose_loss forward + backward + optimizer.step() on a real HF model fed by the real-trace collator. This is the never-implemented composer_replication.examples. sdpo_with_real_traces_production module that Modal stage_4_sdpo_smoke referenced. It is now real and PASSES on Qwen2.5-0.5B-Instruct over 6 real error-bearing sessions: step 0: total=2.36307 lm_ce=2.33588 sdpo_jsd=0.02718 finite=True step 1: total=2.32758 lm_ce=2.30190 sdpo_jsd=0.02568 finite=True SDPO channel fired (>0): True | param moved: True (max|Δ|=6.22e-05) Gates: (1) no crash, (2) finite loss, (3) SDPO channel fires >0 (shape-gate passes, teacher forward contributes real signal — not the silent no-op the empty-placeholder stage_4 would give), (4) a real param moves af…7090729
-
Wave 21c: verify PRIME-RL adapter parity against upstream source (byte-for-byte)
The recipe's only automated parity check (test_parity_with_prime_rl_default_loss_fn) is skip-marked whenever prime-rl isn't importable in the framework venv — i.e. essentially always, since we deliberately keep prime-rl's heavy deps (vLLM, pydantic config trees, flash-attn) out of our test env. The fallback was an in-file reimplementation (_reference_default_loss), so a shared bug could pass silently. This closes that gap against the ACTUAL upstream source. ## What was done Built an out-of-band parity harness that: - clones PrimeIntellect-ai/prime-rl (shallow) - builds an isolated venv with ONLY torch+beartype+jaxtyping+numpy - loads upstream src/prime_rl/trainer/rl/loss.py directly by path, stubbing the two modules it imports (prime_rl.configs.trainer, prime_rl.utils.utils) so we skip the vLLM/pydantic dependency tree entirely - runs identical inputs through our loss_fn and upstream default_loss_fn ## Result 24/24 cases match (12 seeds × 2 regimes: tiny-perturbation + wide-diver…c98928e -
Wave 21b: skip zero-signal SDPO on empty-recovery error turns + real-trace validation
Found by validating the Wave 21 pipeline against REAL Claude Code session logs (738 local sessions, 66 with is_error:true) rather than only the synthetic fixture. Two outcomes: a collator fix and a permanent validation example. ## Collator fix: empty-recovery error turns On real traces, ~67% of error sites have EMPTY recovery content when strip_thinking=True — because the error-RECOVERY turn is frequently pure [THINKING] (the model reasons about the failure, then silently retries a tool), and stripping thinking empties it. The old code set any_errors=True and injected a hint the moment hint_text existed, BEFORE checking recovery content, so an empty-recovery turn produced an all-ignore_index sdpo_loss_mask: a zero-signal SDPO row that wastes a forward pass and dilutes the channel. Fix: only treat a turn as an SDPO error site when BOTH a hint was produced AND the recovery turn has content (`hint_text and turn.get("content")`). Applied symmetrically to `_build_hint_injected_trace` (te…d61036a -
Wave 21: close both Wave 20 debt items — chat-template alignment + structural is_error
Two architectural-debt items flagged "Wave 20 candidate" in the framework doc, both CPU-only, both now fixed and regression-guarded. ## 1. SDPO mask chat-template drift (was ~67% aligned, now ~100%) `ComposerDataCollator._build_segment_mask` built the sdpo_loss_mask (and the aligned-student response_mask) by tokenizing each content segment in isolation and concatenating. That ignored the scaffolding tokens apply_chat_template inserts around every message (<|im_start|>{role}\n ... <|im_end|>\n, BOS), so mask bits drifted left of the real content tokens — the residual ~33% contamination documented in the Wave 19 production audit. Fix: new `_build_chat_aligned_mask` derives the mask from per-message apply_chat_template prefix deltas. For message k it computes the token span len(template(msgs[:k+1])) - len(template(msgs[:k])), then locates the content run inside that span by subsequence match and marks ONLY those positions as loss. Falls back to whole-span marking if the content run can…6806cf7 -
Wave 20: ModalSpawnExecutor — finish the Modal-backed serverless executor
Wave 17 shipped a NotImplementedError skeleton for ModalExecutor pinned by test_skeleton_executors.py. Wave 18 hardened the skeleton contract to be strict per-code-path. This wave adds the real Modal-backed executor as ModalSpawnExecutor (sibling class), preserving the skeleton contract for backward compat while making DiLoCo across Modal containers actually runnable. Design choices vs the v0 skeleton's docstring: 1. **User-provided modal.Function instead of internal app construction.** The skeleton showed a pattern where the executor builds its own modal.App and registers run_replica internally. That couples the executor to image/GPU/Volume choices the user actually wants to own. ModalSpawnExecutor takes a *pre-decorated* modal.Function from the caller. The user defines: @app.function(gpu="H100:4", image=img, volumes={"/vol": vol}, secrets=[...], timeout=4*3600) def diloco_replica(rank: int, rendezvous_uri: str, world_size: int, **k…a384097
-
Wave 19: production-grade SDPO via ComposerDataCollator + adapter + collator fixes
Adds the full production data path Wave 18 deferred: ClaudeCodeIngester → adapter → ComposerDataCollator → compose_loss with proper hint injection at detected error sites. Two rounds of 3-reviewer cross-family review caught a critical SDPO mask alignment bug in round 1; round 2 verified the fix. NEW infrastructure: - composer_replication/ingestion/trace_examples.py: claude_states_to_trace_examples() adapter walks ClaudeCodeIngester output, detects [TOOL_RESULT (ERROR)] tagged user turns, marks the recovery assistant turn with tool_error="<kind>" so ComposerDataCollator._is_error_turn picks it up. Default classifier handles file_not_found, permission_denied, command_not_found, syntax_error, connection_error; users can pass custom error_kind_fn. Backward-scan finds errors even when intervening user turns separate the error from recovery. - composer_replication/ingestion/tests/test_trace_examples_adapter.py: 14 tests pinning the adapter contract (error detection, classifica…03bf323
-
Wave 18: 14 backlog items closed + 3-reviewer cross-family review
Polish wave grinding down 14 P0/P1/P2 items from Wave 7 audit + Wave 11/12 self-critique + Wave 16/17 deferrals. Two passes of 3-reviewer cross-family review (Gemini 3.1 Pro / Grok 4.3 / Sonnet 4.6) caught 6 real issues in round 1; round 2 verified all fixed plus 2 new flagged items addressed. Doc honesty (P0): - README.md scoping change at line 29: dropped "any HuggingFace base model" for the more honest "any HF causal LM with a chat template (Qwen, Llama, Mistral, DeepSeek, Phi, Gemma families)". Added qualifier that Spike 006 zeroed the SDPO channel due to shape misalignment, so SDPO is verified via the integration test suite + end-to-end examples, not Spike 006. - spikes/005-integrated-trainer-skeleton/verl_path/README.md NEW — explicit STATUS: design-only marker per Wave 7 audit Objection 3. Documents what to do before relying on the VeRL path (install Ray, run parity test against trl_path). Test honesty (P1): - spikes/006-real-hf-model-smoke/verdict.md numerical c…54efac8 -
Wave 17: close all 5 audit FLAGs + SDPO context alignment + serverless re-exports
Three-track follow-up to Wave 16, with cross-model review (gemini-3.1-pro APPROVED, grok-4.3 surfaced one BLOCKER that verified false-positive empirically, deepseek-v4-pro burned all max_tokens on hidden reasoning producing no visible output): Wave 17a — serverless package re-exports (real code bug) composer_replication/diloco/serverless/__init__.py now re-exports ModalExecutor and HFJobsExecutor alongside LocalProcessExecutor. The package docstring already documented `from composer_replication.diloco.serverless import ModalExecutor` as the public API but the import would have failed because the names weren't in __init__.py's import list or __all__. Both modal.py and hf_jobs.py import-safely (they don't import the optional `modal` / `huggingface_hub` packages at module level — those are deferred to class method calls), so adding the re-exports doesn't introduce a new dependency. Pinned by a regression test (test_public_reexports_include_all_executors in test_s…a84c060 -
Wave 16: install ergonomics + gradient evidence + SDPO end-to-end example
Five-track polish wave with mandatory cross-model adversarial review (deepseek-v4-pro + gemini-3.1-pro-preview, route-fidelity-verified via direct-urllib scatter; reviewers caught 2 real bugs that BOTH made it into the staged diff and would have shipped without the review): Wave 16a — Install ergonomics (extras pinning) pyproject.toml dropped three extras whose lower bounds were unsatisfiable on public PyPI and would have blocked any fresh user: - monarch>=0.4.1: PyPI 'monarch' tops out at 0.1.11 and is unrelated to Meta's actor framework; the real Monarch ships as torchmonarch-nightly with platform constraints. - prime-rl>=0.5: 'prime-rl' is not registered on PyPI at all; Prime Intellect publishes from source only. - data-juicer>=1.0: 'data-juicer' is not registered on PyPI; the closest match (py-data-juicer) has broken transitive deps. All three integrations import lazily, so the framework still loads cleanly without them. docs/TROUBLESHOO…c0a5ab7 -
Wave 15: 4-angle multi-model self-critique caught 2 math BLOCKERs in primary loss kernels; fixed against upstream byte-for-byte + GSM8K example + ergonomics
PHASE 15a: 4 parallel adversarial reviewers, each with different framing to maximize independent-angle coverage: - MATH (Opus 4.7): cloned upstream OPSD/TAID/PRIME-RL/SimPO, did line-by-line diff. Found 2 BLOCKERs all 8+ prior reviewers missed. - TESTS (Opus 4.7): scrutinized 3 high-stakes test files for weak assertions. Found PRIME-RL parity test silently never runs; bit-exact test uses allclose; entropy-OPD test is pure smoke. - DOCS (Opus 4.7): audited 6 major docs + ADRs. Found test-count drift (77/107/124 vs 145), compose_loss kwarg drift, stale "Deferred to Wave 14" claim, PRIME-RL test count 10 vs 16. - USER-JOURNEY (Opus 4.7): walked "RL-finetune Qwen-7B on GSM8K" end-to-end. Scored framework 2.4/5 with Real-Task-Path = 1/5. #1 friction: NO GSM8K example anywhere. All 4 reports saved to /tmp/wave15_*.md. Headline: math reviewer's upstream-clone-and-diff approach caught what paper-level review missed. PHASE 15b: synthesized findings into 5-task fix scatter. PHA…e5add15 -
Wave 14: close every Wave 13 review finding + 4 documentation files; Wave 14b: real PRIME-RL parity + multi-process DiLoCo convergence
PHASE A: 4 parallel impl subagents closed every Wave 13 cross-model review item. T1 \u2014 compose_loss integration (closes W13 BLOCKER 2): - Added `dpo_variant: 'dpo'|'simpo'`, `sdpo_wrapper: 'none'|'taid'|'entropy_opd'`, `taid_schedule_step`, `taid_total_steps` plus 5 tuning kwargs - 11 new integration tests in composer_replication/tests/test_compose_loss_integration.py - Bit-exact reproduction of legacy compose_loss output when defaults preserved - All 38 spike-005 tests still pass T2 \u2014 replaysim DJ adapter reshape (closes W13 Suggestion 3): - _dpo_pair_to_dj_record now emits BOTH flat strings AND chat-messages for dual-shape compatibility with data-juicer's text ops - _dj_record_to_normalized round-trips both shapes - default.yaml fixed: text_keys plural \u2192 text_key singular (caught a related bug in the same op set) - Real data-juicer e2e test runs DefaultExecutor on a 3-record fixture - 15 tests (was 9) T3 \u2014 MockManager DiLoCo integration (closes W13 Suggest…d9dd3a5 -
Wave 13: serverless DiLoCo + replaysim normalization + 3 distillation losses + PRIME-RL + Monarch
Expanded the brief mid-deep-work-loop to address the user's request for serverless training-system support, replaysim dataset normalization, deeper self-distillation paper coverage, and Meta's PyTorch agentic stack tie-ins. NEW MODULES (35 tests passing): - composer_replication.distillation: SimPO (arXiv:2405.14734), TAID (arXiv:2501.16937), Entropy-Aware OPD (ICLR 2026 spotlight). 17 unit tests covering scalar/differentiable/scheduler-monotonicity and boundary-condition correctness against paper formulas. - composer_replication.diloco.serverless: ServerlessExecutor Protocol + ObjectStoreAllReduce (fsspec-backed; works with file:// + s3:// + hf:// + gs:// + az://) + LocalProcessExecutor (working) + ModalExecutor / HFJobsExecutor (skeletons, raise NotImplementedError). 9 tests including 3 multi-process tests pinning the allreduce barrier with mean-of-{0,1,2}=1 + mean-of-{0,100,200}=100 across two consecutive rounds. - composer_replication.replaysim: data-juicer adapte…b266c31 -
Wave 12: close V1-V8 brief — GPU smoke, SDPO firing, real-trace e2e
Addresses cross-model review priority items 3, 4, 5, 9 — the ones that materially close the original V1-V8 brief. Wave 12 deliverables: 1. **Spike 002a-mini-gpu-smoke** (NEW directory) — closes "zero GPU evidence": - 50-step Qwen2.5-0.5B-Instruct training run on local RTX 5090 (sm_120, Blackwell), bf16, in 35 s wall-clock total - Loss 0.7354 → 0.00034 (99.95% reduction), all grads finite, peak VRAM 5.31 GB (well under ADR-001's 8 GB target), median 480 ms/step - Captures per-step memory + step-time + finite-grads in results/gpu_loss_curve.csv + results/gpu_verdict.json - ADR-001's local-5090 choice now empirically verified (vs ~3-5 min cold-start cycle estimated for Modal L4) - Resolves cross-model review item #4 2. **Spike 006-strict** (`tests/test_strict.py`) — closes the tautology critique: - test_alternating_batches_loss_decreases: 10 steps alternating between factorial + binary_search variants. Late-avg-loss < 50% × early-avg-loss. …d88715c -
Wave 11: cross-model adversarial review + honest down-revision
Phase 11 of the deep work loop ran a cross-model adversarial review on the Wave 7-10 work. The review (anthropic/claude-opus-4.7, separate session) found 10 substantive flaws including 2 BLOCKERs: 1. **Scorecard inflation** — initial self-claim was 5/10 → 9/10, honest re-scoring is 5/10 → 7/10 ✅ + 1/10 ⚠️ + 2/10 ❌-spirit. 2. **Spike 008 acceptance criterion silently redefined** — BACKLOG required "2 replicas converge"; what shipped is "1 replica + passthrough no-op allreduce." The recon doc's "ready-to-paste 2-replica pattern" hits a single-process post-hook sequencing bug. Both BLOCKERs addressed in this commit: - docs/research/WAVE_7_10_FINAL_REVIEW.md — full 423-line review committed. - docs/VISION_VALIDATION.md — replace 9/10 self-claim with honest 7/10 re-scoring + per-test caveats acknowledging the spirit-failures of tests 6/8/10. Explicitly notes "the framework as of this commit has zero GPU evidence of any kind." - spikes/008-streaming-diloco/verdict.md — s…f16fa23 -
Wave 10 — packaging: composer_replication is now pip-installable
Promotes the framework from "skeleton scattered across spike directories" to a proper installable Python package (closes vision-validation gap V4). What's new: pyproject.toml at repo root - Hatchling build backend - Python ≥3.10 - Core deps: torch≥2.0, transformers≥4.46 - Optional extras: replay (httpx), diloco (torchft-nightly), train (trl, peft, accelerate, datasets), dev (everything + pytest, ruff) - Project URLs point to the HF repo + Discussions composer_replication/ package (8 modules) - __init__.py re-exports the framework's public API: compose_loss, LossComponents, build_batch (Spike 006) generalized_jsd_loss (verified port of OPSD) ClaudeCodeIngester, IngestionStats, SYSTEM_PROMPT (Spike 007) TraceState, DPOPair, TeacherSpec, replay_trace, extract_dpo_pairs, DEFAULT_TEACHERS (Spike 001/005) ComposerReplicationTrainer (Spike 005, TRL subclass) make_diloco_outer_loop …ac05fbf -
Tidy .gitignore (de-dup *.jsonl, restore section blank lines)
d52e126 -
Spike 007: include synthetic_session.jsonl fixture in repo
The .gitignore whitelists spike fixture files but missed spikes/007-real-trace-ingestion/fixtures/synthetic_session.jsonl. Without it, anyone pulling the repo cannot run the Spike 007 tests because the fixture they reference is missing. Adds !spikes/**/fixtures/*.jsonl to the .gitignore whitelist.a35a8d7 -
Wave 7+8+9: spikes 006/007/008 — close vision-validation gaps V2/V5/V8
Three CPU-only gap-closer spikes from the deep work loop's BACKLOG.md, each with its own README, implementation, tests, and verdict. Spike 006 — Real HF model smoke (closes V8) - Promotes the framework from "mock 4-layer toy LM" to "real Qwen2.5-0.5B-Instruct via AutoModelForCausalLM with real tokenizer". - New free `compose_loss(model, inputs, alpha, beta)` function decouples the 3-channel loss composition from TRL's GRPOTrainer machinery for verification. Production path stays in ComposerReplicationTrainer._compute_loss. - 5 backward steps on CPU, loss 0.7390 → 0.0031, all grads finite. - 9 unit tests + run_smoke.py CLI + results/loss_curve.csv + verdict.md. - Wall-clock: 4 minutes (CPU forward pass on 0.5B model). Spike 007 — Real trace ingestion (closes V5) - Maps real Claude Code session JSONL → TraceState records. - Per ADR-002: 1,015 local sessions on this machine, zero acquisition cost, schema validated by 4 independent community projects + JSON Schema. - Design: one …57af35d -
Wave 7: Phase 2-4 of deep work loop — backlog, parallel research, three ADRs
Imports the gap-closer wave from VISION_VALIDATION.md as a structured backlog, records the deep work loop log, and locks three architecture decisions backed by primary-source research from three subagent recons. Backlog items (CPU-only, no GPU budget): - Spike 006 — real HF model smoke (Wave 7 next) - Spike 007 — real trace ingestion (Wave 8) - Spike 008 — Streaming DiLoCo smoke (Wave 9) - Wave 10 — packaging (pyproject.toml + examples/) - Spike 002a-mini — Modal-gated GPU smoke (Phase 10) Research (docs/research/, 1168 lines total): - MODAL_RECONNAISSANCE.md — Modal pricing + setup, primary-sourced from modal.com/pricing and modal.com/docs. Verdict: Modal L4 is $0.08-0.13 per smoke run but loses to local 5090 by 10x on iteration cycle (3-5min vs 25-40s). Modal becomes correct for parallel sweeps, 7B+ models, multi-node training, or CI repro — none of which apply to gap-closer wave. - DILOCO_RECONNAISSANCE.md — audited 5 candidates. meta-pytorch/torchft wins: BSD-3, 312 com…ac4bfb4 -
Wave 6: vision validation self-audit (5/10 to 9/10 in 5 days, no GPU)
baladithyabSelf-audit of whether the framework actually encapsulates the original brief. Recovered the brief verbatim from the originating session, decomposed into 8 atomic clauses (V1-V8), built a traceability matrix to current deliverables, and ran adversarial self-review. Honest scorecard: 5/10 pass, 4/10 fail, 1/10 partial. Strengths verified: V1 Composer 2.5 understanding (audited) V3 Five-component stack (TRL+VeRL coded; OpenEnv default; Forge paused; Monarch design-aligned) V6 N-teacher distillation economic feasibility V7 Rigorous research process Real gaps found: V2 DiLoCo: deferred to v0.2 but brief said "combine with diloco" - drift V4 "framework" vs "skeleton": no installable package, no examples dir V5 "real llm-application traces" - we used synthetic 50-state fixture V8 "any HF model" - architecture generic, never tested on real HF model Three CPU-only gap-closer spikes proposed: Spike 006 (real-HF-model smoke, half day) - closes V8 Spike 007 (real-trace inge…040eff8 -
Wave 5: full publication-materials drafts (pre-experimental release set)
baladithyabUser asked: draft all publication materials until we can do proper experimentation to back up our ideas. Drafted a complete pre-experimental publication wave: methodology paper, blog post, repo Discussion announcement, X/LinkedIn threads, CITATION.cff + .bib at repo root, plus a RELEASE_CHECKLIST coordinating sequencing, embargo, and risk register. None of this is posted publicly yet — that's a separate decision when ready to ship. Honest framing reused throughout: this is methodology + economic-feasibility + integration architecture, not training results. Spike 002-004 produce the empirical training validation in a v0.1 follow-up. Added: publications/PAPER_v0.md (33KB, ~6500 words) Longform methodology paper: 10 sections covering Composer 2.5 audit, integration architecture, novel TR-DPO channel, spike 001 + 005 results, honest "what's NOT proven" section, reward-hacking proposals, full citation list with primary sources. publications/BLOG_POST.md (16KB, ~2400 words) Hu…639a760
-
Wave 4: data collator + loss composition smoke (38/38 tests pass)
baladithyabSpike 005's biggest engineering gap was: composer_trainer.py described the inputs it expected (ctx_teacher_input_ids, sdpo_loss_mask, dpo_chosen_input_ids, etc.) but nothing constructed them from raw traces. This wave fills that gap and adds an end-to-end gradient-step smoke test on a real model. Added: 1. trl_path/data_collator.py - ComposerDataCollator turns raw TraceExample into the exact dict shape ComposerReplicationTrainer._compute_loss expects. Channel 1: input_ids, attention_mask, response_mask, rewards. Channel 2: ctx_teacher_input_ids, sdpo_loss_mask (post-hint = 1, else -100). Channel 3: dpo_chosen_input_ids, dpo_rejected_input_ids, response_masks. Hint injection, error-site detection, multi-turn DPO tokenization, padding. 2. tests/test_data_collator.py (15 tests, all pass): verifies SDPO is skipped when no error sites or no hint generator, post-hint mask correctly marks 1 vs ignore_index, DPO response masks zero prompt tokens, padding handles mixe…157cdba -
Wave 3: integration architecture + spike-005 trainer skeleton (16 tests pass)
baladithyabUser asked: can RLVR + Composer-SDPO + N-teacher-replay all integrate complementarily with the PyTorch agentic-RL stack (Monarch / TorchForge / OpenEnv / VeRL / TRL)? Answer (verified, not extrapolated): YES, with concrete extension points: 1. Verified ground-truth integration surfaces via DeepWiki audits: - TRL: subclass GRPOTrainer, override _compute_loss(model, inputs); plug OpenEnv via environment_factory= kwarg. - VeRL: register a new advantage estimator via @register_adv_est(name); attach extra fields to DataProto.batch / non_tensor_batch (precedent exists — distillation already uses 'teacher_log_probs' the same way). - OPSD: generalized_jsd_loss is a self-contained static method, MIT, directly liftable. FlashAttention-2 compatible, standard PyTorch. 2. NEW docs/INTEGRATION_ARCHITECTURE.md (30KB): - Per-framework integration matrix (TRL / VeRL / TorchForge / Monarch / OpenEnv) × per-channel (RLVR / SDPO / N-teacher-replay). - Sequence di…fd77f74 -
Integrate Cursor blog directly + audit research note + add SDPO/OPSD link
baladithyabUser flagged a real gap: I had dispatched a subagent to research Composer 2.5 but never personally read the Cursor blog. Audit findings: 1. The targeted-textual-feedback method = published SDPO (Hubotter et al., arXiv:2601.20802, ICLR 2026 Workshop) + OPSD (Zhao et al., arXiv:2601.18734, code at github.com/siyan-zhao/OPSD, MIT). Cursor cites these directly in footnote 1 of the blog. The subagent's research note never mentioned them. This is huge: there's published, MIT-licensed code for Composer's secret sauce. 2. Several claims in research/01-composer-2.5.md are NOT in the Cursor blog and were extrapolated from secondary sources ("85% post-training compute", "Anyrun" environment name, specific benchmark scores, "PPO or GRPO variant"). Likely correct via community consensus but not blog-verified. 3. Composer hint-distill (single model, hint-conditioned context) and trace-replay-distill (N external teachers) are TWO genuinely different mechanisms, not compe…1cede23 -
Spike v0.0 laydown + spike 001 VALIDATED
Decompose v0.0 into 4 risk-ordered sub-spikes: - 001 teacher-replay-cost (kill-switch, ✅ EXECUTED + VALIDATED in this commit) - 002a trace-collection-trl (planned) - 002b trace-collection-prime-rl (comparison-spike) - 003 dpo-pairs-from-disagreement (planned) - 004 ab-train-grpo-vs-trace-replay-dpo (terminal experiment) Spike 001 result (real, not scaffolding): - 150 teacher API calls (Opus 4.7 + GPT-5 + DeepSeek V4 Pro via OpenRouter) - 50 synthesized agentic-coding states as fixture - 0 errors, total spend $0.98 - Mean per-trace cost: $0.98 (target: <$5) ✅ — 5x headroom - p95 step latency: 20.5s (target: <30s) ✅ - p99 step latency: 23.2s (target: <60s) ✅ - Cost composition: Opus dominates ($0.81 of $0.98); DeepSeek + GPT-5 essentially free This validates the framework's central economic claim. Even ungated (no VOI, no tiered teachers), cost is ~$1/trace not $64/trace. With VOI gating in v0.1 we project ~$0.30/trace. Trace-replay-distillation is economically viable. Files: - spikes…35581fd -
Initial commit: Composer 2.5 Replication Framework — research synthesis
Methodology repo (model type) for an open replication of Cursor's Composer 2.5 (post-trained Kimi K2.5) on any HuggingFace base model. Contents: - README.md (HF model card with frontmatter) - framework/composer-replication-framework.md (master synthesis, 18KB) - research/ (5 deep-dives by 5 different LLM families, ~107KB total) - 01-composer-2.5.md (Gemini 3.1 Pro) - 02-diloco-family.md (DeepSeek V4 Pro) - 03-monarch-torchforge-openenv.md (GPT-5) - 04-verl-trl.md (Sonnet 4.6) - 05-trace-replay-distillation.md (Kimi K2-Thinking) - docs/METHODOLOGY.md (how the synthesis was produced) - docs/HF_REPO_LAYOUT.md (planned multi-repo split) - LICENSE (MIT) Status: pre-spike. No code, no weights, no datasets yet. Trained variants and trace datasets will live in separate repos linked via HF Collection.7165832