Skip to content
HN On Hacker News ↗

Ornith-1.0: Self-Scaffolding LLMs for Agentic Coding

▲ 86 points 10 comments by kordlessagain 2w ago HN discussion ↗

Pangram verdict · v3.3

We believe that this document is primarily human-written, with some AI-generated content detected

20 %

AI likelihood · overall

Mixed
81% human-written 19% AI-generated
SEGMENTS · HUMAN 7 of 8
SEGMENTS · AI 1 of 8
WORD COUNT 1,125
PEAK AI % 77% · §3
Analyzed
Jun 29
backend: pangram/v3.3
Segments scanned
8 windows
avg 141 words each
Distribution
81 / 19%
human / AI fraction
Verdict
Mixed
Pangram v3.3

Article text · 1,125 words · 8 segments analyzed

Human AI-generated
§1 Human · 7%

Aloha! 🌺 Today, we are introducing Ornith-1.0, a self-improving family of open-source models specially for agentic coding tasks. Ornith-1.0 spans the full spectrum, from compact 9B Dense models suitable for edge device deployment to 397B MoE frontier-scale models optimized for maximum performance, with variants including 9B Dense, 31B Dense, 35B MoE, and 397B MoE. Built on top of pretrained Gemma 4 and Qwen 3.5, it achieves state-of-the-art performance among open-source models of comparable size on coding benchmarks. The key innovation behind Ornith-1.0 is a self-improving training framework. Instead of relying on human-designed harnesses to drive solution generation in RL, Ornith-1.0 learns to generate both solution rollouts and the task-specific harnesses that guide those rollouts. By jointly optimizing the scaffold and the resulting solution, the model can discover better search trajectories and generate higher-quality solutions. Ornith-1.0 achieves state-of-the-art performance among open-source models of comparable size across a broad range of agentic coding benchmarks: Ornith-1.0-397B (77.5 on Terminal-Bench 2.1 and 82.4 on SWE-Bench Verified) matches the performance of Claude Opus 4.7 (70.3 on TB-2.1 and 80.8 on SWE-Bench Verified) and outperforming leading open-source models of similar size, including MiniMax M3 (66.0 on TB-2.1 and 80.5 on SWE-Bench Verified) and DeepSeek-V4-Pro (67.9 on TB-2.1 and 80.6 on SWE-Bench Verified).

§2 Human · 16%

Ornith-1.0-9B, which can be easily deployed on edge devices, matches or exceeds the performance of much larger models such as Gemma 4-31B and Qwen 3.6 35B. At the flagship scale, Ornith-1.0-397B achieves 77.5 on Terminal-Bench 2.1 and 82.4 on SWE-Bench Verified, surpassing Claude Opus 4.7 on both benchmarks and outperforming leading open-source models of similar size, including Minimax M3 and DeepSeek-V4-Pro. Ornith-1.0-35B significantly outperforms similarly sized models, including Qwen 3.5-35B, Qwen 3.6-35B, and Gemma 31B. Despite having only 35B parameters, it even surpasses Qwen 3.5-397B on Terminal-Bench 2.1 (64.4 vs. 53.5) while matching its performance across several other coding and agentic benchmarks. The edge-deployable Ornith-1.0-9B also delivers remarkably strong results, achieving 43.1 on Terminal-Bench 2.1 and 69.4 on SWE-Bench Verified. Despite being a compact 9B-parameter model, it matches or exceeds the performance of much larger models such as Gemma 4-31B, demonstrating that strong agentic coding capabilities can be achieved even in resource-efficient deployments.

A Self-improving Strategy for LLM Training At the core of Ornith-1.0 is a self-improving training framework that jointly learns to solve tasks and to construct the scaffolds that guide those solutions.

§3 AI · 77%

Rather than relying on a fixed, human-designed harness shared across a task category, Ornith-1.0 treats the scaffold as a learnable object that co-evolves with the policy. Each RL step proceeds in two stages: conditioned on a task and the scaffold previously used for it, the model first proposes a refined scaffold; conditioned on that scaffold and the task description, it then generates a solution rollout. Reward from the rollout is propagated to both stages, so the model is optimized not only to produce better answers but to author the orchestration that elicits them. Repeated over training, this yields a feedback loop in which scaffolds are continually mutated and selected toward those that induce higher-reward trajectories, allowing per-task-category strategies to emerge automatically and driving sustained capability gains without hand-engineered harness design.

Addressing Reward Hacking in Self-improvement Allowing the model to author its own scaffold naturally introduces the reward-hacking issue. A self-generated scaffold can learn to satisfy the verifier without performing the task: reading the visible test files and hardcoding the expected artifacts, such as touching the checked-for file or writing the literal expected output, or copying an oracle solution present in the environment. We defend against this in three layers. First, we fix the outer trust boundary: the environment, the tool surface, and test isolation are immutable and outside the model's reach, so the model evolves only the inner policy scaffold: its memory, error-handling, and orchestration logic. Second, a deterministic monitor enforces that boundary at the level it can be specified exactly, flagging any attempt to read withheld paths, modify verification scripts, or invoke actions outside the sanctioned tool surface, and assigning such trajectories zero reward with exclusion from the advantage computation. Third, because intent-level gaming can occur entirely within the allowed tool surface, a frozen LLM judge acts as a veto on top of the verifier rather than the primary reward.

§4 Human · 15%

Asynchronous RL Training For RL training, to address the off-line policy problem for long rollouts, Ornith-1.0 adopts the pipeline-RL strategy. To control the effect of earlier generated off-policy tokens, we apply a staleness weight \(w(d_t)\) that downweights tokens according to their age \(d_t\) and drops them entirely once a threshold is exceeded: \[ w(d_t)= \begin{cases} \!1, & \text{if } d_t \le K_1,\\ \!\exp\!\bigl(-\lambda(d_t-K_1)\bigr), & \text{if } K_1 < d_t \le K_2,\\ \!0, & \text{if } d_t > K_2. \end{cases} \] The token-level GRPO loss is weighted as follows: \[ L_t=\min\!\bigl(r_t A_t,\; \mathrm{clip}(r_t,1-\epsilon^{-},1+\epsilon^{+})A_t\bigr)\cdot w(d_t), \] where \[ r_t= \frac{\pi_{\theta}(y_t \mid x, y_{<t})} {\pi_{\theta_t^{\mathrm{beh}}}(y_t \mid x, y_{<t})} \]

Full Table Benchmark Ornith-1.0-397B Qwen3.5-397B Qwen3.7-Max GLM-5.2-744B Minimax-M3-428B DeepSeek-V4-Pro-1.6T Claude Opus 4.7 Claude Opus 4.8 Terminal

§5 Human · 1%

Bench 2.1 (Terminus-2) 77.5 53.5 73.5 81.0 64 64 70.3 85 Terminal Bench 2.1 (Claude Code) 78.2 48.6 69.8 82.7 - 66.5 69.7 78.9 SWE-Bench Verified 82.4 76.4 80.4 - - 80.6 80.8 87.6 SWE-Bench Pro 62.2 51.6 60.6 62.1 59 55.4 64.3 69.2 SWE-Bench Multilingual 78.9 69.3 78.3 - - 76.2 - - NL2Repo 48.2 36.8 47.2 48.9 42.1 - - 69.7 ClawEval Avg 77.1

§6 Human · 1%

70.7 65.2 - - 75.8 78.2 - SWE Atlas - QnA 41.2 20.4 - - 37.9 27.2 40.3 48.8 SWE Atlas - RF 42.6 18.4 - - - - 48.6 46.7 SWE Atlas - TW 39.1 18.5 - - 30.8 - 38.5 -

Benchmark Ornith-1.0-35B Qwen3.5-35B Qwen3.6-35B Gemma4-31B Qwen3.5-397B Terminal Bench 2.1 (Terminus-2) 64.2 41.4 52.5 42.1 53.5 Terminal Bench 2.1 (Claude Code) 62.8 38.9 49.2 - 48.6 SWE-Bench Verified 75.6 70 73.4 52 76.4 SWE-Bench Pro 50.4 44.6 49.5 35.7 51.6 SWE-Bench

§7 Human · 1%

Multilingual 69.3 60.3 67.2 51.7 69.3 NL2Repo 34.6 20.5 29.4 15.5 36.8 ClawEval Avg 69.8 65.4 68.7 48.5 70.7 SWE Atlas - QnA 37.1 13.2 15.5 - 20.4 SWE Atlas - RF 29.7 10.2 11.4 - 18.4 SWE Atlas - TW 27.8 9.8 13.3 - 18.5

Benchmark Ornith-1.0-9B Qwen3.5-9B Qwen3.5-35B Gemma4-12B Gemma4-31B Terminal Bench 2.1 (Terminus-2) 43.1 21.3 41.4 21

§8 Human · 4%

42.1 Terminal Bench 2.1 (Claude Code) 40.6 18.9 38.9 - - SWE-Bench Verified 69.4 53.2 70 44.2 52 SWE-Bench Pro 42.9 31.3 44.6 27.6 35.7 SWE-Bench Multilingual 52 39.7 60.3 32.5 51.7 NL2Repo 27.2 16.2 20.5 10.3 15.5 ClawEval Avg 63.1 53.2 65.4 32.5 48.5 SWE Atlas - QnA 17.9 9.2 13.2 - - SWE Atlas - RF 16.6 4.3 10.2 - - SWE Atlas - TW 15.3 4.4 9.8 - -

Footnote Terminal-Bench 2.1 (Terminus-2): We evaluate Terminal-Bench 2.1 using the Harbor/Terminus-2 framework with parser=json, temperature=1.0, top_p=1.0, and a 128K context window.