We’re hiring! Join our mission to build the foundation for the agentic world. See Open Roles ->
[
]
Personalizing Inkling for your Code Repository with Post-Training

Abstract
Can an open coding model be post-trained to work better on a specific repository? How do we curate the RL environments and how do we use SFT and RL to improve performance? To answer these questions, we curate coding tasks specialized for a repository and post-train Inkling using SFT and RL. Our post-trained model achieves a significant lift in accuracy on held-out fontTools evaluation coding tasks and also demonstrates good general performance on other benchmarks we did not post-train on.
We use supervised fine-tuning (SFT) with trajectories coming from a strong teacher model, and reinforcement learning (GRPO) on the fontTools specialized environments that we curate. SFT gives a 52% improvement in performance on the held-out fontTools evaluation set. Further RL training lifts the total improvement to 57% compared to the base Inkling model. In addition to the in-distribution evaluation set on fontTools coding tasks, we test our models on Terminal-Bench 2.1 and SWE-Bench Lite. Our experiments show that the post-trained models roughly match the performance of the base Inkling, but become up to 40% more token efficient from post-training.
Introduction
There is growing interest in building specialized and personalized models from proprietary data. Specifically, we focus on improving performance and token efficiency of coding agents on a custom repository. In this blog post, we create training data from a repository (fontTools) using SWE-Smith techniques, and post-train Inkling to show significant performance and token efficiency gains in the target codebase, while still retaining generally good performance.
Methodology and experimental setup
Repository environments and tasks
For supervised fine-tuning, we create a fontTools task set with 58 tasks for supervised training and 10 held-out tasks for in-repository evaluation. Each task contains a pinned repository state, an injected defect, a task instruction, and a grader that checks whether the intended repair holds under the repository test suite. As one would hope, the held-out set never enters either training stage.
Our tasks are designed to be especially challenging for the model: we present a bug to the model - but also add a second soft bug whose location isn’t explicitly mentioned to the agent, but can be discovered in the environment. In order to pass the task, the model, like a good software engineer, has to solve both bugs successfully.
We also create 10 SQLGlot tasks in the same SWE-smith-style format. SQLGlot is an unseen repository: its tasks, trajectories, patches, and rubrics are excluded from both SFT and RL. We use these tasks to answer the question: does any behavior from fontTools transfer to a new, unseen repository?
Supervised fine-tuning
For SFT, we use a strong teacher model (Claude Opus 4.8) to solve the set of 58 tasks we engineer for supervised fine-tuning. Across the 58 tasks, we generate 146 successful trajectories - with some tasks having 1, 2, or 3 trajectories from the teacher model.
Reinforcement learning with GRPO
Our RL training begins from the SFT checkpoint, not from the base model. Our goal, through RL, is to improve performance and token efficiency. To achieve this, we use rubric-guided Group Relative Policy Optimization. We engineer a set of 14 rubrics contributing to the RL reward, each designed to improve the model's efficiency through targeted reasoning and planning. We layer these rubrics on top of a set of 92 new tasks on fontTools, which we curate in a similar style to the previous ones and use exclusively for RL. Through RL, we seek two improvements: improvement in performance, coupled with improved token efficiency.
Evaluation protocol
For our evaluation, we run 10 rollouts per task, across 10 tasks each derived from fontTools(in-distribution) and SQLGlot(out-of-distribution). The model has never been exposed to any of these tasks in its prior training. We report pass rate and mean output tokens per scheduled rollout. Terminal-Bench 2.1 and SWE-bench Lite provide a broader check on whether the specialized model preserves general coding performance while maintaining its token efficiency capabilities.
To test the model’s performance as it is tested in a day-to-day use case, we use the model’s default (0.9) effort setting. We benchmark the model across Terminal-Bench 2.1 and SWE-bench Lite, and see scores comparable to those reported with the same setup by Artificial Analysis, using the Terminus2 harness.
Results

Mean pass rate ± one standard error.
In-distribution Repository
On the 10 fontTools evaluation tasks, base Inkling passes 0 of 100 fontTools attempts. SFT passes 52 of 100. SFT + RL passes 57 of 100, a five percent improvement over SFT and a 57-point improvement over the base model.

Held-out fontTools under the ordinary fix-it prompt: 10 tasks × 10 graded attempts.
Out-of-distribution Benchmarks
Apart from the 10 evaluation tasks derived from fontTools, we also evaluate the base, SFT, and SFT + RL versions of Inkling on 3 other evaluations. Our first out-of-distribution evaluation is through 10 SWE-Smith style tasks, similar to the 10 fontTools tasks, but derived from the SQLGlot repository - a repository the model has not seen through our post-training. Prior to SFT, the base Inkling scores 0% on these 10 tasks, with 10 rollouts per task. After SFT, the model jumps to 49% in performance, reaching 54% after RL. From SFT to RL, the model uses, on average, 13.7% fewer tokens. We then run the model on Terminal-Bench 2.1. Here, SFT makes the model 1.1% better in performance, and RL makes the model 2.7% better versus base Inkling. However, the significant shift we notice is in token efficiency. After SFT, the model uses 44.1% fewer tokens - a reduction RL matches as well. Our third out-of-distribution evaluation is on SWE-Bench Lite. After SFT, we see a 0.5% decrease in performance (which falls under the standard error). However, similar to our observations from Terminal-Bench 2.1, the model after SFT uses 26.9% fewer tokens. After RL, the model uses 34.9% fewer tokens than the base model, and 10.9% fewer than the SFT model. In addition, the RL model's performance jumps by 3.1% versus the base, and 3.6% versus the SFT model.
Evaluation
Evaluation | Pass rate: Inkling / SFT / SFT + RL | Output tokens: Inkling / SFT / SFT + RL |
|---|---|---|
Terminal-Bench 2.1 | 35.7% / 36.8% / 38.4% | 19,031 / 10,631 / 10,534 |
SWE-bench Lite | 53.6% / 53.1% / 56.7% | 9,753 / 7,126 / 6,350 |
SWESmith · fontTools | 0.0% / 52.0% / 57.0% | 4,992 / 4,928 / 4,887 |
SWESmith · SQLGlot | 0.0% / 49.0% / 54.0% | 4,819 / 8,254 / 7,127 |

Mean output tokens per scheduled rollout. Each SWESmith setting contains 100 ordinary-prompt attempts.
Benchmark tables
The four tables below showcase the key findings from all three versions of Inkling we evaluate. In addition to tracking pass rate for performance, and output tokens for token efficiency, we add other metrics to view model efficiency.
Terminal-Bench 2.1
fixed 86-task cohort · three samples for Inkling and SFT · Typhoon · 8,000-token limit
Metric | Inkling | Inkling + SFT | Inkling + SFT + RL |
|---|---|---|---|
Average pass rate | 35.7% | 36.8% | 38.4% |
Run SD / avg@3 SE | 4.7 / 2.7 pp | 1.3 / 0.8 pp | 3.5 / 2.0 pp |
Task-clustered pass SD / SE | 39.2 / 4.2 pp | 42.2 / 4.5 pp | 48.6 / 5.2 pp |
Average output tokens | 19,031 | 10,631 | 10,534 |
Task-clustered token SD / SE | 16,221 / 1,749 | 7,502 / 809 | 7,434 / 802 |
Average tokens · successful | 10,719 | 6,822 | 6,986 |
Average tokens · failed | 23,638 | 12,851 | 12,744 |
Average turn count | 40.5 | 46.7 | 45.3 |
Task-clustered turn SD / SE | 29.1 / 3.1 | 29.5 / 3.2 | 28.6 / 3.1 |
Average shell turns | 45.2 | 56.6 | 55.6 |
Average pytest runs | 0.101 | 0.081 | 0.070 |
SWE-bench Lite
fixed 300-task cohort · three samples for Inkling and SFT · Typhoon · 8,000-token limit
Metric | Inkling | Inkling + SFT | Inkling + SFT + RL |
|---|---|---|---|
Average pass rate | 53.6% | 53.1% | 56.7% |
Run SD / avg@3 SE | 2.0 / 1.2 pp | 3.7 / 2.1 pp | 3.0 / 1.7 pp |
Task-clustered pass SD / SE | 42.9 / 2.5 pp | 42.7 / 2.5 pp | 49.5 / 2.9 pp |
Average output tokens | 9,753 | 7,126 | 6,350 |
Task-clustered token SD / SE | 9,041 / 522 | 4,647 / 268 | 4,140 / 239 |
Average tokens · successful | 7,844 | 5,754 | 5,602 |
Average tokens · failed | 11,955 | 8,680 | 7,328 |
Average turn count | 39.9 | 53.4 | 48.1 |
Task-clustered turn SD / SE | 26.8 / 1.5 | 29.0 / 1.7 | 26.1 / 1.5 |
Average shell turns | 40.7 | 56.2 | 51.0 |
Average pytest runs | 1.163 | 3.768 | 3.630 |
Output tokens are the primary efficiency measure in this cross-repository comparison; shell, turn, and pytest counts remain supporting behavioral diagnostics.
SWESmith · fontTools
ordinary fix-it prompt · 10 held-out tasks × 10 graded attempts
Metric | Inkling | Inkling + SFT | Inkling + SFT + RL |
|---|---|---|---|
Average pass rate | 0.0% | 52.0% | 57.0% |
Average output tokens | 4,992 | 4,928 | 4,887 |
Average tokens · successful | — | 3,897 | 4,329 |
Average tokens · failed | 4,992 | 6,115 | 5,619 |
Average full-suite runs | 0.040 | 2.545 | 2.495 |
Average turn count | 19.520 | 38.929 | 37.021 |
Average shell turns | 17.940 | 41.980 | 39.959 |
Average pytest runs | 2.690 | 7.808 | 7.505 |
SWESmith · SQLGlot
ordinary fix-it prompt · 10 held-out tasks × 10 graded attempts
Metric | Inkling | Inkling + SFT | Inkling + SFT + RL |
|---|---|---|---|
Average pass rate | 0.0% | 49.0% | 54.0% |
Average output tokens | 4,819 | 8,254 | 7,127 |
Average tokens · successful | — | 8,200 | 7,879 |
Average tokens · failed | 4,819 | 8,307 | 6,205 |
Average full-suite runs | 0.000 | 4.909 | 4.031 |
Average turn count | 27.830 | 70.788 | 60.847 |
Average shell turns | 72.050 | 176.040 | 144.173 |
Average pytest runs | 2.630 | 12.212 | 9.959 |
Analysis and discussion
We train the model on fontTools coding tasks. After SFT, the pass rate on held-out fontTools tasks goes from 0% to 52%, and RL raises it to 57%. These improvements show that post-training achieves its objective of personalizing the model.
Then, we evaluate the same checkpoints on SQLGlot, a different coding repository. We emphasize that none of the SQLGlot tasks, trajectories, patches, or rubrics have been used in our post-training. As before, the base model scores 0% while the SFT model scores 49%.
So the interesting finding is that training on one repository also produces a significant lift in another.
One possible explanation is that the model learns general tricks for repairing software bugs. The teacher trajectories do not just contain facts about fontTools but show how to enter an unfamiliar repository, search for the relevant code, understand the local abstractions, make a change, run tests, and continue when the first attempt fails. Those are repository-independent skills that can be learned by SFTing on strong trajectories.
The alternative explanation is that both evaluation sets have the same structure as the coding tasks we curate. The post-trained model may become better at fixing the specific types of defects that our curation method constructs. This is a narrower benefit, and we plan to perform additional research ablations to study this more.
A second result is less dramatic but equally clear: SFT does most of the work. The 146 successful trajectories we use for SFT move performance on fontTools from 0% to 52% and SQLGlot from 0% to 49%. RL adds five percentage points on each. SFT teaches the model the main behavior, while RL helps refine it.
The token efficiency results tell a similar story. On Terminal-Bench, SFT cuts average output tokens by 44.1%, and RL retains essentially the same token use. On SWE-bench Lite, SFT cuts output tokens by 26.9%, while RL increases the reduction to 34.9%. On SQLGlot, RL uses 13.7% fewer tokens than SFT while solving more tasks.
But “fewer tokens” is not always the same as “more efficient.” The base model produces the shortest SQLGlot trajectories and solves nothing: giving up is extremely token-efficient. What matters is whether a model can use fewer tokens while preserving or improving its probability of success. By that definition, RL still succeeds across all benchmarks - improving either performance, token efficiency, or both, without any regression.
We start with a repository-specialization question: can post-training make an open model great at working on one codebase? The answer is a clear "yes." But the experiment leaves us with a more interesting question: why does training on one codebase make the model better on another?
The next version of this experiment should use more repositories and, critically, more diverse tasks. If the transfer benefits survive that test, then repository-specific post-training may be less repository-specific than its name suggests.
Limitations and conclusion
The post-training we do is not representative of the results of post-training in general. We target improvement in only one repository - and manage to see improvement across other environments as well. We do not claim that our Inkling + SFT + RL model is efficient in every use case; however, it proves more efficient versus the base in evaluations that are critical for coding agents and relate to this post's original question.
Within those limits, the answer to the original practical question is yes. Creating executable, repository-specific repair tasks; using strong teacher trajectories for SFT; and applying targeted RL produces a model that is substantially more successful on held-out fontTools tasks. The same model retains similar observed performance on broader benchmarks while using fewer tokens, and RL adds an efficiency-and-outcome improvement on unseen SQLGlot. The next question is how far this recipe transfers across languages, test frameworks, and repository sizes.
Citation
If you use this work, please cite it as:
References
Yang, J. et al. SWE-smith: Scaling Data for Software Engineering Agents. 2025.
Jimenez, C. E. et al. SWE-bench: Can Language Models Resolve Real-World GitHub Issues?. ICLR, 2024.
Shao, Z. et al. DeepSeekMath: Pushing the Limits of Mathematical Reasoning in Open Language Models. 2024. Introduces GRPO.
Share