Home › Blog › Frontier Lab Engineering — Idea to Merged PR
Frontier Lab Engineering Practicum · Article 8 of 9 🔀

Shipping an Experiment From Idea to Merged PR

Every article in this series so far has taken one slice of frontier-lab engineering in isolation: writing the code, requesting the compute, debugging a failure, optimizing a kernel, surviving on-call, working across teams. Nothing in the job actually happens in isolation. This article walks one realistic experiment end to end — from a research idea to a merged pull request — showing exactly where each of those seven pieces shows up along the way, and how they compound into a single lived experience.

FL
FrontierAGI Team

The Whole Job, in One Pass

Seven articles in this series each answered a narrow question well: how do you read production training code, what happens when a distributed job won't converge, how does compute get allocated, when do you write a custom kernel, what does on-call feel like, how do you work with other teams' code. In reality, a single meaningfully-sized experiment touches almost all of these in sequence, usually within the span of one to three weeks. This article is deliberately structured as a single realistic timeline rather than another set of independent parts, because the compounding — not any one piece — is the actual skill this whole series has been building toward.

7 Prior articles' concepts that show up in a single realistic experiment lifecycle
1–3 Weeks a typical meaningfully-sized experiment takes from idea to merged PR
1 Merged PR — the only artifact that actually counts as "shipped"
Part 1 — The Idea

A Hypothesis, Not Just a Notion

The experiment: a research engineer suspects a specific change to the data-mixing ratio between two training corpora will improve downstream evaluation performance without hurting training stability. Before any code changes, the idea is written up as a falsifiable hypothesis with a specific, cheap first test — following Article 3 of this series' instinct to isolate before scaling: run the change on a small model and short training run first, and only commit larger compute (Article 4) once the small-scale signal looks real.

Part 2 — Writing the Code

A New Config, Not a New Training Loop

Following Article 2 of this series directly, the change is implemented as a new configuration override on top of the shared base config — a new data-mixing ratio parameter — rather than a fork of the training loop itself. This is what makes the experiment mergeable at all: a config-only change is trivially reviewable and diffable, while a training-loop fork would immediately trigger the exact code-divergence problem Sculley et al.'s paper warns about, and would need to be reconciled with the shared loop before it could ever be merged.

Part 3 — Requesting Compute

Right-Sizing the Ask

Per Article 4, the small-scale validation run is requested on a modest quota, quick-turnaround queue rather than the team's premium reserved capacity — the hypothesis hasn't earned that budget yet. Only after the small run shows a real, reproducible signal does the engineer request a larger allocation, and even then on spot/preemptible capacity with proactive checkpointing (Article 4, Part 4's etiquette), since a mid-scale validation run can tolerate an occasional restart in a way a final release candidate could not.

Part 4 — Launch and Debug

When the First Launch Doesn't Just Work

The larger run fails to start on the first attempt — a environment mismatch between the small-scale and larger-scale launch configs. Article 3's "won't start" triage category applies directly: the fix is in environment and scheduling, not in the model or the data-mixing logic itself, and confirming that distinction in the first few minutes avoids a wasted afternoon debugging the wrong layer. Once running, loss curves are sane but a second issue surfaces: aggregate GPU utilization looks fine, but Article 4's Model FLOPs Utilization metric is unexpectedly low — tracing it to a data-loading bottleneck introduced by the new mixing logic, not a compute problem at all.

Idea Config diff Small run Debug + fix Full run PR
The realistic path — rarely a straight line, always circling back to debug and validate before the final run.
Part 5 — Monitoring the Run

Watching Without Staring

With the fix deployed, the full-scale run is launched with alerting configured per Article 6's discipline — a page only for genuinely actionable conditions (loss divergence, node failure), a dashboard for everything else, avoiding the alert-fatigue trap while still catching a real failure quickly if one occurs overnight. The engineer is not paged during this run; the multi-day training completes cleanly, which is itself worth noting as the unremarkable, desired outcome of Article 6's entire framework.

Part 6 — Review and Merge

Turning Results Into a Mergeable Change

With results in hand, the actual code change (still just the config diff from Part 2, plus a small data-loading fix from Part 4) is opened as a pull request. Article 1's blast-radius principle applies directly to review depth: the config diff itself is narrow and low-risk, but the data-loading fix touches a shared utility another team also depends on — triggering exactly the cross-team etiquette from Article 7, where the owning team is looped in before the fix merges, not after, and the PR description explains the motivating experiment so the reviewer has real context rather than just a diff.

1
The PR description carries the hypothesis and the result, not just the code — a reviewer approving blind to the "why" is reviewing less carefully.
2
Shared-code changes get the owning team's eyes before merge, regardless of how small the diff looks.
3
The experiment's compute cost is stated honestly in the writeup — Article 4's "not wasting a GPU-hour" ethic extends to reporting the cost, not just the result.
Part 7 — The Full Timeline

Every Article, in One Experiment

StageSeries Concept Applied
Forming the hypothesisCheap validation before scaling (Article 3's triage instinct)
Writing the changeConfig-only diff on the shared loop (Article 2)
Requesting computeRight-sized, spot-first, checkpointed (Article 4)
First launch failsWon't-start vs. won't-converge triage (Article 3)
Low MFU discoveredUtilization ≠ activity (Article 4, echoing a kernel-level bottleneck question from Article 5)
Full run monitoredCalibrated alerting, no unnecessary pages (Article 6)
PR opened and mergedBlast-radius review depth and cross-team etiquette (Articles 1 and 7)

Readiness Checklist

1
Can you trace a hypothetical experiment idea through all seven prior articles' concepts, the way this article just did?
2
Have you ever validated a change cheaply before committing full-scale compute to it?
3
Does your own PR writeup habit include the "why" and the result, or just the diff?
4
Can you name the single most common place your own experiments actually get stuck between idea and merge?

⚠️ What's Missing or Uncertain

This is one illustrative experiment, not a universal template. Real experiments vary enormously in scope — some never need custom compute negotiation, some never touch another team's code at all. The value here is the compounding pattern, not a checklist to follow verbatim; a two-day experiment and a two-month one both draw on the same underlying skills in different proportions.

Where This Series Goes Next

Article 9, the capstone of this series, steps back from any single experiment to describe a full week in the life of a research engineer — showing how these pieces interleave with meetings, other people's incidents, and the ordinary unpredictability of a real job, not just one clean linear story.

🎥 Recommended Videos

🧭 Closing — The Job Is the Sequence, Not Any One Step

🎯 The Bottom Line
No single article in this series describes "the job" — this one comes closest, precisely because it shows how a falsifiable hypothesis, a config-only diff, a right-sized compute request, a debugging detour, calibrated monitoring, and a cross-team-aware review all have to work together, in sequence, for one experiment to become one merged PR. The engineers who ship reliably aren't the ones who are best at any single piece — they're the ones who move through all seven smoothly enough that the whole sequence feels routine rather than like seven separate fires to fight.