4.1 Savanna: \tl_set:Ne MTaC Savanna, our Model Factory, is our implementation of \tl_set:Ne MTaC. Savanna implements the Kolibri training recipe end to end and provides the framework for experimenting with it. Savanna owns the orchestration of the Kolibri pre- and post-training runs and their resumes, ablations and sweeps, checkpointing and model merging, evaluation, lineage, abstractions over clusters and storage, artefact retention, and declarative model releases. 4.1.1 Core Abstractions Savanna runs are declarative. A single TOML file describes a pre- or post-training run and its evaluation strategy end to end. The following is a simplified example of our Kolibri medium-scale pre-training recipe on main : ⬇ model_architecture_config = " kolibri_ablation_scale_m " gpu_count = { a100 = 256, h100 = 128, b200 = 64 } training_steps = 10342 dataset = " pre - training - mix : v9 " tokenizer = " kolibri - tokenizer : v14 " checkpoint_interval = 100 intermediate_eval_interval = 1000 intermediate_eval_merge_window = 4 [ pre . eval ] benchmarks = [ { name = " mmlu_bpb "}, { name = " gsm8k_de_bpb ", num_fewshot = 8}, ] [ mid . train ] # … Behind this declarative interface is the pipeline code, which composes a number of core abstractions that absorb accidental complexity. Savanna’s Checkpoint abstraction encapsulates the storage, retention, versioning, lineage and format conversion ( \tl_set:Ne DCP/ \tl_set:Ne HF) of model checkpoints. Consuming or producing a Checkpoint connects its lineage, so users and their agents can navigate from a checkpoint to the configuration and commit that produced it, the datasets it was trained on, and its evaluation results. Benchmarks range from static question sets to agentic environments, where the model acts over many turns with tools in a sandbox. Each needs its own evaluation backend, inference settings, model deployment, scoring and aggregation. Savanna’s Benchmark abstraction encapsulates these together with the storage and lineage of the results, so users declare the benchmarks they are interested in and Savanna reports the scores. While a run trains, Savanna registers each intermediate checkpoint as it appears, merges it with the preceding checkpoints of the configured window, and evaluates the result. This gives us signal over time, and the early signal lets us save GPU hours by stopping runs that are not promising. We operate multiple GPU clusters, each with different hardware and software stacks, and we want to run the same recipe on all of them. Savanna’s Cluster abstraction encapsulates the differences in GPU type, workload manager, storage systems, and other cluster-specific details, so a user only needs to name the cluster they want to run on when they dispatch their job. To improve the Kolibri recipe, we run experiments, which are programmatic invocations of (subsets of) the pipeline with customisations. We merge the learnings from an experiment into main , making them part of subsequent Kolibri iterations. 4.1.2 Continuous Integration With everyone iterating on the same codebase, main has to work at all times, so that anyone can branch off it, run an experiment and expect it to succeed. A conflict between two changes surfaces only when they are integrated, and the cost of resolving it grows with the size of both, so we practise trunk-based development and land changes on main often and in small increments ( Fowler, 2020 ) with targeted testing. Every night, our Model Factory trains and evaluates a small model end to end. This catches regressions in the training or evaluation codebases, which are versioned dependencies of Savanna that automation bumps throughout the day as they release; a bump of the training codebase also runs training-specific tests before it merges. 4.1.3 Infrastructure A user dispatches a training job from their branch, in which they have defined their experiment. The job submits an execution to Flyte ( Flyte Contributors, 2026 ) , a Kubernetes-native workflow engine with durable execution, retries, caching and a UI to visualise runs. Every job pins versions of the code and of its artefacts (data, checkpoints, tokenisers), which we store immutably in a registry, so runs are hermetic. Our primary clusters run on Kubernetes for its flexibility, modularity and ecosystem. We use Kueue ( Kubernetes SIG Scheduling, 2026 ) for priority-based queueing and topology-aware scheduling to ensure jobs land within a single InfiniBand domain. We observe cluster state, job status and logs, queue load and storage pressure via Grafana. As with our pipeline, our clusters are managed as code. 4.1.4 Agents in the Pipeline Agents increasingly write the code and run the experiments behind Kolibri. To contribute, they need visibility into the state of training, a bounded space of actions they can take unsupervised, and measurable objectives to hill climb, each of which \tl_set:Ne MTaC provides. Visibility follows from every experiment being code pushed to the repository: agents see what is running and can trace it to the code that defines it and the reasoning behind that code. Given the lineage, logs and metrics the factory exposes, and instructions written for them, agents autonomously review proposed experiments and triage failed runs. To bound the action space, the factory wraps storage, clusters and registries in abstractions that only permit safe operations, so researchers and agents can act freely within these limits. The registry, for instance, adds new artefact versions but never modifies existing ones ( Section 4.1.3 ), and launches on a cluster can be gated by an independent review agent. These bounds let agents act with growing autonomy. Objectives are quantities we define across experiments, which agents then hill climb. An example is GPU utilisation in evaluation: we deploy hundreds of models each week, each experiment with its own benchmarks and inference settings. This heterogeneity leaves room for idle GPUs, slow start-up and failed requests. Agents monitor these deployments, trace inefficiencies and propose fixes. Agents working on the pipeline also encounter limitations that can go unnoticed when they act autonomously, such as instructions that fall short, steps they have to work around or known compromises they have to make. They either report these limitations as issues in the factory’s repository, or mark them with # XXX comments in the code, leaving hints for future agents to pick up and hence steering how the factory evolves. Agents also analyse their own failures and propose changes to their instructions and harnesses that improve accuracy and reduce time and cost. Through these loops, experiments on Kolibri also improve the factory.