| # How a Self-Taught Builder with No Coding Background Made It to the Meta PyTorch Grand Finale |
|
|
| *By Hariharan | Meta Γ HuggingFace Γ PyTorch OpenEnv Hackathon Grand Finale | April 25-26, 2026* |
|
|
| --- |
|
|
| ## Two months ago I didn't know what an RL environment was. |
|
|
| I started vibe-coding with Claude in February. No CS degree, no formal ML |
| background β just curiosity and a lot of questions. |
|
|
| When I heard about this hackathon, I didn't ask "what should I build to |
| impress the judges." I asked Claude a different question: |
|
|
| **"Why do these companies run hackathons? What problem keeps their engineers |
| up at night?"** |
|
|
| The answer: the hardest unsolved problem in agentic AI isn't capability β |
| it's reliability. Agents that confidently follow stale instructions. Agents |
| that ignore mid-task context shifts. Agents that were told "switch to image |
| recognition" and kept preparing the text dataset anyway. |
|
|
| I looked around and saw every major infra company β building agentic memory, |
| agentic payments, agentic workflows β quietly fighting this same problem. |
| That external validation told me the idea was real. |
|
|
| So I built DriftEnv. |
|
|
| --- |
|
|
| ## What is DriftEnv? |
|
|
| An RL environment that puts AI agents directly in that situation β vague |
| instructions, mid-task shifts β and trains the failure behavior out. |
|
|
| - 25 scenarios across 5 ML workflow domains |
| - Each scenario: vague initial instruction + mid-task context shift |
| - Agent must interpret correctly, then pivot when things change |
| - 3 difficulty tiers: easy (1 step), medium (2 steps), hard (3 steps) |
| - OpenEnv compliant, deployed on HF Spaces |
|
|
| **Links:** |
| - Live Space: https://huggingface.co/spaces/harims95/driftenv |
| - Trained Model: https://huggingface.co/harims95/driftenv-qwen1.5b-sft-grpo |
| - GitHub: https://github.com/harims95/driftenv |
|
|
| --- |
|
|
| ## What happened during training |
|
|
| I'm going to be honest β nothing worked the first time. |
|
|
| We ran 5 training experiments over 2 days: |
|
|
| **Run 1:** Basic GRPO, 150 steps. Reward stuck at 0.245. Discovered R_pivot |
| (40% of reward) was 0.0 the entire time. The model never saw a context shift |
| during training β we only trained on easy (1-step) tasks. No pivot = no |
| learning on the most important signal. |
| |
| **Run 2:** Shorter completions (80 tokens), length bonus. Holdout score |
| improved to 0.271. +23% over untrained. But model still generated maximum |
| length every time. |
| |
| **Runs 3 and 4:** Added length penalties. -0.05, then -0.30. clipped_ratio |
| stayed 1.0 throughout. |
|
|
| **The discovery:** RL penalty alone cannot break pre-trained verbosity. The |
| model learned to be chatty during pre-training on trillions of tokens. 50 |
| steps of GRPO can't override that. This matches Guide Section 3 exactly β |
| "RL often needs some warm start." |
|
|
| **The fix:** SFT warm-start. 130 steps of supervised fine-tuning on concise |
| one-sentence examples FIRST. Then GRPO on top. |
|
|
| Before SFT: model generated 52-word essays every time. |
| After SFT: model generated 19-word focused responses. |
|
|
| **Run 5 (SFT + GRPO):** Holdout score jumped to 0.343. +55.9% over untrained. |
| One scenario beat the 72B reference model. |
|
|
| --- |
|
|
| ## The results |
|
|
| | Model | Holdout Score | Improvement | |
| |---|---|---| |
| | Qwen 1.5B Untrained | 0.220 | baseline | |
| | GRPO only | 0.271 | +23% | |
| | **SFT + GRPO** | **0.343** | **+55.9%** | |
| | Qwen 72B Reference | 0.436 | ceiling | |
|
|
| Our trained 1.5B reached 78.6% of the 72B model's performance on unseen |
| holdout scenarios. One scenario (deployment domain) scored 0.514 β |
| matching the 72B reference with a model 50x smaller. |
|
|
| --- |
|
|
| ## What I learned β not just about RL |
|
|
| **1. SFT before RL is not optional for behavior change.** |
| We proved this empirically across 4 ablations. The guide says it in Section 3. |
| We had to learn it the hard way. |
|
|
| **2. Log reward components separately.** |
| R_pivot was 0.0 for 4 entire runs. Invisible in the total reward number. |
| Only component-level logging revealed it. |
| |
| **3. Small models + many iterations beats one big run.** |
| 5 training runs on Qwen 1.5B taught us more than one run on a 70B model |
| ever could. Each run revealed something the previous one didn't. |
| |
| **4. Keyword rewards are exploitable.** |
| Agents learn to echo instruction words to score well. Anti-hack filtering |
| fixed it. Impact was measurable. |
| |
| --- |
| |
| ## The bigger lesson |
| |
| I'm going to be brutally honest: I don't know a single line of code. |
| The idea is mine. Claude helped me build it. |
| |
| Two months ago if someone told me I'd be sitting at the Meta Γ HuggingFace |
| Grand Finale next to IIT, BITS Pilani and JP Morgan engineers β |
| I would have laughed. |
| |
| Today I'm here. With a fever and a cold, having run 5 training experiments, |
| having debugged broken reward functions at midnight, having fought through |
| Kaggle dependency hell for 3 hours before switching to Colab. |
| |
| The gap between "has an idea" and "ships something real" is smaller than |
| it's ever been. You don't need to know how to code. You need a problem |
| worth solving and the hunger to figure things out. |
| |
| If I can do it, anyone can. |
| |
| --- |
| |
| *Built at Meta Γ HuggingFace Γ PyTorch OpenEnv Hackathon Grand Finale* |
| *April 25-26, 2026 | Scaler School of Technology, Bangalore* |
| *Grand Finale qualifier from 52,000+ teams.* |