Learning
Všechny články
Engineering13. července 2026 6 min

Přepsat půl milionu řádků svede až kontrolovatelná dekompozice

Jak Bun převedli ze Zigu do Rustu za jedenáct dní pomocí testů jako arbitra

Ne chytřejší agent, ale kontrolovatelné jednotky práce

Jarred Sumner přepsal 535 496 řádků Bunu ze Zigu do Rustu za jedenáct dní. V jednu chvíli běželo 64 instancí Claudu naráz, špička byla 1 300 řádků za minutu, výsledkem 6 502 commitů. Zajímavé číslo tam ale žádné z těchhle není. Zajímavé je, co ten proces drželo, aby se nerozpadl do haldy kódu, který se tváří správně a přitom padá.


Test suite, který nevěděl, v jakém je jazyce

Základ byl existující testovací sada Bunu: zhruba 1,4 milionu asercí v 60 tisících testech, napsaných v TypeScriptu. To je klíč. Testy ověřovaly chování, ne implementaci — bylo jim jedno, jestli pod nimi běží Zig, nebo Rust.

Díky tomu se každá odchylka v přepisu okamžitě zviditelnila jako červený test, ne jako záhadný pád o tři dny později. Testy běžely průběžně na šesti platformách. Sada se stala arbitrem správnosti místo lidského úsudku — a jen proto mohl přepis vůbec fungovat. Kdyby testy sahaly na vnitřnosti, přepis do jiného jazyka by je zneplatnil a nebylo by o co se opřít.


Recenzent, který měl předpokládat, že je kód špatně

Druhý pilíř byl vzor, který stojí za převzetí i mimo AI. Jedna instance psala kód. Oddělené instance viděly jen diff, bez kontextu autora a jeho úvah, s jediným zadáním: předpokládej, že je to špatně.

Chytlo to chyby, které se zkompilovaly a přesto porušovaly kontrakty paměti. Box<uv::Pipe> unikl do asynchronní libuv operace a Rust ho uvolnil dřív, než operace doběhla — use-after-free. Převod záporného časového razítka ztratil znaménko, protože trunc() zaokrouhluje k nule, ne dolů. unwrap_or() s vedlejším efektem počítal hodnotu i tehdy, když nebyla potřeba. Autor s plným kontextem takové věci přehlédne, protože ví, jak to mělo fungovat. Recenzent bez kontextu ne. Model má stejné potvrzovací zkreslení jako člověk; oddělením rolí ho obejdeš.


Chyby kompilátoru jako fronta úkolů

Tým se nesnažil napsat rovnou správný kód. Nechal cargo check vychrlit zhruba 16 000 chyb a ty použil jako prioritizovaný seznam práce. Claude je seskupil podle crate a rozdělil mezi instance: jedna navrhuje opravu, dvě ji adversariálně kontrolují, jedna zapracuje připomínky.

Postup byl stupňovitý — nejdřív aby prošel cargo build, pak bun --version, pak jednotlivé podpříkazy, pak lokální testy, nakonec plné CI. Každá fáze odhalila to, co předchozí minula. Neohraničená složitost se tím proměnila v proud malých, ověřitelných úkolů.


Co si z toho odnést

Poučení není „AI zvládne velké přepisy". Je to, že velký přepis se stane zvládnutelným, když ho rozložíš na jednotky, u kterých jde strojově ověřit, že jsou správně. To ověření musí být nezávislé na implementaci — proto testy chování, ne testy vnitřností. A recenze najde víc, když recenzent nesdílí kontext autora. Tyhle tři věci jsou pravdivé, i když píše kód člověk. Až budeš příště plánovat migraci nebo velký refaktor, zeptej se nejdřív: co je tady arbitr správnosti, a nezávisí náhodou na tom, co zrovna měním.

Poslech místo čtení — 0 zdroje k načtení.