
Vad en release på 127 commits faktiskt är
GeekBye v1.7.0 var 127 commits på elva dagar. Utifrån ser det ut som hundra små saker. Inifrån var det två stora funktioner flätade i varandra — och en av dem byggdes på fel ställe, för att sedan rivas ut och byggas om mitt under releasen. Här är anatomin av en stor release.
Det finns en version av det här blogginlägget som bara listar allt i GeekBye v1.7.0 — en omdesignad hemskärm, ett kalibreringsflöde, en hopfällbar sidopanel, nya inställningar, och så vidare. Den skulle vara korrekt och den skulle inte lära dig någonting. För den ärliga historien om en release på 127 commits är inte listan. Det är formen.
Här är formen. Hundratjugosju commits låter som hundratjugosju små saker. Det är det nästan aldrig. v1.7.0 var två stora funktioner, byggda parallellt på långlivade brancher under ungefär elva dagar, flätade i varandra på slutet. Att förstå en stor release betyder att förstå de två strängarna — och det enda stället där vi byggde något på fel plats och fick riva ut det igen mitt i flykten.
Sträng ett: kalibrering
Den första strängen var kalibrering — en AI-röstbedömning av dina kommunikationsfärdigheter. Du startar ett live-samtal med en AI-"karriärcoach", arbetar dig igenom en strukturerad uppsättning faser (uppvärmning, beteende, teknisk kommunikation, pressrespons, målsättning), och på slutet får du poäng längs sex dimensioner: självförtroende, klarhet, precision, engagemang, sinnesnärvaro, relevans. Under ytan mäter den också konkreta talmått — ditt taltempo, hur ofta du använder utfyllnadsord, om dina pauser läses som strategiska eller tveksamma.
Resultatet är inte ett betyg, det är en startpunkt. Kalibreringen tar fram dina styrkor, dina utvecklingsområden och — avgörande — en rekommenderad svårighetsgrad att börja träna på. Den kalibrerar var produkten ska möta dig. Varje färdighet kommer tillbaka som ett expanderbart feedbackkort med en sammanfattning, ett konkret förslag och en faktisk citerad rad från ditt eget samtal som exempel. Det är funktionen som resten av träningsupplevelsen bygger ovanpå.
Sträng två: ett helt nytt fönster
Den andra strängen var en premiumredesign — och att kalla det en redesign underskattar det. Det var ingen omskinnning av de befintliga skärmarna; det var i praktiken ett andra applikationsfönster, byggt i sex uttalade faser: en hopfällbar sidopanel i Notion-stil, en rullgardinsmeny i sidhuvudet som ersatte den gamla sessionslistan, webbläsarliknande navigering med historik och brödsmulor, och premiumombyggnader av Hem, Profiler, Möten och Inställningar.
Två stora funktioner. Det är vad 127 commits faktiskt var. Och det svåraste med att skeppa dem var inte att skriva någon av dem — det var flätningen. De två brancherna var ömsesidigt beroende; den ena mergades in i den andra, och kalibreringsbranchen fick dra in main-branchen fyra separata gånger bara för att inte driva ur synk medan redesignen rörde sig under den. Antalet commits är inte kostnaden för en stor release. Långlivade brancher och integrationsordning är det.
Delen som är värd att läsa: vi byggde kalibreringen på fel ställe
Här är misstaget, och det är ett bra sådant eftersom det är så vanligt.
GeekBye har en fast arkitektonisk regel: alla AI-operationer bor på backend. Klienten är ett tunt skal som pratar med en server. Alla visste det här.
Och ändå byggdes kalibreringen först i klientens lokala databas. En dedikerad tabell, en databasmigrering, ett repository på 254 rader, IPC-hanterare och en bank på 515 rader med bedömningsfrågor — allt boende på användarens maskin. Det fungerade. Det bröt också tyst mot kontraktet som hela appen är byggd på.
Tre dagar senare raderade en enda commit 680 rader över åtta filer för att flytta alltihop till backend, där kalibreringsdatan blev en riktig servermodell, och frågelogiken och poängsättningen blev en serverfråga. En annan commit raderade frågebanken på 515 rader i klienten rakt av. Diffen är nästan komisk: en tillagd rad, sexhundraåttio raderade.
Ingen satte sig ner för att skriva 680 rader slängkod. Det hände på det sätt det alltid händer: klientgenvägen är precis där, det går snabbare att prototypa lokalt, och "vi flyttar det till backend senare" känns harmlöst. Men när din arkitektur redan talar om var källan till sanningen bor, är att bygga det någon annanstans inte en genväg — det är ett omarbete du redan har schemalagt åt dig själv. Lärdomen som fastnade: lägg det där kontraktet säger, första gången, även när den lokala versionen är snabbare att sätta upp.
Buggen som bara integrationen kunde hitta
Ett kvitto till, för det är den signaturmässiga felmoden hos stora releaser. När kalibreringen och den nya navigeringen väl var ihopkopplade och faktiskt körde, började appen slå i en rate limit — HTTP 429:or — utan uppenbar anledning.
Orsaken var ren integration. Kalibreringsstatusen hämtades på komponentnivå, så varje navigering hämtade om den — och Reacts strict mode, som medvetet dubbelanropar effekter i utveckling för att blottlägga buggar, dubblerade det igen. Resultatet var fyra till åtta identiska kalibreringsförfrågningar som avfyrades per skärmbyte, tillräckligt för att slå i serverns rate limiter. Fixen konsoliderade hämtningen till ett par anrop vid montering.
Du hade inte kunnat hitta den här buggen genom att testa kalibreringen ensam, eller navigeringen ensam. Den existerar bara i fogen — där två oberoende korrekta funktioner möts. Det är skatten en stor release tar ut: den sista biten är inte att bygga funktionerna, det är att upptäcka allt som bara går sönder när de äntligen är i samma rum.
Tre saker en stor release lärde oss
- En release på 127 commits är två eller tre stora teman, inte hundra små. Hitta strängarna. Arbetet — och risken — bor i hur de flätas ihop, inte i antalet.
- Lägg källan till sanningen där kontraktet säger att den bor, första gången. Vi raderade 680 rader när vi flyttade kalibreringen från klient till backend. Den lokala genvägen är ett omarbete du redan schemalagt; arkitekturen gav dig redan svaret.
- Integration blottlägger fel som isolering inte kan. 429-stormen bodde i fogen mellan två korrekta funktioner och dök bara upp när de körde tillsammans. Budgetera för ett integrationspass, inte bara test per funktion.
Det här är en kusin från v1-eran till en historia vi skulle berätta igen i mycket större skala — se vad en version 2 faktiskt kräver: 206 commits av ärliga tillstånd (v2.0.0), där samma sanning om att "ett stort tal egentligen är några få stora idéer" utspelar sig över hela v2-omskrivningen. För det föregående kapitlet i v1-historien, så streamar du en live-rapport utan flimret (v1.6.13); och för hela bågen, anatomin av att skeppa mjukvara till perfektion.