Svaki kvar migracije koji smo ikad videli u drugom softveru dolazi sa istog mesta: tretiranje “prvo očistite podatke” kao problema korisnika, a ne proizvoda. Nismo to hteli da gradimo. Pa smo se rano sudarili sa stvarnim slučajem, i to nas je naučilo nešto što nismo očekivali: ponekad je pravi odgovor na “da li ovo treba da radi AI” - ne.
Migracija koja nas je naučila razliku
Imali smo stvaran izvoz iz starog CRM-a za uvoz: 349 firmi, 491 belešku, uglavnom istoriju poziva pisanu na slovenačkom, 393 kontakta. Očigledan potez bio bi da to provedemo kroz Neo, naš AI-potpomognut uvoz, isti onaj koji čita neurednu tabelu i predlaže čiste zapise iz nje.
Odlučili smo da ne. Izvorni podaci su već bili strukturirani, već rešeni, već tačni. Provođenje kroz AI prolaz ne bi dodalo ništa osim rizika: model koji parafrazira ili sažima stvarne slovenačke beleške o pozivima, tiho gubeći preciznost u tekstu koji je trebalo da ostane tačno onakav kakav je napisan. Zato smo napravili drugu, odvojenu, namerno AI-slobodnu putanju: tačno, determinističko kopiranje, uparivanje po ID-u starog zapisa, čuvanje izvornih vremenskih oznaka, bez jezičkog modela igde u tome.
Izgradnja te putanje otkrila je stvarne praznine koje inače ne bismo pronašli: polje forme koje je bekend tiho ispuštao ko zna koliko dugo jer kolona u bazi podataka iza njega nikad nije postojala, kontakti koji su se gurali u slobodni tekst beleški jer nisu imali pravo mesto za život. Popravili smo oboje, trajno, ne samo za ovu jednu migraciju.
To je sada stvaran oblik Migration Enginea: Neo za iskren nered, bacite nam vašu najgoru tabelu i jasno ćemo vam reći šta smo uspeli, a šta nismo da razumemo, i tiha, tačna putanja kopiranja za podatke koji su već pouzdani i samo treba da stignu netaknuti. Dva različita problema. Prestali smo da se pretvaramo da su jedan.
Kako doći do nečega vrednog testiranja uopšte
Ništa od testiranja ispod nema smisla ako ispod toga nema ničeg stvarnog. Iskreno, deo toga kako smo došli dovde počeo je slučajno. Snimanje ekrana stalno se odlagalo, uglavnom obična nevoljnost da sednemo i nešto pošteno snimimo, pa je stvarno rešenje bilo jednostavno gledati kako AI klika kroz aplikaciju uživo i beležiti šta se dogodilo. To se pokazalo kao jedna od najboljih metoda debagovanja na koje smo naišli u celom projektu, ne pametan plan, nego nusprodukt nevoljnosti da radimo nešto drugo. Nekoliko stvarnih funkcija postoji danas jer je bag uhvaćen upravo na taj način.
Veća izgradnja sledila je sličan oblik, manje po velikom planu, više po nužnosti: jedan stvaran deo odjednom, svaki testiran od početka do kraja pre nego što je počeo sledeći, jer projekat ove veličine ne ostaje razuman ni na koji drugi način. Ono što nas je zaista iznenadilo jeste da je osnovni test paket na kraju predviđao stvari koje ga niko nije tražio da predvidi. Dodajte novu funkciju mesecima kasnije, i Velvet bi ponekad uhvatio da je neki susedni deo celo vreme tiho sedeo dopola gotov, čekajući da ga neko primeti. Ne zato što je iko uključen posebno oštrouman. Test koji stvarno klikne dugme i proveri stvaran rezultat jednostavno ima način pronalaženja stvari koje osoba koja preleti kod ne bi.
Velvet
Negde usput naš sopstveni end-to-end test paket dobio je ime umesto da ostane samo “testovi”. Zovemo je Velvet. Otprilike pet hiljada linija Playwrighta, kroz dvanaest imenovanih paketa, dim-testovi, regresija, Riznica, AI Selo, action-bus tokovi, tvrdi granični slučajevi, stres, između ostalih, pokrenutih protiv pet odvojenih sintetičkih zasejanih firmi. Ona upravlja stvarnom, pokrenutom aplikacijom, bekend i frontend oba uživo, ne lažiranom zamenom ni za jedno.
Unutar imenovanih regresionih paketa, AI pozivi su lažirani na determinističke odgovore, namerno, ne kao prečica. Pri stvarnom obimu, pravi AI pozivi udaraju o ograničenja veza pregledača i proizvode kvarove koji nemaju veze sa tim da li proizvod zaista radi. Lažiranje tu izoluje jedno iskreno pitanje, da li instalacija radi, od drugog, da li je stvarni AI odgovor dobar, koje se testira odvojeno, stvarno.
Disciplina ispod svakog sloja
Pet pravila važi svuda gde se u ovom projektu testira, ne samo u Velvetu:
Zapišite predviđanje pre pokretanja testa, tako da se prolaz kasnije tiho ne može redefinisati kao ono što se slučajno dogodilo. Test koji samo potvrđuje da dugme postoji nije test; mora da klikne dugme, sačeka stvaran odgovor, uključujući stvarnu latenciju AI, i proveri stvarno konačno stanje. Svaka funkcija se isprobava onako kako bi trebalo da radi, i isprobava onako kako bi je stvarna, ponekad nemarna, ponekad neprijateljski nastrojena osoba zaista pogrešno koristila. Kad se “kvar” pokaže kao bag u test skripti, a ne u proizvodu, i to se prijavljuje, ne tiho zakrpi i zaboravi. A ispravka nije gotova kad se kod kompajlira; gotova je kad se tačan scenario koji je pukao ponovo pokrene, stvarno, i prođe.
Iza Velveta: sedam slojeva, ne jedan
Velvet je jedan sloj od sedam. Stvarna, nelažirana AI provera pokreće se odvojeno, jednokratna skripta protiv žive aplikacije sa stvarnim pozivima modelu, koja se zatim naknadno počisti, posebno da uhvati vrstu baga koji se pojavljuje samo zato što se odgovor stvarnog modela menja iz pokretanja u pokretanje. Simulacija dugog horizonta pokreće simuliranu poslovnu istoriju, mesec, godinu, pet godina, protiv stvarnih zakupaca sa živim AI pozivima celo vreme, postavljajući ista kanonska pitanja na više tačaka kako bi proverila da li su odgovori zaista postali oštriji kako se istorija gomilala, ne samo da li su se uopšte vratili. Namerni suparnički sloj, osam neprijateljskih testova koje zovemo Poligon prepreka, pokušava direktno da slomi tvrdnje proizvoda o poštenju i bezbednosti: prompt injekcija, curenje podataka između zakupaca, protivrečna uputstva, otpornost na brisanje, stvarno finansijsko usklađivanje, rukovanje dupliranim nalozima. Bekend jedinični i integracioni testovi pokrivaju Svetu okosnicu i unos dokumenata od početka do kraja. Vođene ture testiraju stvarni interfejs na stvarnim veličinama ekrana, desktop i pravi mobilni prikaz, sa snimcima ekrana kao dokazom, ne kvačicom na spisku. Čak su i prezentacioni promo snimci poslužili kao sloj testiranja: svaki je stvaran scenario koji pogađa pravu, živu aplikaciju, i svaki trenutak koji je pri pregledu izgledao pomalo čudno pojedinačno je istražen do stvarnog baga ili problema sa vremenom snimanja, nikad pretpostavljeno bez provere.
Kroz sve to, otprilike dvadeset i pet simuliranih godina poslovne aktivnosti, nekoliko industrija, preko devet hiljada stvarnih unosa u Riznicu generisanih usput, jedanaest stvarnih bagova pronađeno i popravljeno. Ukupna stvarna potrošnja na API za ceo program: 9,57 dolara.
Šta nećemo tvrditi
Nismo testirali razmeru velikog preduzeća, hiljade istovremenih zakupaca odjednom. Nismo testirali pod opterećenjem šta se dešava sa troškom AI pod istinski intenzivnim, otvorenim svakodnevnim razgovorom, za razliku od skriptovane poslovne aktivnosti oko koje je izgrađena većina ovog testiranja. Tokom gornjeg rada otkrili smo stvaran rizik skaliranja u sopstvenom naknadnom popunjavanju embeddinga, jednokratno dostizanje velike Riznice koje se neprijatno približilo isteku vremena zahteva, i to vam govorimo umesto da to tiho zakrpimo i ništa ne kažemo.
Ništa ovde nije savršeno, jer ništa nije. Ono za šta se zaista možemo zauzeti jeste da smo pažljivo pogledali sopstvene tvrdnje pre nego što smo vam ih izneli, i da vam govorimo šta smo pronašli u oba slučaja. To je cela disciplina. Nastavićemo da je primenjujemo.