2026

Prázdná fronta znamenala 111 zablokovaných úkolů

„Ready empty" je jméno výsledku ticku, ne stav složky, a systém na oba případy reaguje stejně; daemon mezitím běžel se starým kódem, protože ho po opravě nikdo nerestartoval.

Co jsem dělal já

  • Zjistil jsem, že „prázdná fronta“ je jméno výsledku ticku, ne stav složky: v Ready leželo 111 úkolů a nešel vzít ani jeden, ale systém na to reaguje jako na prázdno — jde povyšovat drafty, místo aby hledal, proč je všechno zablokované.
  • Daemon se pořád vypínal na chybě, kterou jsme den předtím opravili; běžel se starým kódem z doby, kdy nastartoval, a stačilo ho restartovat.

Co udělala továrna

  • Našla, že přejmenovaný epic uvolnil své jméno novému, takže odkaz psaný před přejmenováním dál platí, jen míří na jiný epic; ze 28 živých citací jsou čtyři rozbité a šestnáct potřebuje přečíst větu okolo.

Data přešla do nové databáze

Po třech kolech rozhodování a nanečisto zkoušeném převodu drží lifalign-prod 5 236 řádků; první přihlášení pak našlo zacyklení, které už je opravené.

Co jsem dělal já

  • Rozhodl jsem, jak data přejdou do nové databáze: cutover, ne souběh, a ve třech kolech se doladilo osm parametrů, které z toho udělaly spustitelný postup.
  • Přechod proběhl: lifalign-prod drží 5 236 řádků, každá tabulka sedí a na obrazovce jsem si ověřil, že data jsou tam, kde mají být.
  • První přihlášení do nové aplikace se zacyklilo — tři různé chyby po sobě měly jednu příčinu; opraveno.
  • Přesunul jsem běh funkcí do Frankfurtu; požadavek z Prahy se do té doby vykonával ve Washingtonu.
  • Zjistil jsem, že denní nasazení v 16:00, které jsem si nechal udělat den předtím, nikdy neproběhlo: plánovaných běhů je nula a produkce je 95 commitů pozadu.

Co udělala továrna

  • Dotáhla přesun plánovače připomínek na API; web už nesahá do Supabase nikde.
  • Dokončila navázání barev na tokeny — žádný CSS modul ve webu už barvu nepíše a seznam výjimek je smazaný, ne prázdný.
  • Převedla dokumenty v lifalign/designs a dva poslední záznamy rozhodnutí do angličtiny, po dávkách přes noc.
  • Odmítne uložit vyřazení starší než samotný řádek, na každé tabulce, která se dá vyřadit.
  • Smazala z webu nedosažitelnou kopii pravidel dne a přesměrovala, co na ni ukazovalo.
2026

Orchestrátor se vypínal kvůli stavu, který se spraví sám

Zámek na větvi, ke kterému se nenašel task, ukončil celého daemona, přestože stačilo přeskočit jeden tick.

Co jsem dělal já

  • Orchestrátor se přestal vypínat, když k zamčené větvi nenajde task; ten stav se vyčistí sám, takže stačí přeskočit jeden tick.
  • Nechal jsem sloučit tři levné guard workflow do jedné účtované úlohy, protože mi docházely volné minuty v GitHub Actions.
  • Spočítal jsem průchodnost továrny: za 24 hodin se do PR dostalo 32 unikátních tasků, za 48 hodin 52.

Co udělala továrna

  • Rozdělila úkol, který si sám odporoval — „vyprázdnit celý allowlist barev“ proti „jedna obrazovka na jeden PR“ —, na čtyři, které jde vzít; rozdělila je podle 550 naměřených porušení, ne podle počtu souborů.

Poslední cesta z webu do Supabase má náhradu

Plánovač připomínek byl posledním místem, kde web sahal přímo do Supabase; rozhodlo se, jak má běžet, a schéma mezitím dostalo indexy pod cizí klíče.

Co jsem dělal já

  • Rozhodl jsem, jak poběží připomínky: cron pustí SQL, které ověří, jestli má smysl budit backend, a odeslání obstará backend.
  • Nechal jsem produkci nasazovat jednou denně v 16:00.
  • Zrušil jsem akci „Přidat jako flow moment“; Flow lístek už z todo nic nepřebírá.
  • Rozhodl jsem, že prázdný text v deníku nechává prázdný záznam — deník mazání nemá.
  • Zamítl jsem navrženou opravu falešného hlášení „Úkol se mezitím změnil“: hlídač měl přeskakovat zápis, který nic nemění, jenže přesně takový zápis aplikace dělá schválně, aby i uložení beze změny prošlo kontrolou souběžné editace.

Co udělala továrna

  • Otevřela přesun plánovače připomínek na API, poslední místo, kde web sahal přímo do Supabase; cron v databázi ho budí, jen když může být co poslat.
  • Přestěhovala za API Historii plánů a dashboard Dnes a ztenčila Uzavření dne na jedno čtení.
  • Dala každému cizímu klíči index na jeho straně; Postgres indexuje jen cíl, takže mazání rodiče skenovalo celou dětskou tabulku.
  • Vyjmenovala sloupce u on delete set null na sedmi složených klíčích; bez seznamu se nulovalo i user_id, které prázdné být nesmí.
  • Readiness teď odmítne repliku, která nedrží podpisové klíče vydavatele, takže by přihlašovací token nedokázala ověřit.
  • Nechala build spadnout a pojmenovat metodu, když adaptér neobalí práci s databází tak, aby se technická chyba dostala nahoru jako jeden známý typ; do té doby vynechání nikdo nehlídal.
  • Otestovala poprvé, co se stane, když uložení formuláře selže — do teď testy uměly jen úspěch: vypršené přihlášení pošle na login, výpadek serveru se nevydává za chybu ve vyplnění, a formulář po odmítnutí nevymaže, co uživatel napsal.
  • Navázala barvy v sedmi CSS modulech Detailu dne a ve sdílených komponentách na tokeny a přidala detektor na každou syntaxi, kterou jde barvu napsat.
2026

Osm dní ticha v #alerts a fronta na jedenáct hodin

Jedna odmítnutá zpráva ucpala celý kanál a nikdo se to nedozvěděl; nahromaděných sedm tisíc alertů pak odbavovala rychlost jednoho za šest vteřin.

Co jsem dělal já

  • Nahodil jsem Discord bota; umřel s neočekávaným restartem stroje a nevstal, protože si v konfiguraci držel cestu k repozitáři na starém disku.
  • Našel jsem, proč #alerts osm dní mlčel: jedna odmítnutá zpráva s fingerprintem o 2 224 znacích proti limitu 2 048 v patičce ucpala celý kanál.
  • Nechal jsem alert o zaparkovaných tascích vyjmenovat, co je zaparkované; do té doby posílal prázdný seznam.
  • Prošel jsem nahromaděnou frontu alertů jeden po druhém a trval na tom, aby se příčina pomalosti změřila, ne odhadla; vyšlo z ní dávkování místo jedné úpravy karty na alert.
  • Rozšířil jsem úklid větví na všechny jmenné prostory, pod které továrna pushuje; čistily se jen claude/ a codex/.
  • Nechal jsem smazat remote větve, které už nikdo nepotřebuje.

Co udělala továrna

  • Zabránila tomu, aby jeden task ležel ve dvou složkách boardu naráz.
  • Nepromovala nic a napsala proč: každý draft, který by vzala, leží v jednom z pěti otevřených promotion PR.

Detail dne přešel za API, měsíc a rok přibyly

Za API šlo dalších osm obrazovek včetně Detailu dne, a vznikly poslední dva stupně rolling plánování.

Co jsem dělal já

  • Rozhodl jsem, jak se řeší kolize v plánu dne: buď přeskládat den, nebo odebrat kolidující bloky — obě cesty zůstávají.
  • Smoke check si teď startuje celý stack sám, včetně falešného přihlašování, takže nepotřebuje vyhrazený účet ani hostovaný projekt; od 17. 9. byl červený na každém tasku.

Co udělala továrna

  • Přestěhovala za API dalších osm obrazovek: notifikační zařízení, Opakované bloky, Úkoly, Rituály, Rolling Planning, Detail dne, Uzavření dne a Plán dne.
  • Postavila Měsíční plán a Roční plán, poslední dva stupně rolling plánování, které ještě neměly kam ukládat.
  • Naučila API odebrat kolidující bloky; do té doby umělo jen přeskládat den, takže Detail dne nešel přestěhovat bez ztráty funkce.
  • Přejmenovala barvy z --color-daily-* na role; jméno tvrdilo, že patří jedné obrazovce, ale četly se na všech (974 výskytů v 62 souborech).
  • Dala ScreenHeaderu dva sloty, které poslední dvě obrazovky potřebovaly a kreslily si nadpis samy.
  • Smazala z patnácti dokumentů řádek s vlastní cestou; byl špatně dvakrát — jmenoval složky, které se přesunuly, i disk, ze kterého se repozitář odstěhoval.
  • Nechala rozhodnutí 0017 odvodit svá čísla z modelu; ruční počet byl potřetí zastaralý (3 → 16 → 28).

Web umí knihy a výpisky z nich

Knihy jsou na webu samostatný typ obsahu vedle projektů a deníkový záznam se může věšet na knihu stejně jako na projekt.

Co jsem dělal já

  • Přidal jsem na web knihy jako samostatný typ obsahu vedle projektů, a k nim výpisky z jednotlivých kapitol.
  • Deníkový záznam se teď může věšet na knihu stejně jako na projekt a index deníku podle knihy filtruje.
  • Knihy i výpisky mají obě jazykové mutace a jsou v sitemapě.
2026

Továrna čtrnáctkrát spustila task, který byl dávno hotový

Orchestrátor četl board z pracovního stromu, takže větev pod primary checkoutem uměla udělat z hotového tasku ready; teď se board čte z origin/main.

Co jsem dělal já

  • Přepsal jsem čtení boardu z pracovního stromu na origin/main poté, co orchestrátor čtrnáctkrát spustil dávno hotový task a sežral 20 % pětihodinového limitu; při tom se ukázalo, že Get-TaskFileTitle vracel prázdný titulek u všech 92 Ready tasků.
  • Nechal jsem promotion PR mergovat automaticky; koordinační běh nepřidává kód, jen posouvá tasky po boardu.
  • Spočítal jsem, kolik toho továrna zatím odpracovala: 504 taskových běhů s mediánem 13 minut.

Co udělala továrna

  • Promovala pět refinovaných draftů a zapsala tři blokace.
  • Odmítla premisu, že je board prázdný — v Ready stálo 14 a 75 tasků — a místo promování rozepsala dva vygenerované pahýly na skutečné tasky a jeden odložila mně k rozhodnutí.

Osm obrazovek přešlo za API

Továrna přestěhovala osm obrazovek z databáze za .NET API a přidala kontroly, které chytí rozbité nasazení dřív než uživatel.

Co udělala továrna

  • Přestěhovala za API osm obrazovek: Kategorie času, Nastavení, Osobní kontext, Flow lístek, Ohlédnutí, Šablony rozpočtu dne, Rozpočet dne a Zastavení; z každé zmizel Supabase adaptér i druhá kopie pravidel.
  • Otevřela devátou, obrazovky notifikačních zařízení; ta čeká na merge.
  • Drift produkčního schématu se teď hlásí sám; do té doby ho první našel uživatel na rozbité obrazovce.
  • Pustila dotnet ef database update poprvé v CI; jediná cesta, kterou se schéma dostane do databáze, do té doby ověřená nebyla.
  • Health check teď zkouší i spojení s databází; do té doby stačilo, že proces běží, takže nasazení se špatným heslem naskočilo zeleně a spadlo až na prvním skutečném požadavku.
  • Přidala test, který čte schéma tak, jak ho zanechají migrace, a odhalí zápis spoléhající na default, který cestou zmizí.
  • Spravila náhodně padající test — chyba byla v něm, ne v komponentě: nepočkal, až React zpracuje výsledek akce, a přeskočil přechod stavu, který proběhne jen jednou.

První kapitola Software Engineer's Guidebook

Četl jsem o typech firem, profit a cost centrech a o tom, jak různá prostředí mění rychlost kariérního růstu.

Co jsem četl

Začal jsem číst The Software Engineer’s Guidebook a prošel první kapitolu o kariérních cestách. Kapitola rozebírá rozdíly mezi typy firem, jejich velikostí, sektorem, fází růstu a tím, jak důležitý je pro ně software.

Co mi došlo

Nejsilnější pro mě byla myšlenka, že firma a tým nejsou jen místo, kde člověk pracuje. Jsou to prostředí s různě rychlou zpětnou vazbou, různou mírou příležitostí a různým stropem kariérního růstu.

Dobře mi do toho zapadla metafora výtahu po kariérním žebříčku. Každá firma, tým a pozice má jinou rychlost. Některé prostředí člověka táhne nahoru rychleji, jiné ho může držet na místě, i když se v něm pořád pracuje.

Další krok

Chci si u dalších kapitol víc hlídat, které myšlenky jsou jen obecné rady a které mi pomáhají lépe pojmenovat vlastní zkušenost z Gopasu, Mews a aktuálního směru kolem AI Factory a AI Coach.

2026

Záznam, který nic nezmění, je jen archiv

P15 a pravidla incidentů se přepsala tak, že kdo incident píše, navrhuje i změnu, a limit na jeden otevřený PR nahradil Touch set.

Co jsem dělal já

  • Přepsal jsem P15 a README incidentů: záznam, který nic nezmění, není učení, ale archiv — kdo incident píše, navrhuje i změnu.
  • Nechal jsem zapsat incident o session, která mi jako fakt předložila tabulku tří Vercel projektů, aniž by ji z čeho složila.
  • Doplnil jsem do developer skillu čtení stavu PR před pushnutím do jeho větve; tři PR toho dne dostaly commity hodinu po mergi.
  • Vyměnil jsem limit na jeden otevřený PR za Touch set: tick přeskočí jen úkol, který sahá na soubory nějakého otevřeného PR.
  • Přesměroval jsem cesty, po kterých agenti zakládají worktree a čtou svůj stav, na disk, kam se repozitář přestěhoval (agent si toho všiml a úpravu navrhl).
  • Přepsal jsem 68 odkazů na úkoly tak, aby neobsahovaly složku; složka je stav úkolu, takže odkaz se rozbil vždycky, když se úkol pohnul (agent si toho všiml a úpravu navrhl).

Co udělala továrna

  • Promovala tři rozpracované úkoly a jeden odložila, protože ho může rozhodnout jen vlastník.
  • Otevřela záznam o tom, že koordinační běh třikrát za 37 minut promoval tytéž drafty, protože jeho větve nikdo nemergnul.

Nová produkce stojí, web jde přes API

Nové produkční prostředí v Azure poprvé stojí a projel jím celý deploy; web Lifalign se začal stěhovat na .NET API.

Co jsem dělal já

  • Nahodil jsem v Azure nové produkční prostředí a poprvé jím protáhl celý deploy: migrace, image, container app, web, tag.
  • Otevřel jsem produkci ingress; prod.bicepparam ho měl pořád vypnutý a při dalším nasazení by ji zase odřízl.
  • Odpojil jsem starý Vercel projekt ai-coach od gitu, aby ho migrace nerozbila a běžel dál na starém přihlášení a staré databázi; dva nové projekty pro Lifalign jsem založil vedle něj.
  • Přejmenoval jsem Supabase na lifalign-prod, staging odložil a produkci nasazuju rovnou z main; free tier dovolí dva projekty a oba jsou obsazené.
  • Galerii designů jsem stáhl na dev server; její předrenderované obrázky nafoukly deployment bundle z 1,74 MB na 52 MB.
  • Postavil jsem bránu na .NET API a poslal přes ni první obrazovku, Poznámky.
  • Přepnul jsem přihlašování webu Lifalign ze Smart Diary na .NET API; Supabase zůstal poskytovatelem identity, jen s ním teď mluví API, ne web.
  • Obrazovky, které ještě nejsou za API, u prvního čtení spadnou a pojmenují chybějící tabulku, aby byla migrace vidět; přihlášení, odhlášení, Více a Poznámky fungují.
  • Zdokumentoval jsem, jak si sloupce živé a cílové databáze odpovídají oběma směry; nejsou to dvě verze jednoho schématu.
  • Rozjel jsem produkt lokálně proti čistému Postgresu.
  • Rozepsal jsem zbytek přesunu do osmnácti úkolů P0, z toho Detail dne na pět obrazovek.

Co udělala továrna

  • Vystavila přes HTTP osobní kontext, mazání poznámky a časovou osu dne, to poslední na jedenácti routách.
  • Dala change trailu implementaci, takže zápis plánovacího bloku už neskončí na prázdném description.
  • Přidala kontrolu, která najde mergnutou a nenasazenou migraci dřív než uživatel.
  • Zastropovala strom časových kategorií na tři úrovně.
  • Srovnala pojmenování: epic se jmenuje Detail dne a sekce Na tento den; oprava dvanácti citací v glosáři čeká na merge.
2026

Plné úložiště a klient bez klíče k databázi

Vercel dojel na stropu free tieru, takže se přestal stavět web, který se nezměnil, a začal nový klient, který nedrží přístup do databáze.

Co jsem dělal já

  • Vercel hlásil 100 % z 10 GB Function Storage; příčinou je hromadění — každé podržené nasazení si drží vlastní kopii tří Node funkcí a od 17. července se lifalign/apps/web dotklo jen 40 z 1072 commitů na mainu.
  • Web se přestal stavět pro změny, které nevidí; za zbytek dne přibyly dva přeskočené záznamy místo desítek postavených.
  • Napsal jsem do továrny nástroj, který má mazat stará nasazení z ticku — ale ještě nikdy neběžel, protože v profile.json chybí blok vercel a spouštěč se tiše vrací.
  • Stará nasazení jsem smazal ručně: zbylo 312, z toho 154 READY, nic staršího než 1. září. Číslo 12,33 GB se zatím nehnulo.
  • Rate limiting dostal levnou místní kontrolu: token z cookie se nejdřív ověří na tvar a známý podpisový klíč, a teprve pak se kvůli němu jde ven na Supabase.
  • Obě .bicepparam sháněly image tag latest, který nikdo nepublikuje; ukazují na dev.
  • Rozhodl jsem, že nový frontend nebude držet žádný přístup do databáze, a založil klienta, který to dokazuje: přihlášení, výpis časových kategorií, odhlášení, jedna proměnná API_BASE_URL.

Co udělala továrna

  • Otevřela změnu, po které se rituál nabídne jako splněný i bez bloku v Realitě — stačí hotový plánovací blok; čeká na merge.

Deník přestal ukazovat týden dvakrát

Projektový deník listuje jen kořeny — týden se v něm objeví jako shrnutí, ne znovu po jednotlivých dnech.

Co jsem dělal já

  • Projektový deník listuje jen kořeny: týdenní shrnutí ano, dny uvnitř něj ne, a den z neuzavřeného týdne pořád ano.
  • Pravidlo drží jedna funkce, kterou volá i přehled deníku — dřív to měl napsané zvlášť.
  • Odznak u záznamu ztratil slovo „Projekt“; zbylo jen jméno projektu.
2026

Dev, prod a sedmnáctidenní výpadek

Den strávený vyjasňováním, jak má vypadat dev a prod, ze kterého vypadlo API servírující tři týdny starý image.

Co jsem dělal já

  • Probral jsem, jak má vypadat dev a prod pro databázi, frontend i backend, a vybral Bicep místo Terraformu a Pulumi.
  • Z grillingu vypadlo, že dev API sedmnáct dní servírovalo image z 28. srpna, protože nastavení, které potřebuje, se nikdy nepřidalo do container appky.
  • Rozdělil jsem práci na prostředích do sedmi úkolů podle toho, kdo který krok umí provést.
  • Obě Azure prostředí teď popisuje jedna Bicep šablona a nasazení ověřuje revizi, kterou samo vytvořilo.
  • Opravil jsem nasazování migrací: příkaz běžel s kontextem, na který nikdy nebyla připojená pojistka na volajícího.
  • Zapsal jsem, že produktové jméno má dva pravopisy a který kam patří.

Co udělala továrna

  • Srovnala dvoje hodiny v jednom řádku a opravila řádky, které je měly rozjeté.
  • Přepočítala délku každého bloku Reality, který si odporoval s vlastním rozsahem.
  • Zrcadlí meze délky textu u Todo i v EF mapování a hlídá každý check constraint.
  • Čte zachycené bloky dne v pořadí, ve kterém se staly.

Deník se naučil ukazovat na projekty

Záznamy a projekty se odkazují oběma směry, produkt dostal na celém webu své skutečné jméno a uzavřený týden se sám uzavře.

Co jsem dělal já

  • Deníkový záznam nese odznak projektu: klikatelný, když ten projekt má stránku, čárkovaný a mrtvý, když ji nemá.
  • Projekt odkazuje opačným směrem, do deníku předfiltrovaného na sebe.
  • Hlavička záznamu se zúžila na odznak, datum a nadpis.
  • Přejmenoval jsem produkt na celém webu na Lif-align.
  • Osobní web dostal vlastní projektovou stránku a odkaz na ni ze stránky Aktuálně.
  • Uzavřený týden nově dostane shrnutí a jeho dny zmizí z přehledu deníku.
týden

Týden, kdy backend dostal vrstvu a API

Týden 7.–13. září na Lif-align: nepřihlášený se k API nedostane, přibyla aplikační vrstva a pak se začala vystavovat přes HTTP.

Co udělala továrna

  • Endpoint je nově zamčený, dokud někdo výslovně nenapíše, že je veřejný — dřív to bylo obráceně. Vedle toho přibyl rate limit.
  • Přihlášený uživatel dorazil až na databázové spojení: caller scope otevře transakci a nastaví v ní claims i roli.
  • Dvanáct oblastí dostalo aplikační vrstvu nad repozitáři, všude ve stejném tvaru — doménový typ, rozhraní repozitáře, use case, mapper.
  • Tahle vrstva se pak začala vystavovat přes HTTP, do neděle dalších deset částí domény.
  • V aplikaci bylo vidět pět změn: časové pásmo uživatele, dvouúrovňový posuvník rozpočtu, délka poznámky, znovunabídnutí archivované šablony a vrácení todo na seznam.
  • Skončil Penpot. Obrazovka se teď skládá ze skutečných komponent v galerii přímo v repozitáři.
  • Došly minuty na Actions, tak se kontroly repozitáře přestěhovaly do běhu továrny.
  • Našel se test, který nespouštěl žádný runner, a s ním přibyl hlídač na další takové.

Co jsem dělal já

  • Nasazení migrací do produkce spadlo na naší vlastní pojistce a oprava pořád není napsaná.

Týden, kdy vznikl model domu

Týden 7.–13. září na Ráji 512: model začal od nuly a skončil čtyřmi variantami nového domu a etapovým plánem.

Co jsem dělal já

  • Začal jsem model, aby šly varianty rozšíření domu postavit vedle sebe a porovnat.
  • Dal do něj pozemek, odstupy a ochranné pásmo vodovodu jako stěny, které jdou skrýt, takže je vidět, kde se stavět nesmí.
  • Střecha, osm oken a devět místností vyšly z výkresů místo z odhadu.
  • Do konce týdne stály čtyři varianty nového domu a k nim etapový plán, každá s hrubým propočtem z výměr modelu.
  • Nezávislý kritik ukázal, že polovina kontrol nemohla selhat, a proti tomu přibyl mutační test.

Týden, kdy web dostal dva jazyky a deník

Týden 7.–13. září na osobním webu: čeština a angličtina se rozdělily, přibyl deník a CV se přestěhovalo na úvodní stránku.

Co jsem dělal já

  • Rozdělil jsem web na českou a anglickou verzi a nasadil ho na vlastní doménu.
  • Přidal deník jako dvě kolekce sdílející jedno schéma, s přehledem, detailem a filtry, a bez databáze pod tím.
  • Schoval sekci Writing za feature flag, aniž bych smazal jediný článek.
  • Přestěhoval CV na úvodní stránku, jako PDF nebo Word, a stránku, která ho držela, smazal.

Týden, kdy jsem si vybral, odkud se učit

Týden 7.–13. září: první úloha na LeetCode a rozhodnutí, které platformy a kanály sledovat.

Co jsem dělal já

  • Založil jsem si LeetCode a vyřešil první úlohu.
  • Prohlédl si čtyři vzdělávací platformy a vybral newsletter i kanály, které budu sledovat.

Zatím tu nejsou žádné deníkové záznamy.