Steven
Steven6 min leestijd

Wat een release van 127 commits eigenlijk is

GeekBye v1.7.0 was 127 commits in elf dagen. Van buitenaf lijkt dat op honderd kleine dingetjes. Van binnenuit waren het twee grote features die aan het eind in elkaar werden gevlochten — en één ervan werd op de verkeerde plek gebouwd, om vervolgens midden in de release eruit gescheurd en opnieuw opgebouwd te worden. Dit is de anatomie van een grote release.

Engineering
Release
Architectuur
GeekBye Releases
Wat een release van 127 commits eigenlijk is

Er bestaat een versie van deze blogpost die gewoon alles opsomt in GeekBye v1.7.0 — een herontworpen startscherm, een kalibratieflow, een inklapbare zijbalk, nieuwe instellingen, enzovoort. Die zou kloppen en je niets leren. Want het eerlijke verhaal van een release van 127 commits is niet de lijst. Het is de vorm.

Dit is de vorm. Honderdzevenentwintig commits klinkt als honderdzevenentwintig kleine dingen. Dat is het bijna nooit. v1.7.0 waren twee grote features, parallel gebouwd op langlopende branches over ongeveer elf dagen, aan het eind in elkaar gevlochten. Een grote release begrijpen betekent die twee strengen begrijpen — en de ene plek waar we iets op de verkeerde plek bouwden en het er midden in de vlucht weer uit moesten scheuren.

Streng één: kalibratie

De eerste streng was kalibratie — een AI-stemanalyse van je communicatievaardigheden. Je start een live gesprek met een AI-"loopbaancoach", werkt door een gestructureerde reeks fases (opwarming, gedrag, technische communicatie, reactie onder druk, doelen stellen), en aan het eind krijg je een score over zes dimensies: zelfvertrouwen, helderheid, specificiteit, betrokkenheid, kalmte, relevantie. Onderhuids meet het ook concrete spraakmetrieken — je spreektempo, de frequentie van stopwoorden, of je pauzes overkomen als strategisch of aarzelend.

De uitkomst is geen cijfer, het is een startpunt. Kalibratie levert je sterke punten, je groeigebieden en — cruciaal — een aanbevolen moeilijkheidsgraad om mee te beginnen oefenen. Het kalibreert waar het product je moet ontmoeten. Elke vaardigheid komt terug als een uitklapbare feedbackkaart met een samenvatting, een concrete suggestie en een daadwerkelijk geciteerde zin uit je eigen gesprek als voorbeeld. Het is de feature waar de rest van de oefenervaring bovenop is gebouwd.

Streng twee: een volledig nieuw venster

De tweede streng was een premium-herontwerp — en het een herontwerp noemen doet het tekort. Het was geen reskin van de bestaande schermen; het was feitelijk een tweede applicatievenster, uitgebouwd in zes expliciete fases: een inklapbare Notion-achtige zijbalk, een header-dropdown die de oude sessielijst verving, browserachtige navigatie met historie en breadcrumbs, en premium-herbouw van Home, Profielen, Meetings en Instellingen.

Twee grote features. Dat was 127 commits eigenlijk. En het lastigste aan het uitbrengen ervan was niet het schrijven van een van beide — het was het vlechten. De twee branches waren onderling afhankelijk; de ene werd in de andere gemerged, en de kalibratiebranch moest de main-branch vier afzonderlijke keren binnenhalen om niet uit sync te lopen terwijl het herontwerp eronder bewoog. Het aantal commits zijn niet de kosten van een grote release. Langlopende branches en de integratievolgorde wel.

Het deel dat het lezen waard is: we bouwden kalibratie op de verkeerde plek

Dit is de fout, en het is een goede omdat hij zo veelvoorkomend is.

GeekBye heeft een harde architecturale regel: alle AI-operaties leven op de backend. De client is een dunne schil die met een server praat. Iedereen wist dit.

En toch werd kalibratie eerst gebouwd in de lokale database van de client. Een aparte tabel, een databasemigratie, een repository van 254 regels, IPC-handlers, en een bank van 515 regels aan beoordelingsvragen — allemaal levend op de machine van de gebruiker. Het werkte. Het schond ook stilletjes het contract waarop de hele app is gebouwd.

Drie dagen later verwijderde één commit 680 regels over acht bestanden om het allemaal naar de backend te verplaatsen, waar kalibratiedata een echt server-side model werd, en de vraaglogica en scoring een servertaak. Een andere commit verwijderde de vragenbank van 515 regels aan de clientkant volledig. De diff is bijna grappig: één insertie, zeshonderdtachtig deleties.

Niemand zette zich schrap om 680 regels wegwerpcode te schrijven. Het gebeurde zoals dit altijd gebeurt: de client-shortcut ligt daar voor het grijpen, het is sneller om lokaal te prototypen, en "we verplaatsen het later wel naar de backend" voelt onschuldig. Maar als je architectuur je al vertelt waar de source of truth leeft, is het ergens anders bouwen geen shortcut — het is herwerk dat je alvast voor jezelf hebt ingepland. De les die bleef hangen: zet het waar het contract zegt, de eerste keer, zelfs als de lokale versie sneller op te zetten is.

De bug die alleen integratie kon vinden

Nog één bewijsstuk, want het is het kenmerkende faalpatroon van grote releases. Zodra kalibratie en de nieuwe navigatie aan elkaar waren geknoopt en daadwerkelijk draaiden, begon de app een rate limit af te tikken — HTTP 429's — zonder duidelijke reden.

De oorzaak was pure integratie. Kalibratiestatus werd op componentniveau opgehaald, dus elke navigatie haalde het opnieuw op — en React's strict mode, die effecten in development bewust dubbel aanroept om bugs bloot te leggen, verdubbelde dat nogmaals. Het resultaat was vier tot acht identieke kalibratieverzoeken per schermwissel, genoeg om de rate limiter van de server af te tikken. De fix consolideerde het fetchen naar een paar calls bij het mounten.

Je had deze bug niet kunnen vinden door kalibratie alleen te testen, of de navigatie alleen. Hij bestaat alleen op de naad — waar twee onafhankelijk-correcte features elkaar ontmoeten. Dat is de belasting die een grote release oplegt: de laatste loodjes zijn niet het bouwen van de features, het is het ontdekken van alles wat pas breekt als ze eindelijk in dezelfde kamer staan.

Drie dingen die een grote release ons leerde

  1. Een release van 127 commits is twee of drie grote thema's, geen honderd kleine. Vind de strengen. Het werk — en het risico — leeft in hoe ze in elkaar vlechten, niet in het aantal.
  2. Zet de source of truth waar het contract zegt dat hij leeft, de eerste keer. We verwijderden 680 regels om kalibratie van client naar backend te verplaatsen. De lokale shortcut is herwerk dat je vooraf hebt ingepland; de architectuur gaf je het antwoord al.
  3. Integratie legt fouten bloot die isolatie niet kan. De 429-storm leefde op de naad tussen twee correcte features en verscheen pas toen ze samen draaiden. Reserveer tijd voor een integratieronde, niet alleen per-feature-testen.

Dit is een neef uit het v1-tijdperk van een verhaal dat we op veel grotere schaal opnieuw zouden vertellen — zie wat een versie 2 echt vergt: 206 commits aan eerlijke states (v2.0.0), waar dezelfde "een groot getal is eigenlijk een paar grote ideeën"-waarheid zich afspeelt over de hele v2-herschrijving. Voor het vorige hoofdstuk in het v1-verhaal, hoe je een live rapport streamt zonder geflikker (v1.6.13); en voor de hele boog, de anatomie van software tot in de perfectie uitbrengen.