Kielten rekursiivinen itseparannus: koodiälyn hiominen noin 280 kielessä
> Tuemme koodiälyä noin 280 kielelle. Kukaan ihminen ei pysty auditoimaan sitä käsin. Siksi rakensimme kielten rekursiivisen itseparannussilmukan — pistokoe, LLM tuomarina, korjaa yksi asia, validoi uudelleen — ja ajamme sitä eristettyjen agenttien parvella, kunnes poiminta on todella oikein, ei vain vihreä.
Tämän postauksen luvut heijastavat järjestelmää julkaisuhetkellä (toukokuu 2026). Katso tiimisivumme ajantasaiset luvut.
Maguyva poimii symboleita, viittauksia ja riippuvuusgraafin lähdekoodista noin 280 kielessä. Jokainen kieli on räätälöity tree-sitter-käsittelijä — kyselyt, heuristiikat, reunatapaukset — ja jokainen käsittelijä voi olla hienovaraisesti väärässä omalla tavallaan. Metodikutsu, joka on merkitty luvuksi. Funktio, joka on liitetty väärään ympäröivään laajuuteen. Suhde, jota ei yksinkertaisesti ole olemassa.
Sitä ei voi auditoida käsin. Mikään tiimi ei pysty lukemaan poimintatulosteita 280 kieliopin yli ja havaitsemaan huonoja reunoja. Joten kiinnostava kysymys ei ole “onko poimintamme oikein” — se on “miten otat selvää, että se on väärin, tässä laajuudessa, ilman ihmistä jokaisessa silmukassa”. Vastauksemme on kielten rekursiivinen itseparannus: laatusilmukka, jota ajavat kieliagentit, LLM tuomarina, ja yksi sääntö, jonka opimme yhä uudelleen: vihreä ei ole sama kuin oikein.
Vihreä ei ole oikein
Jokaisella kielellä on fixture-sarja, ja julkaisuportti pisteyttää sen viidellä ulottuvuudella — tarkkuus, rakenteellinen eheys, kattavuus, laatu ja suorituskyky. Kieli menee VIHREÄKSI vain, kun sen fixtureilla precision ≥ 0.95, recall ≥ 0.99 ja F1 ≥ 0.97, vähintään 20 odotetulla reunalla tilastollista luottamusta varten. Sen alapuolella se on KELTAINEN tai PUNAINEN, eikä sitä julkaista.
Tuo portti on välttämätön muttei riittävä. Fixturet validoivat vasten fixtureita, jotka me itse kirjoitimme. Ne koodaavat tapaukset, jotka jo keksimme. Käsittelijä voi olla virheetön fixtureillaan ja silti sotkea kuvion, joka näkyy vain oikeassa koodissa — makro-idiomi, geneerisesti rajoitettu metodi, kielipiirre, jolle kukaan ei kirjoittanut fixturea. VIHREÄ tarkoittaa, että fixturet menevät läpi. Se ei tarkoita, että oikea repositorio poimitaan siististi. Joten silmukan täytyy jättää fixturet taakseen ja katsoa villiin.
Sisäsilmukka: pistokoe, tuomari, korjaa, todista
Ydinsilmukka ajaa yhtä kieltä kerrallaan:
┌──────────────────────────────────────────────────────────┐
│ │
▼ │
1. corpus run ── clone real-world repos, extract relationships │
│ │
▼ │
2. spot-check 100 edges (seed 42, then seed 123 to cross-check) │
│ │
▼ │
3. LLM judge classifies every sampled edge: │
CORRECT · FALSE_POSITIVE · TYPE_ERROR · │
SCOPE_ERROR · METADATA_ERROR │
│ │
▼ │
4. fix ONE thing — handler .py, .scm query, or config │
│ │
▼ │
5. re-validate — F1 + re-classify + manifest diff (no regressions)│
│ │
better? ──no──► revert, try a different fix ────────────────────┤
│ yes │
▼ │
6. promote the fix into fixtures (a permanent regression guard) ──┘
Muutama asia saa tämän toimimaan sen sijaan että se rimpuilisi paikallaan.
Tuomari on agentti, ei API-kutsu. Kun sanomme “LLM tuomarina”, tarkoitamme, että kieliagentti itse lukee jokaisen otetun reunan todellista lähdekoodia vasten ja luokittelee sen kiinteällä viisikategorisella luokitusperusteella: onko tämä reuna oikea, väärä positiivinen, oikea suhde väärällä tyypillä, kiinnitetty väärään laajuuteen vai kantaako se väärää metadataa? Tuo luokitusperuste on koko peli — “23 %:n virhesuhde” on merkityksetön, kunnes tiedät, ovatko ne todellisia vikoja vai tuomarin väärinlaskentaa.
Korjaa yksi asia, sitten todista se. Jokainen iteraatio muuttaa täsmälleen yhden muokattavan resurssin, ajaa sitten uudelleen kiinteää valjastusta vasten ja pitää muutoksen vain, jos F1 paranee ja uudelleenluokittelu näyttää paremmalta. Jos ei, se peruutetaan. Ei erää spekulatiivisia muokkauksia, ei “pitäisi olla parempi”. Muutos ansaitsee paikkansa tai se poistetaan. Ja kun korjaus jää pysyväksi, se ylennetään fixture-sarjaan — jotta korjattu bugi ei koskaan voi hiljaa palata. Tuo ylennysaskel on se, mikä tekee silmukasta rekursiivisen eikä vain toistuvan: jokainen kierros vahvistaa oraakkelia, jota vasten seuraava kierros validoi.
Opetus, jonka opimme yhä uudelleen: metriikat yli-ilmoittavat
Tässä on ansa, johon kävelimme suoraan. Toissijaiset korpusmetriikat — kuinka usein poimitulla kohteella ei ole ratkeavaa symbolia, kuinka moni symboli näyttää “orvolta” ja niin edelleen — yli-ilmoittavat ongelmia massiivisesti. Ne ovat enimmäkseen paradigma-artefakteja, eivät bugeja.
Selkein esimerkki: llvm näytti kerran 73 %:n “lähde-ilman-symbolia”-suhteen ja leimattiin katastrofaaliseksi. Kaivauduimme asiaan. Todellinen tarkkuus oli 98,5 %. “Puuttuvat symbolit” olivat lähes kaikki laillisia ulkoisia viittauksia — kutsuja standardikirjastoon, frameworkeihin, koodiin, joka elää repositorion ulkopuolella. Metriikka mittasi kielen ominaisuutta, ei käsittelijän vikaa. Kielet kuten Zig, COBOL ja Odin näyttävät 65–70 %:n “orpo”-suhteita ja ovat täysin oikein; COBOLissa ei ollut yhtäkään todellista virhettä.
Jos olisimme antaneet noiden lukujen ohjata työtä, olisimme käyttäneet viikkoja “korjaamassa” käsittelijöitä, jotka olivat jo oikein, ja jättäneet huomiotta kielet, joissa oli hiljaisia, todellisia bugeja. Johtopäätös on suora: aggregaattimetriikat ovat parhaimmillaankin karkea priorisointisignaali. Todellinen laatusignaali on pistokoe reunaluokituksella — todellisten reunojen tarkastelu todellisissa repositorioissa ja niiden arvioiminen yksitellen. Dataa intuition sijaan, mutta vasta kun tiedät, mikä data kertoo totuuden.
Ulkosilmukka: parvi, ei maraton
Yksi kieli kerrallaan veisi ikuisuuden 280 kielen yli, joten sisäsilmukka on kääritty ulkosilmukkaan, joka ajaa monia rinnakkain.
pick a wave of near-GREEN / high-error languages
│
▼
fan out 10–15 agents, each ISOLATED in its own git worktree,
each grinding ONE language, committing to its own branch
│
▼
orchestrator integrates serially: file-scoped apply, then
`manifest diff` — any cross-language regression blocks the batch
│
▼
gated push (reviewed and confirmed) ──► rotate to the next wave
Jokainen agentti työskentelee kertakäyttöisessä worktreessä, jotta ne eivät voi astua toistensa varpaille. Orkestraattori integroi niiden korjaukset yksi kerrallaan, jokainen täyden manifestin regressiotarkistuksen takana: muutos, joka auttaa omaa kieltään mutta hiljaa rikkoo kolme muuta, ei mene läpi. Integraatio on portitettu ja vahvistettu ennen kuin mitään työnnetään — regressioportti päättää, mikä on turvallista, ihminen päättää yhä, mikä julkaistaan. Sitten allas kiertää seuraavaan kielijoukkoon ja koko homma ajetaan uudelleen.
Mikä on yhä epätäydellistä
Tuomari voi olla väärässä, ja vääryydellä on suunta: agentti, joka ajaa liian vähällä kontekstilla, yli-ilmoittaa. Yhdessä erässä kahdeksan kieltä merkittiin 5–20 %:n virheelle; tarkastuksessa vain yksi oli todellinen kielikohtainen bugi — loput olivat tuomarin virheitä, jotka johtuivat kielen omien semantiikkojen huomiotta jättämisestä (yksi lähderivi, joka laillisesti lähettää useita reunoja, parametrien sidonnat mallinnettuina sijoituksina, viittaus-per-tunniste-kielet). Siksi otamme näytteitä kahdella siemenellä ja ristiintarkistamme, ja siksi tuomarin ja fixturejen välinen erimielisyys käsitellään kiinnostavimpana signaalina, ei ratkaistuna tuomiona — joskus fixture on se, joka on väärässä.
Olemme myös rehellisiä tavoitteen suhteen. Tavoite on nolla todellista virhettä, piste — mutta “nolla” on suunta, jota kohti hiomme kieli kerrallaan, ei laatikko, joka rastitetaan. Aina on toinen repositorio toisella idiomilla.
Ansaittua, ei väitettyä
Kaikki, mitä Maguyva tekee agentin puolesta — symbolin löytäminen, riippuvuuden jäljittäminen, kysymykseen vastaaminen viitatulla koodilla — lepää sen varassa, että alla oleva poiminta on oikein. 280 kielen yli “oikein” ei voida väittää; se täytyy jatkuvasti ansaita oikeaa koodia vasten. Silmukka on se, miten ansaitsemme sen: autonominen pistokoe-ja-korjaa-sykli, joka suhtautuu omiin metriikoihinsa epäluuloisesti, todistaa jokaisen muutoksen ja muuttaa jokaisen korjauksen suojaksi seuraavaa regressiota vastaan. Se ei ole hohdokasta. Se on työtä, joka antaa meille mahdollisuuden sanoa “tuemme kieltäsi” ja tarkoittaa sitä. Vihreä on helppoa. Oikein on ansaittua.
Aiheeseen liittyvää
Lisää Maguyva-projektin rakennuslokista
Miksi päivitimme koodihaun malliin voyage-4-large_
Siirsimme koodiupotuksemme malliin voyage-4-large — joka on tällä hetkellä julkisen RTEB-koodinoutorankinglistan kärjessä. Rehellinen versio: kompromissi, jonka teemme, mitä todella indeksoimme ja miksi maksamme premium-upotuksista.
Monimodaalinen fuusiohaku: oikean hakukoneen valinta jokaiselle kyselylle_
Kysely kuten "missä parseConfig on määritelty" haluaa erilaisen haun kuin "miten todennus toimii". Maguyva luokittelee tarkoituksen, painottaa neljää hakumodaliteettia sen mukaisesti ja yhdistää tulokset painotetulla Reciprocal Rank Fusionilla.
Agenttien havainnointi: Hookit, Alloy ja Grafana_
Kytkimme Claude Code -työkalun ja Codexin samaan Grafana-pinoon OpenTelemetryn ja Alloyn avulla ja käytimme sitten jäljityksiä ja lokeja löytääksemme ja korjataksemme agenttien käyttäytymisongelmat niiden lähteellä.