Specification-first convergence with an AI coding agent: a case study of dismantling a core architectural invariant across 189 files in a 717k-line codebase with no test oracle and no human code review
Dit artikel presenteert een casestudy die aantoont dat een AI-coderingsagent, opererend onder een specification-first-protocol zonder menselijke code-review of vooraf bestaande test-oracle, er succesvol in slaagde een kernarchitecturale invariant te ontmantelen over 189 bestanden in een 717k-regels TypeScript-codebase door iteratief een formele specificatie te verfijnen en 201 defecten te corrigeren over drie dagen voor $2.430.
Oorspronkelijk artikel gelicentieerd onder CC BY 4.0 (https://creativecommons.org/licenses/by/4.0/). Dit is een AI-gegenereerde uitleg van het onderstaande artikel. Het is niet geschreven of goedgekeurd door de auteurs. Raadpleeg het oorspronkelijke artikel voor technische nauwkeurigheid. Lees de volledige disclaimer
In de wereld van software worden programma's gebouwd als enorme, complexe steden. Ze bestaan uit miljoenen regels instructies die een computer vertellen hoe hij zich moet gedragen, hoe hij dingen moet onthouden en hoe hij moet reageren wanneer een gebruiker op een knop klikt. Decennialang was de standaardmanier om deze steden te veranderen het sturen van een menselijke architect om elke nieuwe baksteen te inspecteren die een kunstmatige intelligentie zou leggen. Deze menselijke controle wordt als essentieel beschouwd omdat de verbindingen tussen verschillende delen van een programma zo diep en verstrengeld zijn dat een kleine fout in één hoek een instorting in een andere kan veroorzaken. Wanneer een wijziging groot genoeg is om honderden bestanden tegelijk aan te raken, wordt de taak om het werk te controleren een flessenhals; geen enkele mens kan de volledige kaart van de wijzigingen tegelijkertijd in zijn hoofd houden. Deze beperking heeft ertoe geleid dat velen geloofden dat voor de meest complexe architecturale verschuivingen de enige veilige weg is om de oude structuur af te breken en een nieuwe vanaf de grond op te bouwen, een proces dat traag, duur en riskant is.
Een recente casestudy daagt het idee uit dat menselijke controle de enige manier is om veiligheid te garanderen bij dergelijke enorme veranderingen. Het verkent een methode waarbij de focus verschuift van het controleren van het eindproduct naar het perfectioneren van de blauwdruk voordat er ook maar één baksteen is gelegd. In plaats van een kunstmatige intelligentie te vragen om code te schrijven en dan te hopen dat een mens de fouten vindt, vraagt deze aanpak de machine om eerst een gedetailleerde, formele beschrijving te schrijven van precies wat het van plan is te doen. Deze beschrijving wordt vervolgens rigoureus gecontroleerd tegenover de bestaande code, niet om te zien of de code werkt, maar om te zien of het plan zelf logisch is. Het plan wordt verfijnd, gecorrigeerd en bevroren totdat het geen bevindingen meer oplevert. Pas daarna begint de machine te bouwen, en zelfs dan wordt zij constant gecontroleerd aan de hand van dat bevroren plan. Het resultaat is een demonstratie dat een enorme, complexe architecturale verandering kan worden voltooid zonder dat een mens ooit de gegenereerde code heeft gelezen, mits het proces van het definiëren en verifiëren van de intentie robuust genoeg is.
Het experiment vond plaats binnen een grote, propriëtaire softwareapplicatie die wordt gebruikt voor kunstmatige intelligentie-ondersteuning bij het coderen. Het systeem, geschreven in een taal genaamd TypeScript, bevatte meer dan 717.000 regels code verspreid over bijna 3.650 bestanden. Het was een levend, ademend stuk software dat dagelijks werd gebruikt, geen theoretisch model. De taak die aan de kunstmatige intelligentie-agent werd toegewezen, was het ontmantelen van een kernregel die het systeem sinds de creatie had beheerst. Deze regel, een zogenaamde invariant, garandeerde dat telkens wanneer een gebruiker een gesprek met de AI startte, het venster waarin dat gesprek werd getoond, open bleef gedurende de gehele aanvraag. Als de gebruiker het venster sloot, stierf het gesprek. Het doel was om deze regel te breken: de gebruiker moet het venster kunnen sluiten, terwijl het gesprek op de achtergrond doorgaat, klaar om te worden heropend en hervat te worden op exact het punt waar het gebleven was, zonder gegevens te verliezen of woorden te herhalen.
Deze specifieke wijziging werd als bijna onmogelijk beschouwd om via standaard refactoring te bereiken. In de beoordeling van de auteur was de onderlinge afhankelijkheid van de code zo strak dat het wijzigen van de levensduur van een gesprek zonder het hele systeem te breken, normaal gesproken een volledige herschrijving van de betrokken componenten zou vereisen. De taak hield het beheren in van complexe timingproblemen, zoals wat er gebeurt als een venster sluit terwijl er nog steeds gegevens binnenstromen, en hoe je een gebruiker weer koppelt aan een live stream die heeft gedraaid zonder de gebruiker aanwezig te zijn. Om dit op te lossen, hanteerde de auteur een protocol van vijf fasen, ontworpen om de kunstmatige intelligentie op een strikt spoor te houden. Het proces begon met de agent die de aanvraag analyseerde en een formele specificatie produceerde, een gedetailleerd document dat precies beschrijft hoe de wijziging zou werken.
Het meest kritieke deel van het proces was de verfijningsfase. De agent kreeg de opdracht om de eigen specificatie te nemen en deze te controleren tegen de echte broncode, zoekend naar tegenstrijdigheden of ontbrekende details. Dit was geen eenmalige controle. De agent doorliep veertien cycli van deze audit. In elke cyclus vond de agent fouten in zijn eigen plan—misschien een bestand dat hij vergeten was bij te werken, of een afhankelijkheid die hij verkeerd had begrepen—en schreef de specificatie over om de fout te herstellen. Over deze veertien rondes werd het plan ongeveer tachtig-vijf keer gecorrigeerd, waarbij de omvang van de wijziging toenam van 110 naar 160 bestanden naarmate verborgen verbindingen werden ontdekt. Aan het einde van de veertiende cyclus was de specificatie bevroren. Het was een vaste blauwdruk die tegen de realiteit van de codebase was geaudit totdat de laatste cyclus geen bevindingen meer opleverde, waarna het werd vastgelegd als referentie voor alle daaropvolgende fasen.
Met het plan vastgelegd, ging de agent over naar de implementatiefase. De agent kreeg de instructie om de code-wijzigingen te genereren die nodig zijn om overeen te komen met de bevroren specificatie. De agent weigerde gedeeltelijke wijzigingen aan te brengen, omdat hij correct identificeerde dat een half afgeronde migratie het systeem zou breken. In plaats daarvan voerde hij het werk uit in drie duidelijke, bevestigde stappen. Zodra de code was geschreven, begon de verificatiefase. Net zoals het plan tegen de code was gecontroleerd, werd de nieuwe code nu gecontroleerd tegen het bevroren plan. De agent doorliep zeventien cycli van deze audit, waarbij de werkelijke code op het scherm werd vergeleken met de geschreven regels in de specificatie. In elke cyclus vond en corrigeerde de agent afwijkingen, waarbij subtiele architecturale gebreken werden hersteld die een mens misschien over het hoofd had gezien. Over deze zeventien rondes corrigeerde de agent 116 defecten in de code zelf. Het proces stopte pas toen twee opeenvolgende audits nul fouten terugbrachten, wat bevestigde dat de code overeenkwam met het plan binnen het gedefinieerde convergentiecriterium.
De gehele operatie raakte 189 bestanden, met een totaal van 288 gewijzigde bestanden wanneer de extractie van de oude code wordt meegerekend. De wijzigingen omvatten meer dan 34.000 nieuwe regels code en de verwijdering van meer dan 16.000 regels. Opmerkelijk genoeg werd deze enorme herstructurering voltooid in drie dagen. De kosten voor de kunstmatige intelligentie-verwerking die nodig waren voor de taak bedroegen 2.430 Amerikaanse dollars. Gedurende de gehele periode van drie dagen werd het programma één keer door een mens uitgevoerd. De eerste keer dat de software daadwerkelijk werd uitgevoerd, was na de zeventiende verificatiecyclus, toen de auteur de nieuwe functionaliteit eindelijk testte.
Het resultaat was een succes. Wanneer het programma werd opgestart, werkte het nieuwe gedrag exact zoals de specificatie had beschreven. Een gebruiker kon een gesprek starten, het venster sluiten, en het gesprek zou op de achtergrond doorgaan. Wanneer de gebruiker het venster heropende, werd het gesprek onmiddellijk hervat, zonder verlies van gegevens en zonder duplicatie van tekst. Er verscheen een nieuwe stopknop in de zijbalk, waardoor de gebrueling het achtergrondproces indien nodig kon beëindigen. De bestaande geautomatiseerde tests, die al jaren op de software draaien, vertoonden geen fouten, wat aangeeft dat het nieuwe systeem de oude functionaliteit niet heeft gebroken. De software is uitgebracht als versie 2.3.0, en in de ongeveer dertig sessies die volgden op de release, werden geen bugs waargenomen.
Deze casestudy beweert niet dat kunstmatige intelligentie nu in alle scenario's menselijke ingenieurs kan vervangen, noch suggereert het dat deze methode voor elk type probleem werkt. De auteur merkt zorgvuldig op dat dit een enkele, specifieke instantie was op een enkele codebase, en dat de resultaten niet automatisch kunnen worden toegepast op andere systemen of taken. De studie sluit expliciet de mogelijkheid uit dat een vooraf bestaande set tests dit probleem had kunnen oplossen, omdat het gewenste gedrag vóór de wijziging niet bestond. Er was geen "correct" antwoord om tegen de oude code te controleren; de juistheid moest vanaf nul worden gedefinieerd. De studie erkent ook dat het proces vertrouwde op een specifiek, krachtig model van kunstmatige intelligentie en dat de resultaten kunnen verschillen met zwakkere modellen.
De betekenis van het werk ligt in de demonstratie van een nieuwe manier om complexiteit te beheersen. Door de last van kwaliteitscontrole te verschuiven van het inspecteren van het eindproduct naar het rigoureus definiëren en verifiëren van het plan, lieten de onderzoekers zien dat een machine door een mijnenveld van onderling afhankelijke code kon navigeren zonder menselijke tussenkomst. De sleutel was niet dat de machine onfeilbaar was, maar dat het proces het mogelijk maakte om zijn eigen fouten herhaaldelijk te ontdekken voordat ze permanent werden. De specificatie werd veertien keer uitgedaagd en de code werd zeventien keer gecontroleerd, wat een lus van zelfcorrectie creëerde die het systeem naar een overeenkomst tussen intentie en realiteit dreef op basis van een empirische stopregel. De logs van dit hele proces, die meer dan 1.500 pagina's beslaan, zijn gepubliceerd voor iedereen om te inspecteren, wat een transparant kijkje biedt in hoe een machine een kernarchitecturale regel kan ontmantelen en opnieuw kan opbouwen, steen voor steen, zonder ooit een mens over de schouder te laten meekijken.
Verdrinkt u in papers in uw vakgebied?
Ontvang dagelijkse digests van de nieuwste papers die bij uw onderzoekswoorden passen — met technische samenvattingen, in uw taal.