Changelog
Kompletná história zmien projektu GitPulse - od prvého commitu po najnovšie úpravy. Formát: Keep a Changelog.
[2026-07-08] - Žiadny falošný tost „Sync completed!" pri spustení kontrol 2026.7.3.post31
Opravené
- Žiadny falošný tost „Sync completed!" pri spustení Run Checks. Prepočet metrík vyšle SSE
update; sync-stream nevidel žiadnu synchronizáciu, no zastaraný príznak_syncWasActivenapriek tomu spustil_completeCourseSync()→ tost „Sync completed!", hoci sa nič nesynchronizovalo. Terminálny sync-tost je teraz podmienený novým príznakom_sawRealSyncRunning, ktorý sa nastaví len keď opytovanie/SSE reálne uvidí bežiacu/dokončujúcu sa synchronizáciu. - Odstránený duplicitný info-tost „Data updated" po dokončení úlohy - globálna poloska už zobrazuje terminálny tost, takže ďalší len stackoval druhý.
- Verzia
2026.7.3.post31; Cache Service Workeragitpulse-v302.
[2026-07-08] - Skeleton stránky študenta dopĺňa riadok e-mailu 2026.7.3.post30
Opravené
- Načítavací skeleton stránky študenta teraz obsahuje riadok e-mailu v bloku identity profilu (ikona + adresa), aby zodpovedal načítanej stránke pre učiteľov/adminov (
can_edit). Bolo to jediné chýbajúce pole medzi menom a odkazom „View on GitLab", takže hlavička sa pri príchode dát mierne posúvala. - Verzia
2026.7.3.post30; Cache Service Workeragitpulse-v301.
[2026-07-08] - Bejdž „Prepočítava sa…" pri Run Checks pre každú skupinu 2026.7.3.post29
Pridané
- „Run Checks (all groups)" teraz pri každom riadku skupiny zobrazí bejdž „Prepočítava sa…" počas behu, takže stránka kurzu dáva viditeľnú spätnú väzbu po riadkoch ako pri synchronizácii (predtým sa hýbala len globálna poloska). Bejdže zmiznú po obnovení riadkov na konci.
- Verzia
2026.7.3.post29; Cache Service Workeragitpulse-v300.
[2026-07-08] - Oprava R09 (schválenie MR) po zlúčení - skóre už neklesá 2026.7.3.post28
Opravené
- R09 (MR schválený) už po zlúčení MR nespadne na falošné ZLYHANIE - toto potichu znižovalo skóre pri všetkých zlúčených MR. GitLab po zlúčení MR a zmazaní vetvy vyčistí zoznam
/approvals, takže neskorší sync prepísal uložené schválenia na 0; primin_approvals >= 2potom každý zlúčený MR zlyhal na R09 (napr. študent 0.860 -> 0.825, klesli aj priemery skupín). R09 teraz počíta rôznych schvaľovateľov z trvalých systémových poznámok „approved this merge request" (zjednotené so živým zoznamom, s odčítaním neskoršieho „unapproved") - tie zlúčenie prežijú, takže skóre ostáva správne. Spustite Run Checks / sync na obnovenie. Pridané regresné testy. - Verzia
2026.7.3.post28; Cache Service Workeragitpulse-v299.
[2026-07-08] - Skeleton študenta 1-k-1, jeden krížik na poloske, oprava dvojitej hornej polosky 2026.7.3.post27
Opravené
- Skeleton stránky študenta teraz zodpovedá načítanej stránke 1-k-1. Časť „Compliance Progress" bola úplne mimo: Score Trend bol malý prúžok vo veľkej prázdnej ploche, Skill Profile holý kruh a teplotná mapa „Check Progress by Week" + prahové odznaky + týždenný súhrn úplne chýbali. Skeleton teraz vypĺňa plochu grafu Score Trend, vykresľuje prahové odznaky, radar s mierkou týždňa a súhrnom Current Score / vs Last Week / Weakest Area, plus celú mapu R01–R13 × týždne.
- Globálna poloska úloh zobrazuje presne jeden koncový ovládač namiesto dvoch nejednoznačných krížikov: bežiaca úloha má cancel-X (s potvrdením pred zastavením procesu), dokončená/zlyhaná má dismiss-X na zatvorenie. Konzistentne pri plnom rendri aj in-place aktualizácii.
- Horná poloska sa už nespustí dvakrát pri pomalej navigácii. Zosúlaďovač sieťovej aktivity predtým dokončil polosku (skok na 100 % + vymazanie stavu) počas navigácie celej stránky – takže cieľová stránka vyskočila novú polosku od nuly. Teraz počas navigácie dokončenie preskočí, takže jedna súvislá poloska preklenie starú → novú stránku.
- Verzia
2026.7.3.post27; Cache Service Workeragitpulse-v298.
[2026-07-07] - Odstránenie neaktívneho shellu panela údržbových úloh 2026.7.3.post26
Odstránené
- Odstránený neaktívny „shell" panela naplánovaných/údržbových úloh, ktorý zostal po post24. Mriežka úloh sa už nevykresľovala, takže išlo o mŕtve lešenie: odstránené admin endpointy (
/jobs/trigger,/jobs/retry,/scheduled-jobs,/jobs/active-scheduled), prázdnyadmin_scheduled_registry,run_tracked_scheduled+sweep_trackinga front-end kód triggerov/pollingu/SSE v admin-system balíku. Ponechaná živá tabuľka histórie úloh, zrušenie, health, cache a štatistiky. Nefunkčné tlačidlo „Retry" bolo odstránené spolu s jeho mŕtvym endpointom.
Zmenené
custom_checkschéma: vyčlenený zdieľanývalidate_rule_type, aby validátory create/update neduplikovali kontrolu typu pravidla.- Verzia
2026.7.3.post26; Cache Service Workera aktualizovaná nagitpulse-v297.
[2026-07-07] - Rozlíšenie forku šablóny bez commitov študenta 2026.7.3.post25
Pridané
- Detail projektu teraz rozlišuje fork šablóny bez commitov študenta od skutočne prázdneho repozitára. Ak má repozitár commity autorov šablóny, no žiadny študent zatiaľ nepushol vlastnú prácu, karta „Issues to Address" zobrazí stav „Šablóna / fork – zatiaľ žiadne commity študenta" (namiesto zavádzajúceho „Zatiaľ žiadne údaje repozitára"), karta prispievateľov uvedie „Zatiaľ len autori šablóny" a štatistika commitov ukáže „—" namiesto zavádzajúcej „0". Rozpoznané konzistentne pri plnom rendri aj live-data obnove. Pridané slovenské preklady.
- Verzia
2026.7.3.post25; Cache Service Workera aktualizovaná nagitpulse-v296.
[2026-07-07] - Odstránenie mŕtvej vrstvy naplánovaných/periodických sweep úloh 2026.7.3.post24
Odstránené
- Odstránená mŕtva vrstva „naplánovaných / periodických sweep" úloh. Neexistuje periodický plánovač a katalóg údržbových úloh admina je prázdny, takže tieto úlohy sa nikdy nespúšťali:
periodic_llm_analysis,periodic_telemetry_snapshot,sweep_dlq_auto_resurrect,cleanup_old_events,cleanup_old_email_logs,sweep_email_queue,sweep_auto_archive_ended_courses,sweep_unprocessed_events. Zmazané ich moduly (sweep_jobs,sweep_cleanup,sweep_maintenance,sweep_events), periodické funkcie vsweep_telemetry, osirotený helper_delete_in_batches, položky_FEATURE_FLAG_MAP, štítkyscheduled:*v audite a legacy retry mapa. Testy upravené. - Úlohy riadené udalosťami/synchronizáciou ostávajú bez zmeny:
refresh_project_gitlab_intel(obnova intel z webhooku),sync_single_team_members(sync členov pri push) atelemetry_snapshot_for_team. Doručovanie e-mailov nie je ovplyvnené (enqueue_emailpriamo enqueue-ujedeliver_email).
Poznámka
- Obnovovacie cesty, ktoré poskytovali len zmazané úlohy (DLQ resurrect, retencia udalostí, replay nespracovaných udalostí, retry odosielania e-mailov), boli bez plánovača už nefunkčné; manuálna re-synchronizácia stiahne aktuálny stav, takže sa nestrácajú dáta. Prázdny „shell" panelu údržby ostáva neaktívny a odstráni sa v ďalšom kroku.
- Verzia
2026.7.3.post24; Cache Service Workera aktualizovaná nagitpulse-v295.
[2026-07-07] - Oprava animácie loga a upratanie dokumentácie 2026.7.3.post23
Opravené
- Animácia EKG pulzu v logu už pri odchode kurzora neskočí späť na začiatok stopy. Pri prejdení myšou sa menila
animation-durationpulzu (3.8s -> 0.95s); jej vrátenie pri odchode premapovalo uplynulý čas animácie na dlhšiu časovú os a pohyblivý segment skočil naspäť. Hover teraz iba rozjasní pulz pri konštantnej rýchlosti, takže plynulo pokračuje z aktuálnej pozície.
Zmenené
- Premenovaný
app/workers/sweep_ci.py->app/workers/sweep_events.py(názov ostal po odstránenej CI funkcii, no drží len zotavovací sweep webhook eventov). Iba premenovanie - RQ cestyapp.workers.sweep.*fungujú cez re-exporty. - Odstránené zmienky o troch zmazaných sandbox funkciách z aktuálnej dokumentácie (API špecifikácia, dátový model, požiadavky, rollout, mapovanie kontrolného zoznamu, strom architektúry, vývojárske stránky). História CHANGELOG/archív, text diplomovky a stránky histórie migrácií ostali bez zmeny.
- Verzia
2026.7.3.post23; Cache Service Workera aktualizovaná nagitpulse-v294.
[2026-07-07] - Úplné odstránenie troch nepoužívaných sandbox funkcií 2026.7.3.post22
Odstránené
- Úplne odstránené tri nepoužívané sandbox funkcie (boli vypnuté cez feature flag a nikdy neboli zapnuté v produkcii, ich tabuľky mali nula riadkov): simulátor git konfliktov, modul overenia Docker buildu a generátor CI zlyhaní. Odstránené ich služby, workery, modely, API routes, šablóny, JS (
_parts+ prebuildované bundly), feature flagy a osirotené i18n reťazce; konfiguračné stĺpce v course_settings a (prázdne) tabuľky funkcií drop-uje nová migrácia009_drop_sandbox_features. Žiadna zmena správania pre používateľov.
Zmenené
- Verzia
2026.7.3.post22; Cache Service Workera aktualizovaná nagitpulse-v293.
[2026-07-07] - Prázdny stav „Issues to Address" už nemizne + zrušený cache medzi obnoveniami (spôsoboval blikanie/zastarané dáta) 2026.7.3.post21
Opravené
- Karta prázdneho stavu „Issues to Address" už nezmizne sekundu po načítaní. Pri live-data pollingu, keď server nevie určiť stav repozitára, vráti prázdne
issues_html(zámerne: „ponechaj aktuálnu kartu"), no klient ju potom starou fallback vetvou skryl (d-none). Tú mŕtvu vetvu sme odstránili - trvalý serverom vykreslený prázdny stav teraz zostáva. - Zrušený stale-while-revalidate cache lazy-obsahu (post19/post20). Po obnovení maľoval naposledy videný obsah, ale po synchronizácii na pozadí ukazoval zastarané/prázdne dáta a blikal („zjaví sa a zmizne", „po synchronizácii nič nevidno"). Stránky teraz vždy vykreslia čerstvé dáta zo servera (kompromis: krátky skeleton pri obnovení), takže zobrazené dáta sú vždy správne a nikdy nezmiznú. Uložené dáta (členovia / prispievatelia / štatistiky) sa vykreslia z DB snapshotu bez ohľadu na stav tokenu.
Zmenené
- Verzia
2026.7.3.post21; Cache Service Workera aktualizovaná nagitpulse-v292.
[2026-07-06] - Cache medzi obnoveniami sa naozaj zapne + upozornenie na token odkazuje na dokumentáciu 2026.7.3.post20
Opravené
- Cache lazy-obsahu (post19) sa teraz naozaj zapne. Krok zápisu do cache odmietal každú stránku, ktorej skutočný obsah obsahoval vnorený skeleton dopĺňaný klientom (grafy, analytické karty, ...), takže stránka sa nikdy neuložila a F5 stále blikal celostránkovým skeletonom. Pri
htmx:afterSwapje obsah vždy skutočná odpoveď servera (počiatočný skeleton je už preč), takže tá kontrola bola nesprávna - odstránená.
Zmenené
- Položka „Neplatný GitLab token" v „Items that need your attention" teraz odkazuje na dokumentáciu k tokenom (
/docs/gitlab/tokeny/) s návodom, ako ho vymeniť, namiesto System Settings - token je serverová premenná prostredia, nie nastavenie v aplikácii, takže System Settings ho nemohli opraviť. - Verzia
2026.7.3.post20; Cache Service Workera aktualizovaná nagitpulse-v291.
[2026-07-06] - Lazy stránky sa po obnovení vykreslia okamžite (cache medzi obnoveniami), nie skeleton 2026.7.3.post19
Zmenené
- Lazy-načítané stránky dashboardu sa po obnovení / návrate vykreslia okamžite namiesto zakaždým blikajúceho skeletonu. Stale-while-revalidate cache (
_parts/core/50-lazy-content-cache.js) uloží naposledy vykreslený obsah pre danú URL dosessionStorage(na kartu, iba v pamäti - nikdy na disk, v súlade sno-storepolitikou na/dashboard) a ihneď ho prekreslí, kým htmx na pozadí načíta čerstvý obsah a vymení ho. Platí pre každú stránku.gl-lazy-content[hx-trigger*="load"](kurz / tím / projekt / študent / dashboard / admin). Vstupná animácia sa pri revalidačnej výmene potlačí (cezdata-swr-painted), takže nedochádza k dvojitému odhaleniu; položky cache majú obmedzenú veľkosť a 10-minútovú platnosť. Toto je klientska odpoveď na „F5 spustí všetko odznova" - odpovede/dashboardostávajúno-store(bezpečnosť autentifikovaných stránok). - Verzia
2026.7.3.post19; Cache Service Workera aktualizovaná nagitpulse-v290.
[2026-07-06] - Žiadne živé volania GitLabu pri renderovaní stránok, dashboard ukazuje zlyhané synchronizácie a neplatný token 2026.7.3.post18
Opravené
- Stránka študenta už pri renderovaní nevolá GitLab naživo. Sťahovala až 12 detailov pokrytia pipeline + avatar používateľa pri každom načítaní, čo stránku spomaľovalo (a zasekávalo pri neplatnom 401 tokene). Teraz sa renderuje výlučne z uložených dát - pokrytie dopĺňa synchronizácia + webhooky a znovu sa použije z existujúcej DB zálohy podľa SHA; avatar z uloženej hodnoty alebo z URL vzoru. Dáta sa na každú stránku dostávajú len cez synchronizáciu + webhooky, nikdy volaním API pri renderovaní.
- „Follow the latest updates" teraz ukazuje ZLYHANÉ úlohy (napr. synchronizáciu zablokovanú neplatným tokenom). Feed dopytoval len
completedúlohy, takže každé zlyhanie bolo skryté; zlyhané úlohy sa teraz zobrazujú s ikonou výstrahy a označením „… failed". - Lepiaci panel akcií v Nastaveniach kurzu už nenecháva tenký svetlejší prúžok úplne dole - kompenzoval 8px padding, ale spodný padding
.gl-page-contentje 12px, takže posledné ~4px presvitali. Teraz kompenzované na 12px.
Pridané
- „Items that need your attention" zobrazí položku „neplatný GitLab token", keď je token odmietnutý (číta zo zdieľaného cachovaného príznaku zdravia - žiadny živý probe pri renderovaní) s odkazom na Systémové nastavenia na rýchlu aktualizáciu.
Zmenené
- Verzia
2026.7.3.post18; Cache Service Workera aktualizovaná nagitpulse-v289.
[2026-07-06] - Tlačidlo Sync na skupine/projekte sa už nezasekáva bez časovača, zjednotené správy o zlyhaní 2026.7.3.post17
Opravené
- Tlačidlo Sync na skupine / projekte sa už nezasekne zablokované bez časovača cooldownu po zlyhaní synchronizácie (napr. neplatný 401 token). Príčina: synchronizácia registruje globálnu úlohu a jej dokončenie s chybou spustilo uvoľnenie process-locku (
unlockElement), ktoré vyčistilo práve nastavený cooldown - odpočet zmizol a tlačidlo mohlo ostať zablokované.unlockElementuž nevyčistí aktívny cooldown ani znovu nepovolí tlačidlo, ktoré cooldown drží. Odpočet teraz prežije a tlačidlo sa samo obnoví na každej stránke (stránka kurzu unikla chybe len vďaka skorému návratu pri neplatnom tokene, ktorý úlohu neregistruje). - Správy o zlyhaní synchronizácie sú teraz konzistentné na kurze / skupine / projekte. Zdieľané
GP.syncErrorMessage(err)vráti pri 401 podrobný text „GitLab API token je neplatný alebo vypršal (401)…" (už preložený) namiesto strohého „Synchronizácia zlyhala", ktoré ukazovali stránky skupiny/projektu.
[2026-07-06] - Cachovanie GitLab panelov, žiadny duplikátny banner na skupine, zjednodušený a zjednotený sync 2026.7.3.post16
Opravené
- Synchronizácia projektu pri úspechu chybne hlásila „Synchronizácia skupiny dokončená" - teraz hlási „Synchronizácia dokončená", zodpovedajúc synchronizovanej entite (skupina vs projekt).
- Horný pruh načítania už neostáva zaseknutý na 100 %, keď počas jeho miznutia začne nová požiadavka.
start()teraz plynulo pokračuje ako jeden súvislý indikátor namiesto zaseknutia na konci a následného vyskočenia nového pruhu.
Zmenené
- Banner „Data may be outdated" (webhooky / neaktuálne dáta) sa už neduplikuje na stránke skupiny - je to upozornenie na úrovni kurzu a už sa zobrazuje na stránke kurzu.
- Synchronizácia skupiny zbavená mŕtveho kódu sync-modalu. Ten modal bol z šablón odstránený už dávno (všetko sync UI teraz vlastní globálny job bar), takže jeho
getElementByIdvolania boli no-op; synchronizácia skupiny je teraz iba cez pruh ako synchronizácia projektu a obe používajú rovnaké generické správy. - GitLab panely (chránené vetvy, prispievatelia, štatistiky repozitára, míľniky, releasy, štítky) sú teraz pod HTTP cachovaním. Ich odpovede nesú
Cache-Control: private, max-age=300+ETagodvodený z obsahu a stránka projektu ich revaliduje podmienenou požiadavkou (cache: no-cache) namiesto pôvodnéhono-storeplného sťahovania - nezmenený snapshot tak vráti beztelové304a opakované návštevy/obnovenia idú z cache prehliadača. - Verzia
2026.7.3.post16; Cache Service Workera aktualizovaná nagitpulse-v287.
[2026-07-06] - Tlačidlo Sync sa už nezasekáva na „Wait 1s" na iných stránkach, plynulé bannery, tabuľky podľa GitLab, práca medzi kartami 2026.7.3.post15
Opravené
- Tlačidlo Sync / Run Checks sa už nezasekáva na „Wait 1s" po zlyhaní na stránkach tímu, projektu a jednotlivých skupín. Príčinou bol race medzi anti-spam cooldownom a
setButtonLoadingodataset.originalText, keď požiadavka zlyhá rýchlo (< 400 ms, t. j. 401 neplatný token): odložený reset minimálneho trvania sa spustil uprostred odpočítavania a zmazal uloženú menovku, takže cooldown nedokázal obnoviť tlačidlo. Stránka kurzu unikla iba vďaka skorej kontrole tokenu; ostatné stránky išli cez problematickú cestu. Opravené v zdieľanom jadre, takže je to vyriešené na všetkých stránkach naraz. - Odpočítavanie cooldownu pri zlyhaní sa teraz zobrazuje na každom synchronizačnom tlačidle (Sync All kurzu, synchronizácia skupiny, tímu aj projektu), nielen na niektorých.
Zmenené
- Bannery („Data may be outdated" / neplatný GitLab token / zlyhaná synchronizácia) sa teraz plynulo rozbaľujú a zbaľujú (animovaná výška + priehľadnosť) namiesto skoku obsahu. Zatvorený banner ostáva zatvorený medzi kartami, po obnovení stránky aj v iných kartách prehliadača (uložené v
localStorage). - Dátové tabuľky teraz presne kopírujú oficiálny komponent tabuliek GitLab Pajamas: hlavička aj bunky používajú 16px (
gl-p-5) padding a zhustený variant je presne polovica (8px). - Pri viacerých otvorených kartách vlastní synchronizačné opytovania/SSE jedna viditeľná „líder" karta (fail-open
localStoragelízing); ostatné karty zrkadlia stav cez storage udalosti. Odstraňuje to duplicitné/sync/activerequesty, nezosúladené pruhy priebehu a duplicitné toasty medzi kartami. Osamotená karta vždy vedie, takže jedna karta nie je nikdy ovplyvnená. - Verzia
2026.7.3.post15; Cache Service Workera aktualizovaná nagitpulse-v286.
[2026-07-04] - Cooldown sa už nezasekáva na „Wait 1s", slovenský preklad, na všetkých Run Checks tlačidlách 2026.7.3.post14
Opravené
- Anti-spam cooldown tlačidla sa už nezasekáva na „Wait 1s". Odpočítavací tik (200 ms) sa sám vylieči: keď čas vyprší, vyčistí cooldown a obnoví tlačidlo, takže stratený/obmedzený
setTimeoutho už nemôže nechať zaseknuté. - „Wait" je teraz preložené (slovensky
Počkajte), takže odpočítavanie cooldownu už nie je iba anglicky na slovenskom rozhraní. - Cooldown pri zlyhaní teraz pokrýva každé tlačidlo Run Checks (kurz / tím / projekt cez zdieľaný
runScopedChecksProcess), konzistentne s tlačidlami Sync.
Zmenené
- Verzia
2026.7.3.post14; Cache Service Workera aktualizovaná nagitpulse-v285.
[2026-07-04] - Horný pruh načítania: spoľahlivé zosúladenie s reálnou sieťovou aktivitou 2026.7.3.post13
Opravené
- Horný pruh načítania - zásadne odlišná oprava. Namiesto naháňania každého spôsobu, akým sa počítadlo
pending(riadené udalosťami) môže zaseknúť (prevented submit ako Import s prázdnou URL, zmeškané/duplicitné htmx udalosti, klik ktorý spustí „navigáciu" ktorá nenaviguje), sa pruh zosúladí s REÁLNOU sieťovou aktivitou:window.fetchaXMLHttpRequestsú obalené tak, že počítadlo životného cyklu požiadaviek (.finally/loadendvždy spustia) sleduje, čo je skutočne v lete, a reconciler každých 250 ms dokončí pruh ~1,2 s po dokončení poslednej reálnej požiadavky.
Zmenené
- Verzia
2026.7.3.post13; Cache Service Workera aktualizovaná nagitpulse-v284.
[2026-07-04] - Tlačidlo Sync sa uvoľní bez obnovenia, horný pruh načítania sa už nezasekáva 2026.7.3.post12
Opravené
- Tlačidlo Sync / Run Checks sa teraz uvoľní BEZ obnovenia stránky. Strážca vypršania ghostov bežal iba kým bola úloha viditeľná v pruhu, takže skrytý ghost sa nikdy neodstránil a tlačidlo zostalo zablokované až do manuálneho obnovenia. Strážca teraz beží kým existuje AKÁKOĽVEK úloha; ghost bez reálneho backend job_id sa odstráni ~15 s po načítaní a synchronizácie tímu/projektu už nededia 45-min cap kurzu.
- Horný pruh načítania sa už nezasekáva na ~99 %. Race spôsobil, že generický htmx handler započítal
.gl-lazy-contentrequest, ale preskočil jeho dekrement, takže pruh ostal 120 s. Lazy requesty teraz počíta výhradne lazy bridge. - Objavenie pruhu úloh je plynulejšie (znížená cieľová výška, aby prechod pokryl celú animáciu).
Zmenené
- Toasty medzi kartami sa v pozadí potlačia; completion toasty vo fronte sú deduplikované podľa úlohy.
- Verzia
2026.7.3.post12; Cache Service Workera aktualizovaná nagitpulse-v283.
[2026-07-04] - Neutrálny avatar, opravený feed aktivity, plynulé bannery 2026.7.3.post11
Opravené
- Tlačidlo Sync / Run Checks sa už nezasekáva na stránkach projektu a skupiny (ani na inom skoupe). Globálny job bar zosúlaďoval s
/sync/activeiba ghosty na úrovni kurzu; ghost synchronizácie na úrovni tímu/projektu obnovený z localStorage bol preskočený, takže držal tlačidlo zablokované celý svoj maxAge (až 45 min) aj keď server hlásil nič aktívne - a prežil obnovenia stránky, lebo localStorage pretrváva. Zosúladenie teraz pokrýva aj ghosty tímu/projektu (podľa ich kurzu). - Iniciály v avatare už nie sú na fialovom kruhu - avatar v hornej lište aj v pozdrave používajú neutrálnu bridlicovú farbu (
--gl-gray-700). - Feed „Follow the latest updates" už nestráca záznamy. Obnova na pozadí (a) nikdy nenahradí naplnený feed prázdnym stavom „žiadna aktivita" (prechodný výpadok alebo tichá chvíľa predtým zmazali všetky viditeľné riadky) a (b) zachová stav „Zobraziť všetko" namiesto zbalenia späť na 5.
- Stavové pruhy už netrhajú stránkou pri objavení. Globálny job bar sa plynulo otvára cez
max-heighttransition+@starting-style(nie keyframe - zachovaný kontrakt deterministického odstránenia), a health banner rastie cezmax-heightnamiesto zasúvania celej výšky ceztranslateY, takže obsah pod ním uvoľní miesto plynulo.
Zmenené
- Verzia
2026.7.3.post11; Cache Service Workera aktualizovaná nagitpulse-v282.
[2026-07-03] - Tlačidlo Sync sa už nezasekáva po odmietnutej synchronizácii 2026.7.3.post10
Opravené
- Tlačidlo Sync / Run Checks už nezostáva zablokované po odmietnutej synchronizácii. Globálny job bar označí klik optimisticky ako úlohu „connecting" ešte pred potvrdením serverom; keď je synchronizácia odmietnutá (neplatný/expirovaný GitLab token, 401) alebo stránka obnovila starý stav pred POST-om, tento zástupca nemal za sebou žiadnu backend úlohu, no držal tlačidlo zablokované celé okno staleness (5-45 min) - a nekonzistentne naprieč project / team / course. Staleness guard teraz odstráni „connecting" úlohu bez reálneho
job_idpo ~15 s, takže sa tlačidlo uvoľní rýchlo a rovnako na každom skoupe. Skutočná synchronizácia vždy nesie svojejob_id, takže nie je ovplyvnená.
Zmenené
- Verzia
2026.7.3.post10; Cache Service Workera aktualizovaná nagitpulse-v281.
[2026-07-03] - Konzistentný fallback avatara naprieč povrchmi 2026.7.3.post9
Opravené
- Fallback avatara je teraz konzistentný. Avatar v pozdrave na nástenke používal starý vzor (fotka nad sivým kruhom so skrytým písmenom), takže sa líšil od avatara v hornej lište (opravený v post6) - jeden mohol blysnúť prázdny sivý kruh, druhý zobrazil značkové iniciály. Avatar v pozdrave teraz používa rovnaké vrstvenie (iniciály sú vždy prítomná základná vrstva, fotka z GitLabu ich prekrýva), takže oba degradujú rovnako.
Zmenené
- Verzia
2026.7.3.post9; Cache Service Workera aktualizovaná nagitpulse-v280.
[2026-07-03] - Odstránenie trvalého banera neplatného tokenu z project/group 2026.7.3.post8
Zmenené
- Odstránený trvalý banner
#gitlabTokenBanner, ktorý post7 pridal na stránky projektu a skupiny. Neplatný/expirovaný GitLab token tam už nezobrazuje stály banner; chyba tokenu sa objaví iba keď skutočne spustíte akciu, ktorá ho potrebuje (Sync / Import) - cez existujúci globálny progress bar + toast, jedna správa bez stáleho neporiadku. (Shimmer pri načítaní kariet inteligencie projektu z post7 zostáva.) - Verzia
2026.7.3.post8; Cache Service Workera aktualizovaná nagitpulse-v279.
[2026-07-03] - Jednotné správanie project/group ako na kurze pri neplatnom GitLab tokene 2026.7.3.post7
Opravené
- Stránky projektu a skupiny teraz spracujú neplatný/expirovaný GitLab token rovnako ako stránka kurzu: jeden trvalý banner
#gitlabTokenBannervysvetlí 401 raz a tlačidlá Sync / Run Checks zostanú klikateľné namiesto zaseknutia v neaktívnom stave. - Klik na Sync pri známom neplatnom tokene sa teraz skratuje (nespustí odsúdenú úlohu, ktorá nechávala tlačidlo zaseknuté a duplikovala chybu ako banner aj toast) - zobrazí jednu správu.
- Karty GitLab inteligencie na stránke projektu (Chránené vetvy / Prispievatelia / Štatistiky repozitára) zobrazujú počas načítania živých dát „shimmer" namiesto predčasného prázdneho stavu „No contributors yet".
Zmenené
- Verzia
2026.7.3.post7; Cache Service Workera aktualizovaná nagitpulse-v278.
[2026-07-03] - Konsolidácia verzie a finálne release testy 2026.7.3.post6
Opravené
- Stavový banner: upozornenie „GitLab server je momentálne nedostupný" sa už po zatvorení znova neobjavuje (predtým ho každý úspešný health-check aplikácie potichu obnovil, keďže zdieľal príznak zatvorenia s bannerom zdravia aplikácie) a časovač „Naposledy pripojené" teraz beží živo namiesto zamrznutia.
- Avatar v hornej lište sa počas načítania profilovej fotky z GitLabu (alebo keď je GitLab nedostupný) zobrazí ako iniciály namiesto prázdneho sivého kruhu.
Zmenené
- Verzia
2026.7.3.post6; Cache Service Workera aktualizovaná nagitpulse-v277. - Overenie kvality kódu v pracovnom prostredí a spustenie celej sady testov pred vydaním.
[2026-07-03] - Zjednodušenie priradenia kategórií v tabuľke členov projektu 2026.7.3.post5
Refaktorované
- Zjednodušenie logiky priraďovania kategórií členov v
_members_table.htmlprojektu na odstránenie vetvenia pre vylúčených členov (konzistentne s detailmi skupiny).
Zmenené
- Verzia
2026.7.3.post5; Cache Service Workera aktualizovaná nagitpulse-v276.
[2026-07-03] - Zjednodušenie prázdnych stavov v detailoch projektu 2026.7.3.post4
Refaktorované
- Zlúčenie a zjednodušenie redundantných vetiev volania makra
empty_statev čiastkových šablónach detailov projektu:_docker_verification.html,_ci_scenarios.htmla_conflict_challenges.html.
Zmenené
- Verzia
2026.7.3.post4; Cache Service Workera aktualizovaná nagitpulse-v275.
[2026-07-03] - Odstránenie duplicitnej kohortovej filtrácie a zjednodušenie priradení 2026.7.3.post3
Refaktorované
- Odstránenie prebytočného záložného cyklu v šablóne
_issues_to_address.html. Teraz sa výlučne používa zoznamscored_studentsvypočítaný na strane Pythonu. - Zjednodušenie logiky priraďovania kategórií členov v
_detail_content.htmlskupiny na odstránenie vetvenia pre vylúčených členov.
Zmenené
- Verzia
2026.7.3.post3; Cache Service Workera aktualizovaná nagitpulse-v274.
[2026-07-03] - Refaktoring duplicitného kódu v zoznamoch zmien súborov 2026.7.3.post2
Refaktorované
- Extrakcia duplicitného HTML kódu pre tlačidlá súborov v strome diffov v šablóne detailov študenta (
student.html) do jedného makradiff_file_tree_item, čo odstránilo duplicitu v rekurzívnych uzloch stromu a v tele diffu.
Zmenené
- Verzia
2026.7.3.post2; Cache Service Workera aktualizovaná nagitpulse-v273.
[2026-07-03] - Refaktoring duplicitných odkazov na dôkazy v analýze MR 2026.7.3.post1
Refaktorované
- Presun duplicitných blokov HTML pre odkazy na GitLab dôkazy v šablóne AI analýzy MR (
_ai_analysis.html) do jedného makrarender_evidence_link, čím sa odstránili trojité duplicity v sekciách Silné stránky, Potenciálne problémy a Kvalita spolupráce.
Zmenené
- Verzia
2026.7.3.post1; Cache Service Workera aktualizovaná nagitpulse-v272.
[2026-07-03] - Rozsiahly refaktoring nastavení kurzu do modulárnych častí 2026.7.3
Refaktorované
- Dekompozícia celej šablóny nastavení kurzu
course_settings.htmlna modulárne čiastkové zahrnutia (_basic_settings.html,_webhook_settings.html,_compliance_settings.html,_weekly_deadlines.html,_sandbox_settings.html,_ai_settings.html,_import_export_settings.html), čím sa znížil počet riadkov kódu hlavnej šablóny z 580 na menej ako 100.
Zmenené
- Verzia
2026.7.3; Cache Service Workera aktualizovaná nagitpulse-v271.
[2026-07-03] - Reštrukturalizácia nastavení a oprava rozloženia alertu 2026.7.2.post17
Opravené
- Oprava zalamovania textu a rozloženia bloku alertu „Scope cascade“ na stránke nastavení kurzu.
Refaktorované
- Extrahovanie nastavení semestra do opakovane použiteľných Jinja makier a čiastkových šablón (
_semester_settings.htmla_settings_form_macros.html) na minimalizáciu duplicity kódu.
Zmenené
- Verzia
2026.7.2.post17; Cache Service Workera aktualizovaná nagitpulse-v270.
[2026-07-02] - Obnovený zelený lint, tabuľky členov len so študentmi, cesta projektu s názvami 2026.7.2.post16
Opravené
- Obnovená zelená lint fáza na
main(commit post15 zlyhal v CI): preformátovanie cezruff formata oprava mypy vmember_sync_service.py(opakovane použitá premenná cyklu dostala Optional). - Tabuľky Members a Group Members zobrazujú len ŠTUDENTOV - nikdy nie učiteľov, mentorov ani Project Managera. Kohorta podľa issues mohla zatiahnuť PM, ktorý vytvoril issues; oba zoznamy teraz vynechajú kohokoľvek označeného ako učiteľ/mentor.
- Hlavička projektu zobrazuje cestu s názvami v štýle GitLabu (
... / ApI 7 (Maťaš - Antypenko) / Chekanov ... - Míny) namiesto surového slugu (.../api-7-ma-a-antypenko/mines-12770). - Verzia
2026.7.2.post16; Service Worker cache nezmenená (gitpulse-v269).
[2026-07-02] - Žiadne protichodné sync toasty, kohorta podľa issues, čistejšia hlavička Issues 2026.7.2.post15
Opravené
- Course "Sync All" už nezobrazuje protichodnú dvojicu toastov. Optimistický zelený "Sync started..." sa spustil pred vyriešením požiadavky, takže odmietnutá synchronizácia (neplatný token / GitLab offline) ukázala "started" AJ "failed" naraz. Global bar "Connecting to GitLab..." už signalizuje začiatok a končí buď priebehom, alebo jednou chybou - predčasný toast je odstránený na course-detail aj course-analytics.
- Kohorta členov projektu teraz počíta aj účasť na issues (autor / priradený / spolupriradení), nielen aktivitu merge requestov, takže spoluhráč, ktorý otvoril issues, ale ešte neautoroval MR, už nevypadne ("zobrazení 4, ale 5 v tíme").
- Hlavička Issues to Address zobrazuje len akčný počet High; štítky Medium/Low pôsobili ako bezvýznamné bledé číslo ("8"/"45") a boli nadbytočné voči grafu a legende nižšie.
- Verzia
2026.7.2.post15; Service Worker cachegitpulse-v269.
[2026-07-02] - Projektové dáta z databázy a jednotný progress procesov 2026.7.2.post14
Opravené
- Detail projektu a živé obnovenie už nechodia priamo do GitLabu, aby rozhodli o členoch, štatistikách, prispievateľoch a chránených vetvách. Čítajú uložený snapshot
gitlab_intel, staršie projekty vedia odvodiť z uloženej MR aktivity a pri tímoch s viacerými projektmi už nespadnú na celú podskupinu. Tým miznú fantómoví študenti a nesprávne počty v Issues to Address pri neplatnom tokene alebo nedostupnom GitLabe. - Ručný sync projektu teraz pred spracovaním issues/MR/poznámok doplní členov daného GitLab projektu do jeho skupiny, takže direct členovia projektu nezmiznú až do plného syncu skupiny.
- Progress a chyby pre Sync a Run Checks sú zjednotené pre project, group aj course scope: neplatný token alebo odmietnutá požiadavka skončí ako viditeľná chyba v globálnom progress bare aj ako toast, a Run Checks používa jednu SSE/polling cestu.
- Webhooky teraz enqueue-ujú debounce refresh uloženého GitLab intelligence snapshotu, takže project intelligence ostáva napojená na sync/webhook mechaniku.
- Verzia
2026.7.2.post14; Service Worker cachegitpulse-v268.
[2026-07-02] - Zarovnanie hlavičky "Actions" a čitateľné štítky Issues 2026.7.2.post13
Opravené
- Tabuľka členov: hlavička "Actions" je zarovnaná doprava, takže sedí nad tlačidlami riadku (oko + View) namiesto toho, aby unikala doľava širokého stĺpca. Platí pre živú tabuľku aj jej skeleton.
- Štítky v hlavičke Issues to Address: počty Medium (jantár) a Low (modrá) sa strácali na tmavej hlavičke karty - viditeľné boli len dve bledé čísla ("45"). Teraz sú to tučné, orámované čipy, takže každý počet a jeho označenie zostávajú čitateľné vedľa štítku High (červená).
- Verzia
2026.7.2.post13; Service Worker cachegitpulse-v267.
[2026-07-02] - Tlačidlo Sync už nezostane zablokované pri odmietnutej synchronizácii 2026.7.2.post12
Opravené
- Tlačidlo Sync na projekte už nezostane zablokované (bez nutnosti obnoviť stránku), keď je synchronizácia odmietnutá - napr. neplatný/vypršaný GitLab token vracajúci 503. Handler registroval fantómový slot "sync beží" ešte pred potvrdením požiadavky; odmietnutá požiadavka ho nikdy neuvoľnila, takže process-lock držal tlačidlo zablokované. Optimistický slot je odstránený - reálny slot priebehu sa registruje až po tom, čo server vráti job id, a pri zlyhaní sa tlačidlo znovu aktivuje s jasnou správou.
- Verzia
2026.7.2.post12; Service Worker cachegitpulse-v266.
[2026-07-02] - Tabuľka členov projektu ukazuje projekt, nie celú podskupinu 2026.7.2.post11
Opravené
- Tabuľka členov projektu a jej skórovacia kohorta pre Issues to Address sa teraz obmedzujú na študentov TOHTO projektu namiesto všetkých študentov nadradenej podskupiny. GitPulse "tím" zodpovedá GitLab podskupine, ktorá môže obsahovať viacero projektových repozitárov, takže tabuľka jedného projektu ukazovala celú sekciu (~50) namiesto reálnych ~5. Keď živé načítanie členov nie je dostupné (vypršaný token / údržba GitLabu), stránka obnoví reálny zoznam z uložených dát - zoznam uložený pri poslednej synchronizácii, inak odvodený z uloženej aktivity merge requestov (autori, priradení, recenzenti, schvaľovatelia) - takže je správny aj pred novou synchronizáciou.
- Skórovanie počíta študenta ako člena projektu bez ohľadu na zdroj členstva v GitLabe (direct ALEBO inherited): reálny prispievateľ už nevypadne zo skóre skupiny len preto, že jeho zdroj na úrovni tímu je 'inherited'. Skóre odráža skutočnú kohortu projektu, nielen zobrazené riadky.
- Verzia
2026.7.2.post11; Service Worker cache nezmenená (gitpulse-v265) - zmena len na backende.
[2026-07-02] - Oprava zarovnania a pridané upozornenie v skeletoch 2026.7.2.post10
Opravené
- Opravili sme zarovnanie stĺpca Akcie v skeletoch aj v živej tabuľke členov (zabránili sme pretekaniu tlačidiel).
- Pridali sme statickú poznámku o aktívnych členoch z GitLabu do študentských zobrazení skeletov aj živých tabuliek.
- Verzia
2026.7.2.post10; Service Worker cachegitpulse-v265.
[2026-07-02] - Zjednodušenie tabuliek členov skupín a projektov 2026.7.2.post9
Opravené
- Zjednodušili sme tabuľky členov skupín a projektov odstránením prebytočných stĺpcov Rola, Zdroj a Stav a zrušením filtračného panelu. V tabuľke sa teraz zobrazujú iba skutoční študentskí členovia priradení v databáze.
- Vylepšili sme stĺpec Pipeline v tabuľke členov skupiny: čísla sú teraz farebne odlíšené (zelená pri plnom úspechu, červená pri zlyhaní) a po prejdení myšou sa zobrazí vysvetľujúci tooltip.
- Verzia
2026.7.2.post9; Service Worker cachegitpulse-v264.
[2026-07-02] - Panely inteligencie prežijú nedostupný GitLab 2026.7.2.post8
Pridané
- Karty GitLab inteligencie projektu (chránené vetvy, prispievatelia, štatistiky repozitára) teraz pri každej synchronizácii ukladajú snapshot (
gitlab_projects.gitlab_intel) a stránka sa naň per-karta vráti, keď živé načítanie z GitLabu zlyhá. Boli to jediné dáta na stránke bez uloženej zálohy, takže ako jediné padali na "GitLab is unreachable", keď vypršal token - teraz naďalej zobrazujú posledné synchronizované hodnoty (užitočné počas údržby GitLabu 3.-5. júla).
Opravené
- Karty inteligencie sa už pri zlyhaní živého obnovenia nevymažú na "GitLab is unreachable" - posledný snapshot zostáva viditeľný.
- Tabuľka Skupiny už nepretečie svoju kartu: vymazané riadky skupín majú široké tlačidlá "Restore" / "Remove from deleted", ktoré nútili celú tabuľku s pevným rozložením posúvať sa do strany; tieto tlačidlá sa teraz zalamujú v stĺpci akcií (aktívne riadky bez zmeny).
- Verzia
2026.7.2.post8; Service Worker cachegitpulse-v263; Alembic migrácia008pridáva stĺpecgitlab_intel.
[2026-07-02] - Štýlované tooltipy, trvalé zatvorenie bannerov a zarovnané riadky 2026.7.2.post7
Opravené
- Tooltipy sú teraz vždy štýlovaný komponent (Tippy), nikdy natívny
title=popup prehliadača: prevedené boli makrábtn/btn_icon, tlačidlo na zatvorenie info-card, prepínač kontrol a sync-lock save tlačidlá v nastaveniach predmetu, indikátor stavu servera na prihlásení, lokalizované<time>značky aj akcie riadku skupiny vkladané cez JavaScript. - Zatvorené bannery zostanú zatvorené: krížik info-card si zapamätá zatvorenie na reláciu (podľa bannera a aktuálneho stavu), takže "synchronizácia zlyhala" / "synchronizácia zrušená" / "údaje môžu byť neaktuálne" sa už po odchode a návrate znovu neobjaví.
- Horný pruh načítania ani odosielacie tlačidlá sa už po zlyhaní validácie nezaseknú - napríklad pridanie skupiny s jednoznakovým názvom vyčistí pruh a nezapne anti-spam zámok tlačidla, takže nič nevisí až do obnovenia stránky.
- Nové riadky skupín pridané po vytvorení kopírujú responzívne triedy stĺpcov serverovej tabuľky (
col-hide-sm/col-hide-md, vycentrovaný Stav), takže sa na úzkych obrazovkách už nevychýlia zo zarovnania; prvá skupina v predmete sa načíta nanovo, aby vykreslila kanonickú tabuľku. - Doplnené slovenské preklady reťazcov trvalého odstránenia / "Odstrániť z vymazaných", čím sa počet chýbajúcich prekladov vrátil na nulu.
- Verzia
2026.7.2.post7; Service Worker cachegitpulse-v262.
[2026-07-02] - Konzola, modálky a spoločné role badge 2026.7.2.post6
Opravené
- Detail predmetu znovu dodáva platný JavaScript: prepínač zmazaných skupín je správne naviazaný, Run Checks používa spoločný confirmation callback a stránka už nespadne pred exportom svojich akcií.
- Biela obruba avatara je obmedzená iba na veľký dashboard greeting avatar; topbar avatar ostáva bez rámika.
- Role pill v používateľskom menu používa spoločný role badge komponent a farby ako tabuľka User Management.
- GitLab import aj ostatné modálky pred otvorením resetujú vnútorný scroll, držia backdrops pod
<body>a neodkladajú zobrazenie scrollbar-u až po prvom animačnom frame. - PWA install handler už nevolá
preventDefault()na natívny Chromium install banner, pokiaľ nie je explicitne zapnutý custom prompt. - Verzia
2026.7.2.post6; Service Worker cachegitpulse-v261.
[2026-07-02] - Trvalé odstránenie, roly v menu a oprava layoutu 2026.7.2.post5
Pridané
- Možnosť trvalého odstránenia („Remove from deleted“) pre neaktívne skupiny a projekty. Učitelia a administrátori môžu teraz úplne vymazať zmazané skupiny alebo projekty a všetky ich pridružené záznamy (členstvá, snapshots, pipelines, MR, commity, issues, LLM logy a na pozadí bežiace úlohy) zo systému.
Opravené
- Opravené rozloženie (layout) pre mobilné zariadenia a tablety: hlavný kontajner obsahu ostáva zaoblený s 8px okrajmi a neroztiahne sa na celú šírku obrazovky.
- Odstránená duplicitná avatar ikona z hlavičky používateľského menu.
- Nahradený nefunkčný stavový riadok „Coding my life“ za zobrazenie reálnej roly používateľa (Admin, Teacher, Student) formou status-badge.
- Odstránené zakázané tlačidlo „Deleted“ zo skeletons načítania.
- Verzia
2026.7.2.post5; Service Worker cachegitpulse-v260.
[2026-07-02] - Validácia názvu skupiny, rýchlejšie načítanie, opt-in dirty-check 2026.7.2.post4
Opravené
- Pridanie skupiny teraz validuje názov: prázdny alebo jednoznakový vstup (napr. „ф") sa odmietne na klientovi aj na serveri (
TeamCreateoreže medzery a vyžaduje aspoň 2 znaky), takže sa už nedá vytvoriť nezmyselná skupina, ktorá potom zmizne. - Rýchlejšie načítanie: endpoint stavu synchronizácie ani SSE stream už pri každom pollingu/pripojení nezisťujú GitLab cez sieť. Čítajú kešovaný príznak stavu tokenu (bez sieťového volania); príznak sa aj tak nastaví pri prvom 401.
- Dirty-check je teraz opt-in. Predtým každá modálka s poľom aktivovala upozornenie „máte neuložené zmeny", čo otravovalo pri jednorazových akciách (import z GitLab). Auto-init teraz pokrýva len modálky s
data-dirty-check; skutočné formuláre si ochranu ponechávajú. - Verzia
2026.7.2.post4.
[2026-07-02] - Zatvárateľné informačné banery 2026.7.2.post3
Pridané
- Informačné banery sa teraz dajú zatvoriť. Makro
info_cardprijímadismissible=truea vykreslí tlačidlo X; delegovaný, CSP-bezpečný obslužný kód kartu odstráni. Použité na banery predmetu „Some sync jobs failed", „Sync cancelled" a „Data may be outdated". - Verzia
2026.7.2.post3.
[2026-07-02] - Obnovený GitLab-štýl layoutu + oprava blikajúceho banera 2026.7.2.post2
Opravené
- Rozloženie obsahového panela obnovené na spoľahlivý GitLab model:
.gl-pagemá pevnúheight(vyplní okno) a.gl-page-contentmáflex: 1, takže panel je vždy na plnú výšku a obsah sa skroluje VNÚTRI (ako.js-static-panel/.panel-content-innerv GitLabe). Predchádzajúci pokus smax-height+flex: 0 1 autospôsoboval, že sa panel zmenšil na načítavací skeleton („polovica stránky chýba") - vrátené. - Baner „Some sync jobs failed" už neblikne a nezmizne po sekunde. Živá aktualizácia spravovala všeobecný
.info-card-danger, takže SSE tik s hodnotou 0 (jeho počet používa 2h okno) odstránil serverom vykreslený baner. Teraz spravuje LEN vlastnú živú kartu (#jsSyncFailedCard) a nikdy sa nedotkne serverového baneru ani baneru tokenu. - Verzia
2026.7.2.post2.
[2026-07-02] - Doplnené ochrany procesov 2026.7.2.post1
Opravené
- Zrušenie importu z GitLabu sa už neregistruje ako neuložená zmena formulára; tlačidlo Cancel zastaví aktívny import bez nesúvisiaceho before-unload potvrdenia.
- Čakajúce CI failure scenáre a conflict challenge sa teraz dajú zrušiť ešte pred zmenou GitLabu a polling CI scenárov beží iba vtedy, keď riadky skutočne čakajú.
- Retry zlyhanej plánovanej/manuálnej systémovej úlohy teraz vytvorí novú sledovanú a zrušiteľnú background úlohu, takže Follow the latest updates, Items that need your attention aj globálny job bar dostanú rovnaké job id.
- Kontroly aktívnych úloh teraz zahŕňajú stav
startednaprieč sync, kontrolami, importom, stavom kurzu aj plánovanými úlohami, aby sa počas RQ handoffu nespúšťali duplicity. - Live zvýraznenia hodnôt na dashboarde a detaile projektu teraz používajú requestAnimationFrame namiesto synchrónneho čítania layoutu, čím zmizol ďalší zdroj forced reflow z horúcich refresh ciest.
- Produkčné monitorovanie už nenecháva Alertmanager v reštartovacej slučke; kontajner sa teraz spúšťa s platnou internou absolútnou external URL a YAML konfiguráciou, ktorú Alertmanager vie načítať bez nepodporovanej shell-style expanzie premenných.
- Verzia
2026.7.2.post1; Service Worker cachegitpulse-v256.
[2026-07-02] - Prerušiteľné procesy a chránený import z GitLabu 2026.7.2
Opravené
- Import z GitLabu teraz odmieta neplatné cesty skupín/projektov ešte pred streamovaním; zadanie ne-ASCII vstupu už nespustí import ani nezrúti obsluhu chyby importu.
- Dlhobežiace procesy majú jednotný kontrakt zrušenia: globálne tlačidlá cancel zastavia synchronizáciu, kontroly, Docker verifikáciu, plánované úlohy, LLM analýzu, GitLab obohatenie, frontendové AI generovanie aj aktívny import. Zrušené úlohy zostávajú terminálne a workery ich už po race neprepíšu na completed/failed.
- Stav synchronizácie a kontrol v kurze hlási zrušené skupiny samostatne a používa najnovšiu úlohu kontrol pre každú skupinu, takže starý failed riadok nepokazí neskorší úspešný beh.
- Course detail SSE/logging a animácie už nevytvárajú duplicitné EventSource spojenia ani forced reflow; spodné odsadenie shellu zodpovedá výške obsahu bez prázdnej medzery.
- Verzia
2026.7.2; Service Worker cachegitpulse-v255.
[2026-07-01] - Obsahový panel sa zmenší na výšku obsahu (žiadna prázdna karta) 2026.7.1.post5
Opravené
- Obsahový panel (
.gl-page) sa teraz na krátkych stránkach zmenší na výšku obsahu (max-heightnamiesto pevnejheight) namiesto vyplnenia celej výšky okna, takže stránka s pár riadkami už nezobrazuje veľkú prázdnu zaoblenú kartu pod tabuľkou - rovnako ako panel v GitLabe. Dlhé stránky sa naďalej zastavia na výške okna a skrolujú vnútri. - Verzia
2026.7.1.post5.
[2026-07-01] - Banner neplatného tokenu sa zobrazí hneď pri načítaní 2026.7.1.post4
Opravené
- Nadväznosť na post3: banner „Neplatný GitLab token" sa teraz zobrazí už pri načítaní stránky (SSE stream aj sync-status sa prehrejú jedným kešovaným pokusom), nie až po prvom neúspešnom kliknutí. Sync All tak hneď pri prvom kliknutí zobrazí jasný tost bez blikania „Pripájanie…" a tlačidlo už nezostane v stave načítavania, ktorý si vyžadoval obnovenie stránky.
- Verzia
2026.7.1.post4.
[2026-07-01] - Banner namiesto zablokovaného tlačidla synchronizácie, izolácia testov 2026.7.1.post3
Opravené
- Stav „Neplatný GitLab token" už neblokuje tlačidlo Sync All (bolo nejasné, kedy sa odblokuje, a nekonzistentné s tlačidlom Import, ktoré fungovalo ďalej). Banner je teraz jediné jasné vysvetlenie; kliknutie na Sync All zobrazí rovnaký dôvod ako tost namiesto blikajúceho ukazovateľa „Pripájanie…", ktorý o sekundu zmizol.
- Izolácia testov: zdieľaný príznak stavu GitLab tokenu sa resetuje okolo každého testu, takže mocknutá 401 už nepretečie do neskoršieho testu — zlyhanie, ktoré sa prejavovalo len v CI so živým Redisom.
- Verzia
2026.7.1.post3.
[2026-07-01] - Odolnejšia synchronizácia a celoaplikačná ochrana GitLab tokenu 2026.7.1.post2
Opravené
- Synchronizácia už neblikala ("dokončená za 2 s a sama sa reštartovala dokola"). Zlyhaný sync sa predtým znovu vyhodil do slepého automatického opakovania RQ, čím stav úlohy prepínal
running↔faileda ukazovateľ priebehu kurzu osciloval, zatiaľ čo banner „Údaje môžu byť zastarané" vyskakoval počas synchronizácie. Sync teraz používa obmedzené, viditeľné opakovanie (3 pokusy): riadok zostáva medzi pokusmi aktívny a zobrazujeRetrying (2/3)ako odznakRETRY 2/3pri skupine; beh sa končí jasným „Všetky synchronizácie dokončené!" alebo červeným „Synchronizácia dokončená s problémami — N skupín zlyhalo" namiesto vždy hláseného úspechu. - Rozbalené karty histórie úloh už nerozbíjajú tabuľku: vložený riadok detailu sa počítal do pruhovania
:nth-child, čím prevracal tieňovanie všetkých riadkov pod ním. Teraz je z pruhovania a zvýraznenia vylúčený.
Pridané
- Celoaplikačná ochrana GitLab tokenu. Neplatný/expirovaný token (401/403) sa teraz zistí v okamihu, keď zlyhá ktorékoľvek volanie GitLab, a zdieľa sa cez kešovaný príznak stavu, takže celá aplikácia reaguje na jedno zlyhanie namiesto toho, aby každý tok samostatne zaťažoval GitLab:
- Sync, sync projektu, Sync All aj import z GitLab sú vopred zablokované s jasnou hláškou „GitLab API token je neplatný alebo vypršal (401)".
- Úlohy na pozadí (obohatenie issue/MR, synchronizácia členov, inkrementálne obnovenie projektu) sa pri známom neplatnom tokene okamžite preskočia a auth chyby neopakujú, čím sa zastavia lavíny opakovaní.
- Zotavenie je automatické: každé úspešné volanie GitLab príznak zruší, takže po výmene tokenu sa práca obnoví bez reštartu.
- Stránka kurzu zobrazí trvalý banner „Neplatný GitLab token" a počas neplatného tokenu vypne tlačidlo Sync All.
- Verzia
2026.7.1.post2.
[2026-07-01] - Copyright 2026-2027, nofollow pre jazykové odkazy, posledný príkladový dátum 2026.7.1.post1
Opravené
- Opravený copyright v pätičke dokumentácie z
2024-2026na2026-2027 TUKE Košice. - SEO: jazykové prepínacie odkazy majú teraz
rel="nofollow", aby vyhľadávače prestali indexovať tieto presmerovacie URL objavené na verejnej prihlasovacej stránke. - Obnovený posledný zastaraný príkladový dátum v pomocnom texte nastavení predmetu (šablóna aj slovenský katalóg zosynchronizované).
[2026-07-01] - Aktualizácia dokumentácie: odstránená zrušená funkcia Rubrika, obnovené dátumy 2026.7.1
Zmenené
- Odstránená zrušená funkcia "Rubrika" zo slovenských príručiek pre učiteľov (dashboard, začíname), aby zodpovedali anglickým verziám a aktuálnej aplikácii. Obnovené zastarané príkladové dátumy a cesty skupín v príručkách GitLab, operátorov a vývojárov na aktuálny rok a aktualizovaná dokumentovaná verzia na
2026.7.1.
[2026-06-30] - Prednačítanie pozadia len kde sa používa, odstránené pomlčky, aktualizované dátumy pilotu 2026.6.30.post3
Opravené
- Prihlásenie/odhlásenie: obrázok pozadia sa prednačítaval aj na mobile, kde sa žiadne pozadie nevykresľuje, takže prehliadač hlásil "preloaded but not used". Prednačítanie je teraz obmedzené na obrazovky široké aspoň 768px, kde sa pozadie naozaj zobrazuje.
Zmenené
- Aktualizovaná príručka pilotného nasadenia: dátumy posunuté na rok 2026 a zjednotené nekonzistentné formáty dátumov. Odstránené zvyškové pomlčky z niekoľkých riadkov changelogu.
- Verzia
2026.6.30.post3.
[2026-06-30] - Skutočný /favicon.ico, aby Google vo vyhľadávaní zobrazoval favikonu 2026.6.30.post2
Opravené
- Favikona vo vyhľadávaní Google: aplikácia poskytovala
/favicon.icoako presmerovanie 301 na PNG, čo prehliadač favikon od Googlu spracúva nespoľahlivo (vo výsledkoch sa zobrazoval všeobecný glóbus). Teraz vracia skutočný viacrozmerný.icos kódom 200 a indexovateľná prihlasovacia stránka ho uvádza ako prvú. Google obnovuje favikonu len pri opätovnom prehľadaní úvodnej stránky, takže sa môže objaviť až o niekoľko dní.
Zmenené
- Verzia
2026.6.30.post2.
[2026-06-30] - Spustenie sledovania v workeroch, oprava importu predmetov a produkčné odkazy monitoringu 2026.6.30
Opravené
- Stránky prihlásenia/odhlásenia: ponuka výberu jazyka, upozornenia, tosty a značka zvoleného jazyka sa zobrazovali tmavé na bielej karte, ak mal návštevník uloženú tmavú tému. Inicializácia farebného režimu teraz odvodzuje
data-themezo svetlého zámku stránky, takže všetky komponenty na týchto stránkach sú svetlé. - Pokrytie testami ukazovalo „nenahlásené“ na MR kartách študentov, hoci GitLab hlásil percento: úplná synchronizácia tímu preskakovala už dokončené pipeline, takže pipeline uložené bez pokrytia sa nikdy nedoplnili. Synchronizácia teraz znova načíta dokončené pipeline, ktoré spustili testy, ale nemajú zaznamenané pokrytie.
Pridané
- Mobilné dialógy: úchyt spodného dialógu je teraz interaktívny - potiahnutím úchytu (alebo hlavičky dialógu) nadol ho zavriete. Gesto sa aktivuje len z hornej časti, takže neprekáža posúvaniu obsahu dialógu.
Zmenené
- Verzia
2026.6.30.post1.
[2026-06-30] - Spustenie sledovania v workeroch, oprava importu predmetov a produkčné odkazy monitoringu 2026.6.30
Opravené
- Konfigurácia Redis poolu vo workeri: vyriešená výnimka
RuntimeErrorpri spracovaní úloh inicializáciou globálneho zdieľaného Redis poolu pri štarte RQ workerov. - Skript na import nastavení predmetov: odstránené neexistujúce importy a volania (
_apply_gaming_detection,_apply_rubric_from_config), čo zaručilo bezproblémový import fixture dát pre predmety ZSI a DevOps. - Observability: nastavený OTLP endpoint v lokálnom prostredí na lokálny zberač Jaeger, čím sa sprevádzkovalo lokálne trasovanie.
- Dokumentácia monitoringu: do príručiek pre operátorov (SK/EN) boli pridané presné adresy, porty a prihlasovacie údaje pre produkčné prostredia Grafana, Prometheus a Jaeger na uľahčenie manuálnej kontroly.
[2026-06-29] - Oprava chýb dev-prostredia, overovania Redis a presmerovania Grafany 2026.6.29.post12
Opravené
- Ošetrenie chýb v
start-dev.ps1: odstránená premenná$ErrorActionPreference = "Stop", ktorá spôsobovala pád celého skriptu pri bežných pip varovaniach pri zostavovaní dokumentačného kontajnera. - Slučka presmerovania Grafany: vyriešené presmerovanie
localhost:3000na produkčnú HTTPS doménu nastavenímGF_SERVER_ROOT_URLnahttp://localhost:3000/grafana/v override súboredocker-compose.monitoring-dev.yml. - Vyčistenie zastaraných metrík: odstránené nepoužívané panely z Grafany ("Report Generation Time", "Sweep Jobs", "Sweep Job Duration", "Active Dashboard Sessions") a zrušené neplatné Prometheus varovania ("ReportGenerationSlow", "SweepJobFailing"), pretože ich funkcie v kóde neexistujú.
- Zber metrík Grafany: pridaná cesta
metrics_path: /grafana/metricspre Grafana úlohy vprometheus.ymlajprometheus.dev.yml, aby sa predišlo chybám kvôli presmerovaniam. - Produkčné Redis poverenia: do
.env.productionboli doplnené premennéREDIS_PASSWORDa autorizovaný formátREDIS_URL, čím sa zabránilo havárii aplikácie pri prísnych produkčných bezpečnostných kontrolách.
Zmenené
- Verzia
2026.6.29.post12.
[2026-06-29] - Zelený lint a prístupnejšie záložky „Rýchly prístup" 2026.6.29.post11
Opravené
- Obnovený zelený lint krok CI. Dnešné rýchle leštiace commity priniesli na
mainštyri porušeniaruffa tri odchýlkyruff format(pripnutýruff==0.15.4), takže brányruff-check/ruff-formatboli červené:f-reťazec bez zástupných znakov, neusporiadaný import blok,SIM108if/else v pomocníkovi diff kontextu a príliš dlhý assert. Opravy zachovávajú správanie; celá jednotková sada (2512) ostáva zelená.
Zmenené
- Prístupnosť: prepínače „Skupiny"/„Podskupiny" v paneli „Rýchly prístup" sú teraz skutočné záložky -
type="button",role="tablist"/role="tab"a viazanéaria-selectedpre čítačky obrazovky. Iba šablóna. - Verzia
2026.6.29.post11.
[2026-06-29] - Odstránené N+1 v hromadnom sync / run-checks 2026.6.29.post10
Zmenené
- Backend: koncové body „Spustiť kontroly (všetky skupiny)“ a „Synchronizovať všetky skupiny“ už nespúšťajú jeden SELECT na skupinu pri kontrole prebiehajúcich úloh - oba teraz používajú jeden dávkový dopyt s preukázateľne rovnakým výsledkom. Pre predmet s N skupinami to odstráni až 2N zbytočných round-tripov. Bez zmeny správania (celý unit test suite zelený).
- Verzia
2026.6.29.post10.
[2026-06-29] - Preconnect na GitLab aj na prihlasovacej stránke 2026.6.29.post9
Zmenené
- Rozšírený
preconnect/dns-prefetchhint na GitLab aj na samostatnú prihlasovaciu stránku - jej hlavné tlačidlo je OAuth presmerovanie na GitLab, takže zahriatie spojenia vopred skráti presmerovanie o jeden round-trip. Len resource hint. Bez zmeny statických súborov či Service Worker cache. - Verzia
2026.6.29.post9.
[2026-06-29] - Preconnect na GitLab pre rýchlejší prvý kontakt 2026.6.29.post8
Zmenené
- Frontend optimalizácia: základná
<head>teraz preconnectuje (+ dns-prefetch) na GitLab origin (zo settingugitlab_url, nie natvrdo). Prihlasovacie tlačidlo presmeruje na GitLab kvôli OAuth a prihlásené stránky načítavajú avatary + volajú jeho API, takže zahriatie spojenia vopred skráti prvý kontakt o jeden round-trip. Len resource hint - nemôže ovplyvniť vykresľovanie. Bez zmeny statických súborov či Service Worker cache. - Verzia
2026.6.29.post8.
[2026-06-29] - Vynechané nepoužité počty na nástenke pre študentov 2026.6.29.post7
Zmenené
- Backend nástenky: domovská stránka a
/dashboard/statsuž pre študentov nespúšťajú dopyty na „počet skupín“ a „počet študentov“ - tie napĺňajú len karty učiteľa/admina. O dva databázové dopyty menej pri každom načítaní nástenky študenta a obnove štatistík. Bez viditeľnej zmeny. - Vydanie len pre backend: nezmenili sa žiadne statické súbory, takže Service Worker cache zostáva na
gitpulse-v247. - Verzia
2026.6.29.post7.
[2026-06-29] - Vypnuté postupné objavenie (cascade) do revízie 2026.6.29.post6
Zmenené
- Vypnuté postupné objavenie („cascade“) na nástenke a profile študenta - zhoršovalo tieto zobrazenia v produkcii. Engine zostáva v kóde a bude znovu zapnutý až po vizuálnom overení v prehliadači.
- Verzia
2026.6.29.post6; Service Worker cachegitpulse-v247.
[2026-06-29] - Postupné objavenie kariet na profile študenta 2026.6.29.post5
Pridané
- Postupné objavenie („cascade“) rozšírené na profil študenta: karty merge requestov a karty „recenzie pre kolegov“ sa teraz načítavajú postupne jedna za druhou pri prvom zobrazení, rovnako ako na nástenke.
Zmenené
- Pridaný test konzistencie verzie vydania, ktorý kontroluje, že verzia v
pyprojectzodpovedá najnovšiemu záznamu vo všetkých changelogoch (root + docs SK/EN), takže bump verzie už nemôže ticho aktualizovať len jeden súbor. - Verzia
2026.6.29.post5; Service Worker cachegitpulse-v246.
[2026-06-29] - Postupné objavenie dlaždíc nástenky, relatívny čas, oprava sprievodcu 2026.6.29.post4
Pridané
- Postupné objavenie (cascade): dlaždice na nástenke (KPI štatistiky, karty predmetov, „Položky vyžadujúce pozornosť" a feed „Najnovšie aktualizácie") sa teraz načítavajú postupne jedna za druhou - „podľa príchodu" - namiesto toho, aby naskočili všetky naraz. Rešpektuje
prefers-reduced-motiona spúšťa sa len pri prvom zobrazení (odovzdanie zo skeletonu / prvé vykreslenie), nie pri živom obnovovaní (žiadne blikanie). Riadky tabuliek sú zámerne vynechané. - Relatívne formátovanie času („pred 2 hodinami") pri aktivitách a časových značkách cez nový klientsky pomocník
localize-time.
Opravené
- Sprievodca (tour) teraz rekurzívne posúva všetkých posúvateľných predkov, aby dostal cieľ kroku do zobrazenia, a preskakuje tabuľkové kontajnery, takže sa posúva hlavný obal stránky namiesto vnútornej tabuľky.
- Krok sprievodcu „akcie v riadku používateľa" teraz zvýrazňuje obal tlačidiel namiesto holej bunky tabuľky.
- Vrátené (rollback) skoršie zmeny pozíciovania a popoveru sprievodcu, ktoré zhoršovali ukazovanie na cieľ.
- Odstránené duplicitné podnadpisy na profile študenta.
Zmenené
- Prebudované JS/CSS bundly a minifikované assety.
- Verzia
2026.6.29.post4; Service Worker cachegitpulse-v245. Zároveň zarovnaná verzia balíka, ktorá zostala napost2, kýmpost3vydal len SW cache a changelog.
[2026-06-29] - GitLab diff komentáre, hlavičky diskusií, priesvitné email logo 2026.6.29.post3
Opravené
- Code kontext diff komentára teraz zobrazuje GitLab-style dvojitý stĺpec pre čísla riadkov (staré a nové čísla vedľa seba).
- Rozsahové diff komentáre sa správne zobrazujú v pätičke vlákna (napr.
Comment on lines +51-53). - Hlavičky diskusií teraz obsahujú GitLab používateľské meno autora (
@username) a lokalizovaný čas začiatku vlákna. - Statusové ikony v
.commit-message-cellsú teraz zobrazené inline a nepreskakujú nad odkaz správy commitu. - Sprievodca (tour) popover na desktope teraz ukazuje priamo na zvýraznené ciele s tematikou šípkou namiesto núteného umiestnenia v spodnom pravom rohu.
Zmenené
- Logo pre emailové notifikácie bolo zmenené na priesvitné (bez tmavosivého ohraničenia dlaždice) a bol odstránený tieň pre modernejší vzhľad.
- Verzia
2026.6.29.post3; Service Worker cachegitpulse-v244.
[2026-06-29] - GitLab-style tanuki social cover 2026.6.29.post2
Zmenené
- Prerobený Open Graph / social-share obrázok (
og-image.png, docsog-cover.png) na GitLab-style tanuki dlaždicu (oranžový tanuki na svetlej gradientovej zaoblenej dlaždici) s prekrytým GitPulse ECG pulzom namiesto nebrandového modrého ECG štvorca, takže náhľady odkazov ladia s logom v aplikácii. Ikony domovskej obrazovky/PWA a favicon už tanuki mali. - Verzia
2026.6.29.post2.
[2026-06-29] - Oprava diff kontextu (hunk), medzery inline-code, favicon 2026.6.29.post1
Opravené
- Code kontext diff komentára už neprekračuje hranicu hunku - ostáva v rámci komentovaného hunku (ukáže celý kompaktný pridaný konštrukt, GitLab-style) namiesto skoku čísel riadkov (napr.
29 -> 49) a presakovania do ďalšej funkcie. - Inline
codepilulky majú reálnu horizontálnu medzeru, takže sa už nedotýkajú okolitých slov. - Riadok Pokrytie testami v MR pipeline (ikona, label, %, „z N úloh") je na jednej spoločnej osi namiesto rôznych vertikálnych úrovní.
- Zastaraný docs
favicon.icopregenerovaný ako poriadny multi-rozlíšenie GitPulse tanuki a cache-busted linky favicon. - Sprievodca (tour) otvorí zbalený
<details>okolo cieľa kroku len pri navigácii na daný krok, nie počas page-load kontroly dostupnosti (oprava regresie, ktorá mohla pri načítaní automaticky rozbaliť zbalené diff/code sekcie).
Zmenené
- Verzia
2026.6.29.post1; Service Worker cachegitpulse-v243.
[2026-06-29] - Skladací code kontext, čistejšie diskusie a oprava túru 2026.6.29
Opravené
- Inline code kontext v MR/review diskusiách je teraz skladací a predvolene zbalený (GitLab-style
Zobraziť kódso súborom:riadkom), takže dlhé thready sú ľahké a už nelagujú pri skrolovaní. - Odstránený zavádzajúci neinteraktívny
new/oldštítok z code-context lišty; stranu už ukazuje gutter s číslami riadkov a pätičkaKomentár k riadku +N. - Vymyslený štítok
1 účastnícisa už nezobrazuje: počet účastníkov sa ukáže len keď thread naozaj má viac než jedného. - Prehľadnejšie review thready: odstránená nadbytočná „reply to …" pri každej odpovedi (odpovede sú už vizuálne vnorené) a duplicitná ikona kopírovania odkazu na koreňovom komentári threadu.
- Inline
codepilulky v popisoch a komentároch MR/issue už neprekrývajú susedné riadky. - Vertikálne vycentrované hlavičky MR kariet a sekcie „Dané reviews".
- Workflow pás má väčšie a jasnejšie ikony bodov s pokojnejším hoverom (bez skoku riadku).
- Sprievodca (tour) teraz pred zvýraznením otvorí zbalený
<details>okolo cieľa kroku (strom súborov, code kontext), takže kroky ako Strom zmenených súborov už nie sú rozbité, keď je sekcia zatvorená. - Odstránený tmavý pruh pod sticky lištou uloženia v nastaveniach predmetu, keď je formulár posledným blokom stránky.
Zmenené
- User-info modal: zoznam projektov
+N viacv skupine je teraz rozbaliteľný/zbaliteľný ovládač (Zobraziť menej) namiesto mŕtveho štítku. - Open Graph/Twitter náhľad dokumentácie používa brandovaný GitPulse obrázok (
assets/og-cover.png). - Prebudované bundly/minifikované assety; pridaný slovenský preklad
Zobraziť kód; verzia2026.6.29; Service Worker cachegitpulse-v242.
[2026-06-28] - Scoped MR diff jumpy a code komentare 2026.6.28.post1
Opravené
- MR/review diff file anchor ID su scoped per karta, takze changed-file tree kliky a comment jumpy uz netrafia cudzi
diff-file-*blok pri viacerych MR na stranke. - Diff comment code context ma jeden side-aware gutter s cislami riadkov a presny text
Comment on line, bez extra starej/novej ciselnej panely a bez nespravneho range footera. - Chybajuce MR pipeline
Test coveragesa pre viditelne student MR dobiera z GitLab pipeline detailov/jobov, ak starsi lokalny pipeline riadok macoverage = null. - Odstranena nespolahliva diagnostic karta
Response Rateaj duplicitna diagnostic kartaTest Coverage, vratane skeleton placeholderov.
Zmenené
- Pregenerovane static bundles/minified assets po student-detail fixoch.
Vydanie
- Verzia
2026.6.28.post1; Service Worker cachegitpulse-v241.
[2026-06-28] - Lokalne jumpy a inline Test coverage 2026.6.28
Opravené
- Copyable/hash linky pre student comments, MR karty, dashboard ciele a paginovane tabulky teraz pouzivaju zdielany lokalny
.gl-page-contentscroll kontrakt namiesto browser-level auto scrollu. - MR pipeline coverage je znova viditelne ako GitLab-like inline text (
Test coverage ... from 1 job) bez samostatnejTest Coveragekarty/chipu. - MR loading skeleton markup kopiruje realnu strukturu Pipeline/Tests plus inline coverage.
Vydanie
- Verzia
2026.6.28; Service Worker cachegitpulse-v240.
[2026-06-27] - Skeleton profilu, MR odpovede a presnejsie coverage 2026.6.27.post2
Opravené
- Loading skeleton profilu studenta teraz kopiruje realnu profile kartu, mobilne GitLab/profile/date metadata su centrovane a duplicitny divider bol odstraneny.
- Student-detail jumpy pouzivaju lokalny
.gl-page-contentscroll kontrakt z Issues to Address, takze uz neposuvaju globalne okno a nelamu layout. - MR commit riadky drzia labely, ± statistiky a datumy v pevnych grid stlpcoch, aby sa dlhy obsah nerozlieval cez stranku.
- MR diff code context sa renderuje na urovni diskusneho vlakna s old/new gutters, zvyraznenim cieloveho riadku, copy akciou a pripojenymi odpovedami pre GitLab-like citanie.
- Pipeline coverage sa parsuje z GitLab pipeline/build payloadov a same-SHA fallback pipelines, takze riadky ukazuju realne hodnoty ako
Test coverage 91.00% ... from 1 jobnamiestonot reported.
Zmenené
- GitPulse logo ma plynulejsiu ECG hover animaciu a student profile/MR skeleton static assets boli pregenerovane.
Vydanie
- Verzia
2026.6.27.post2; Service Worker cachegitpulse-v239.
[2026-06-27] - GitLab-like MR odpovede, coverage signal a profil studenta 2026.6.27.post1
Opravené
- Student MR diskusie sa renderuju ako prepojene GitLab-like vlakna so stabilnymi anchor linkami pre vlakno/komentar, reply-to jumpmi, collapsible odpovedami a buttonmi na skok do diff suboru.
- Pipeline riadky ukazuju jasny coverage fallback, ked GitLab nevrati test coverage, namiesto ticheho skrytia signalu.
- MR branch commity ukazuju autora, interny profilovy link tam, kde je dostupny, a Teacher commit badge pre commity ucitelov kurzu.
- Profilove metriky studenta, zarovnanie table skeletonov, Run Compliance Checks checkboxy, modal footer highlight a sticky spravanie diff file-tree boli dotiahnute.
Vydanie
- Verzia
2026.6.27.post1; Service Worker cachegitpulse-v238.
[2026-06-27] - Komponentove UI doladenie student detailu, modalov, skeletonov a code komentarov 2026.6.27
Opravené
- Skeleton riadky v tabulkach clenov uz pouzivaju rovnaky stlpcovy kontrakt ako realne riadky, takze Status/Checks placeholdery neodchadzaju mimo hlavicky.
- Student MR diff navigacia drzi strom zmenenych suborov sticky, scrolluje iba jeho lokalny panel a nepouziva globalny item
scrollIntoView. - Modal Run Compliance Checks ma stabilne checkbox riadky bez modreho inset pruhu a bez globalnej scale animacie checkboxov.
- Inline code kontext pri MR komentaroch ma old/new gutters, side-aware vyber cieloveho riadku, lokalny horizontalny scroll a copy akciu.
Zmenené
- Profilove metriky studenta, Reviews Given karty, tour popovery a student-detail tour kroky boli zladene s komponentovym UI kontraktom.
- GitPulse logo pouziva pokojnejsi ECG pulse a jeden jemny hover stav bez trhania v light aj dark theme.
- Source CSS
letter-spacingdeklaracie boli zjednotene na0napriec zdielanymi aj page stylmi.
Vydanie
- Verzia
2026.6.27; Service Worker cachegitpulse-v237.
[2026-06-26] - GitPulse branding, zero-inline UI kontrakt a presné MR jumpy 2026.6.26
Opravené
- Kliknutie z Issues na MR teraz scrolluje iba lokálny obsah stránky a nepoužíva globálny anchor scroller.
- Dynamicky otvorené modaly a drawery pred aktiváciou znovu inicializujú dirty-check guard.
- Komentáre k diffom vedia zobraziť GitLab-like kontext okolitých riadkov kódu, ak sú dostupné uložené MR diff dáta.
Zmenené
- Viditeľné pomenovanie Teamwork bolo zjednotené v aplikácii aj dokumentácii, pričom interné uložené JSON/API kľúče ostávajú stabilné.
- GitPulse logo je teraz zdieľaný komponentový stylesheet s GitLab-inšpirovanou značkou, light/dark contrast guardmi a pregenerovanými PWA ikonami.
- Inline progress/size štýly v šablónach boli nahradené opakovateľnými data atribútmi komponentov a centralizovanou hydratáciou CSS premenných.
- Responzívne tabuľky a skeletony majú prísnejšie zladený DOM/CSS kontrakt s reálnym obsahom.
Vydanie
- Verzia
2026.6.26; Service Worker cachegitpulse-v236.
[2026-06-25] - System-wide HTMX cleanup, zabránenie únikom pamäte a bezpečné skripty 2026.6.25
Opravené
- Opravené úniky pamäte v celom systéme implementáciou čistenia stránok a životného cyklu v rámci
GP.activePageCleanup(). Všetky event listenery nawindow/document, SSE streamy (EventSource) a časovače (setInterval/setTimeout) sú pri HTMX swapoch korektne ukončené. - Prevedené anonymné event listenery na
documentawindowv samostatných ovládačoch stránok (admin-events.js,admin-users.js,course-activity.js,support-ticket-detail.js) na pomenované funkcie, čo umožňuje ich explicitné odstránenie z globálneho rozsahu. - Zabránené znečisteniu globálneho lexikálneho rozsahu odstránením nepotrebných IIFE obalov zo zdrojových skriptov stránok, pričom ich automatické balenie bolo presunuté do zostavovacieho skriptu
build_bundle.py. - Extrahovaný inicializačný skript pre uvítací pozdrav z
dashboard.htmldo samostatného čistého statického JavaScript modulugreeting-sync.js, čím sa dosiahlo úplné odstránenie inline skriptov zo šablón.
Vydanie
- Verzia
2026.6.25; Service Worker cachegitpulse-v235.
[2026-06-23] - Aktualizácia a zosúladenie dokumentácie compliance kontrol
Pridané
- Pridané vysvetlenie a detaily pre pravidlo R13 (Kvalita commitov), ktoré hodnotí lokálny Git workflow voči webovému editoru GitLabu (Web IDE).
Zmenené
- Opravené a kompletne zosúladené popisy pravidiel R01-R13 v príručke pre študentov (
studenti/metriky.mda.en.md) tak, aby presne zodpovedali definíciám vbuiltin_checks.jsonaengine_checks.py. - Aktualizovaná tabuľka compliance pravidiel v príručkách pre učiteľov (
ucitelia/zaciname.mda.en.md) a na stránkach dashboardu (ucitelia/dashboard.mda.en.md), kam bola doplnená kontrola R13 vrátane jej predvolenej váhy (0 %). - Zosúladené počty route handlerov v API referencii (
api/index.mda.en.md) na zhodnú a overenú hodnotu 222 route handlerov.
[2026-06-20] - Responzívna správa kurzov, bezpečný Markdown a aktuálna diplomová práca 2026.6.20
Opravené
- Správa kurzov zachováva všetky stĺpce v responzívnych kartách, používa popisy hodnôt a stabilný panel vyhľadávania na úzkych obrazovkách.
- Náhľad Markdown funguje aj so zostavením Alpine CSP bez zakázanej direktívy
x-html. - Skripty editora Markdown a detailu požiadavky podpory možno po HTMX navigácii bezpečne inicializovať opakovane bez konfliktu deklarácií.
Zmenené
- Verejná sekcia diplomovej práce zodpovedá tretiemu priebežnému odovzdaniu a neuvádza predbežné výsledky, ktoré ešte neboli vyhodnotené.
- Návrh dokumentuje aktuálny model R01-R13, ručnú synchronizáciu namiesto periodického prehľadávania GitLabu a dve anonymizované snímky funkčného prototypu.
Vydanie
- Verzia
2026.6.20; Service Worker cachegitpulse-v234.
[2026-06-19] - Responzívna tabuľka správy používateľov 2026.6.19.post2
Opravené
- Vyhľadávanie a filter rolí používajú stabilný toolbar bez náhodného zalamovania a posúvania.
- Triedy stĺpcov sú na reálnych hlavičkách a bunkách, takže šírky, skracovanie, viditeľnosť, status, akcie aj skeleton používajú jeden kontrakt.
- Riadky ľudí a servisných účtov používajú kompaktné ikonové akcie a bezpečne zobrazujú dlhé používateľské mená aj e-mailové adresy.
- Mobilné karty používajú meno používateľa ako primárnu identitu a zachovávajú zarovnané metadata aj akcie.
- Live zmeny role a statusu zachovávajú rovnaký badge a status-indicator markup ako serverový render.
Vydanie
- Verzia
2026.6.19.post2; Service Worker cachegitpulse-v232.
[2026-06-19] - Zosúladenie responzívnych skeletonov tabuliek 2026.6.19.post1
Opravené
- Projektové a tímové tabuľky členov používajú jeden responzívny stĺpcový kontrakt pre reálne riadky, loading skeletony aj JavaScript fallback riadky.
- Skeleton detailu projektu odvodzuje rubric/check stĺpce z aktívneho zoznamu kontrol, takže loading matica zostáva zarovnaná s reálnou tabuľkou R01-R13.
- Skeleton riadky administrátorskej tabuľky používateľov používajú typované user stĺpce namiesto generickej tabuľkovej náhrady.
- Skeleton riadky používajú rovnaký responzívny
data-labelkontrakt ako reálne riadky, takže tabletové a mobilné loading stavy sa zobrazujú ako label/value karty. - Filtre rolí používateľov a filtre členov sa na úzkych obrazovkách zalamujú v komponente bez horizontálneho scrollu alebo orezania.
- Test status pri pipeline v študentských merge requestoch sa zobrazuje ako kompaktný badge namiesto surového textu.
- Animácie Issues to Address sú vypnuté, aby sa po zmene visibility alebo HTMX refreshi nespúšťali druhýkrát.
Vydanie
- Verzia
2026.6.19.post1; Service Worker cachegitpulse-v231.
[2026-06-18] - Skeletony tabuliek, aktuálnosť analytiky a indexovanie 2026.6.18.post1
Opravené
- Skeletony tabuliek používajú samostatné typy buniek pre projektové riadky, členov, badge prvky, status pilulky, kontrolné body a akčné tlačidlá.
- Admin a teacher prehľady na nástenke nahrádzajú málo užitočnú kartu "Open MRs" pokrytím aktívnych skupín.
- Bannery neaktuálnych dát v analytike a aktivite kurzu zobrazujú čiastočné pokrytie current-week snapshotov skupín namiesto dojmu, že sa nesynchronizoval celý kurz.
- Prihlasovacie a odhlasovacie upozornenia používajú spoločný GitLab-style alert komponent s podporou titulku a krátkym synchronizovaným fade efektom pri odhlásení.
- Robots a sitemap odpovede explicitne blokujú indexovanie súkromného dashboardu, povoľujú login stránku, obsahujú last-modified metadata a verejné cache hlavičky.
Vydanie
- Verzia
2026.6.18.post1; Service Worker cachegitpulse-v229.
[2026-06-18] - Reconciliácia syncu projektov a presnejšie UI guardy 2026.6.18
Opravené
- Projektové položky v Quick access na nástenke otvárajú stránku projektu namiesto nadradenej skupiny.
- Importy GitLab skupiny alebo kurzu deaktivujú aktívne databázové projekty, ktoré už neexistujú v importovanom strome GitLab skupiny, vrátane osirelých členov tímu, keď nezostane žiadny aktívny projekt.
- Process-action guardy ďalej chránia sync/import/check/delete akcie, ale neblokujú pasívne filtre, taby a dropdown ovládacie prvky.
- Skeleton kontrakty projektových a členských tabuliek zostávajú zosúladené s responzívnym layoutom tabuliek.
- Produkčný redeploy necháva AI teamwork analysis vypnutú v
.env.production.
Zmenené
- Odkazy Back to Group používajú transform-based pohyb ikony a odkazu namiesto zmeny medzery, ktorá hýbala layoutom.
- GitLab import API a SSE completion payloady vracajú počty vyčistených stale projektov.
Vydanie
- Verzia
2026.6.18; Service Worker cachegitpulse-v228.
[2026-06-17] - Zosúladenie prihlásenia s Keycloak 2026.6.17
Zmenené
- Zosúladené rozloženie, rozostupy a rozmery prihlasovacej a odhlasovacej stránky s dizajnom Keycloak.
- Vycentrovaný názov loga, nastavená šírka karty na kompaktných 400 px a odstránené nepotrebné zaoblenia hrán pre čistý hranatý vzhľad.
- Premiestnený a upravený rozbaľovací zoznam výberu jazyka tak, aby bol kompaktný a mal polopriehľadné čierne pozadie.
Vydanie
- Verzia
2026.6.17; Service Worker cachegitpulse-v224.
[2026-06-16] - Redizajn e-mailov, vylepšenia tiketov podpory a čistenie emoji 2026.6.16
Pridané
- Kompletný redizajn systému e-mailových notifikácií s modernou typografiou Inter, jemnými tieňmi a prémiovými farebnými gradientmi.
- Rozsiahle aktualizácie rozhrania tiketov podpory vrátane dynamického nahrávania súborov formou drag-and-drop v editore tiketov, vizuálneho zvýraznenia dragover a opravy prebytočného dabl-klikávania v Chrome.
Zmenené
- Nahradené zastarané referencie na "Reports" (Reporty) za "Analytics" (Analytiku) v šablónach uvítacích e-mailov pre roly učiteľov a administrátorov.
- Odstránené všetky surové emoji a AI-like emotikony zo všetkej aktívnej dokumentácie systému pre dosiahnutie profesionálneho a čistého tónu.
- Zvýšená verzia aplikácie na
2026.6.16a verzia cache Service Workera nagitpulse-v217. - Vyčistené zastarané pomocné a testovacie skripty z repozitára.
Vydanie
- Verzia
2026.6.16; Service Worker cachegitpulse-v217.
[2026-06-15] - Akademické týždne, Pajamas dropdowny a vylepšený drag & drop 2026.6.15.post1
Pridané
- Výpočet akademických týždňov (
1-13) a týždňov skúškového obdobia (S1-S7) vo Flatpickr kalendároch na základe dátumu začiatku semestra. - Alpine.js-backed, Pajamas custom dropdowny (
select_field) pre výber typu a týždňa na stránke zadaní. - Globálne odchytenie drag & drop udalostí na okne na zamedzenie nežiaducej navigácie prehliadača pri minutí odhadzovacích zón.
- Pointer-events obmedzenie na potomkov odhadzovacích zón na elimináciu blikania počas ťahania.
Zmenené
- Tlačidlá akcie Upraviť a Zmazať v zozname zadaní prerobené na
btn_icon_onlyna zamedzenie prekrývania textu na úzkych obrazovkách. - Rebuildnuté a minifikované statické CSS/JS balíčky.
Opravené
- Opravená viditeľnosť zaškrtávacieho znaku (checkbox) v tmavom režime a pridané plynulé pružné animácie.
- Odhadzovacie zóny teraz pri dropnutí súboru odosielajú štandardný
changeevent pre bezproblémovú integráciu s HTMX. - Odstránené zbytočné animácie postupného zobrazovania kariet na zamedzenie dvojitých efektov.
Vydanie
- Verzia
2026.6.15.post1; Service Worker cachegitpulse-v209.
[2026-06-11] - Trvalý vzhľad a responzívne doladenie 2026.6.11.post7
Pridané
- Svetlý, Tmavý a Systémový režim nad jednou sémantickou vrstvou tokenov bez prebliknutia pri prvom vykreslení.
- Zvolený režim sa ukladá k účtu na serveri a prenáša sa medzi prehliadačmi a zariadeniami.
- Krok sprievodcu otvorí profilové menu a ukáže priamo na skutočný prepínač vzhľadu.
- Stav nainštalovanej PWA sa overuje cez prehliadač, nie iba lokálnym príznakom.
- Spoločný prepínač režimu pre dashboard, prihlásenie a všetky chybové stránky.
- Statický offline fallback používajúci rovnaký bezpečný error povrch.
- Spoločný krok o vzhľade automaticky pridaný do každého dostupného produktového sprievodcu.
- Serverom určený scope Project, Course a Group synchronizácií v Job History.
Zmenené
- Grafy sa pri zmene režimu prefarbia bez reloadu.
- Middleware chyby používajú jeden escapovaný CSP-aware renderer.
- Spinner má jeden komponentový DOM/CSS kontrakt a skeletony zostali iba v reálnych HTMX lazy zónach.
- SSR tabuľky sa vykresľujú okamžite bez čakania na JavaScript visibility guard.
- Svetlý shell, navigácia, karty, tabuľky, ovládacie prvky, skeletony, spinnery, texty, okraje, tiene a interakčné stavy používajú aktuálne sémantické role Pajamas.
- Historické synchronizácie celého predmetu obnovia chýbajúci kontext predmetu a zobrazia jeho názov namiesto nesprávneho označenia samostatnej skupiny.
- Tlačidlá, dropdowny, karty a sekcie majú viditeľné sémantické okraje v oboch režimoch; focus vyhľadávania už nemení šírku panelov akcií.
- Značkové pozadie prihlásenia je obnovené a karta je overená pri mobilnej šírke 390 px.
Odstránené
- Všeobecné animácie objavenia stránok, riadkov a lazy fragmentov.
- Mŕtve skeleton vetvy a duplicitný button spinner markup.
- Posuny a zväčšovanie dashboard prvkov pri hoveri, ktoré neprenášali stav.
Vydanie
- Verzia
2026.6.11.post7; Service Worker cachegitpulse-v186.
[2026-06-10] - Zosúladenie načítavacích skeletonov a odstránenie inline štýlov 2026.6.10.post5
Pridané
- Skeletons v štýle Pajamas a nulové inline štýly: Úplne eliminované všetky inline
styleatribúty pre šírku, výšku a zaoblenie hrán vloaders.html. Všetky veľkosti sú teraz namapované na znovupoužiteľné triedy podľa design systému Pajamas vloaders.css. - Zosúladenie detailu tímu a manažéra učiteľov: Zástupné symboly pre detail skupiny a správu učiteľov teraz využívajú priamo komponenty makier (
badge,btn,btn_icon,btn_icon_only) v deaktivovanom stave, čím sa dosiahlo pixelovo dokonalé prispôsobenie a nulový posun rozloženia (CLS).
Opravené
- Spracovanie vymazaných a prázdnych GitLab projektov: Pridaná automatická deaktivácia projektov, ktorých repozitár bol vymazaný na GitLab (vrátenie stavu prázdneho repozitára namiesto 404). Vyčistené staré skóre v zozname členov na "N/A" pre prázdne/vymazané repozitáre.
- Dynamická deaktivácia členov pri strate projektov: Automatická deaktivácia členov tímu v prípade, že sú vymazané alebo deaktivované všetky aktívne projekty priradené k ich tímu.
- Ochrana pred vymazaním členov pri výpadkoch: Zabránené nežiaducemu odstraňovaniu platných členov pri čiastočných chybách sťahovania z GitLab API (timeout / 5xx), čo zabezpečuje stabilitu zoznamu pri občasných chybách siete.
- Zvýšenie verzie a cache: Zmena verzie na
2026.6.10.post5a zvýšenie verzie cache Service Workera nagitpulse-v176.
[2026-06-09] - Kompletné odstránenie inline layout štýlov 2026.6.9.post2
Zmenené
- Kompletné odstránenie inline layout štýlov: Odstránené všetky inline layout a flex atribúty
style="..."(ako flexbox, display, okraje, padding, priehľadnosť a pointer-events) zo súboruloaders.htmla ich presun do tried CSS vutilities.css. - Krajšie formuláre: Nahradené inline konfigurácie max-width vo formulárových komponentoch čistými pomocnými triedami triedy.
- Zvýšenie verzie a cache: Zmena verzie na
2026.6.9.post2a zvýšenie verzie cache nagitpulse-v174.
Opravené
- Upozornenie na nesúlad verzií: Aktualizovaný súbor JSON pre interný changelog aplikácie, aby sa používateľom v prehliadači korektne zobrazilo hlásenie o novej verzii po nasadení.
[2026-06-09] - Plynulé prechody a zamedzenie posunu rozloženia v načítavacích skeletonoch 2026.6.9.post1
Pridané
- Dynamické vykresľovanie hlavičiek tabuliek v skeletonoch: Úprava makra
sk_tabletak, aby akceptovalo voliteľný parameter zoznamu hlavičiek (headers), čo umožňuje okamžité zobrazenie statických stĺpcov počas načítavania stránky. - Vylepšený dizajn makra
sk_stats podporou popiskov a ikon: Zástupné symboly (placeholders) pre štatistické mriežky v analytike kurzu, aktivite kurzu a detailoch študenta teraz okamžite zobrazujú reálne popisky a ikony namiesto blikajúcich sivých blokov, čím sa úplne eliminuje posun rozloženia (layout shift).
Opravené
- Plynulá interakcia s rozbaľovacími ponukami: Oprava neplatných premenných CSS (
var(--gl-dropdown-item-hover)) v súboredropdowns.cssich namapovaním na správne tokeny (var(--gl-dropdown-item-hover-bg)atď.), čím sa obnovili hladké prechody pozadia pri prechode myšou. - Zosúladenie načítavacích skeletonov na všetkých stránkach: Dôkladná kontrola a refaktorovanie všetkých zložených skeletonov stránok (
sk_dashboard,sk_course_detail_body,sk_analytics_inner,sk_course_activity_inner,sk_student_detail,_sk_teachers_inner) v súboreloaders.html, aby presne zodpovedali reálnym šablónam vykresľovaným na serveri, s použitím lokalizačných prekladovt()pre statické texty.
Zmenené
- Zvýšenie verzie cache Service Workera na
gitpulse-v173.
[2026-06-08] - Zosynchronizovaný refresh a manuálny GitLab sync 2026.6.8.post5
Zmenené
- Manuálny refresh s plnohodnotným sync-all tokom: Kliknutie na tlačidlo "Refresh" na stránkach Course Analytics alebo Course Activity teraz namiesto statického znovunačítania spustí naozajstný GitLab sync na pozadí pre všetky skupiny cez API. Tlačidlá majú vizuálny stav načítania (spinning + text), sú prepojené s globálnym panelom priebehu úloh, po úspechu automaticky prerenderujú tabuľky a grafy, a pri zlyhaní sa sfarbia do červena na signalizáciu chyby.
- Odstránené dočasné logy: Vyčistené nepotrebné logové súbory z predošlých nasadení v koreňovom priečinku projektu.
[2026-06-08] - Doladenie dashboardu a opráv chýb 2026.6.8.post4
Opravené
- Exklúzia fantómových sync riadkov v prehľade: Prehľad "Follow the latest updates" na dashboarde už neukazuje riadky úloh synchronizácie, ktoré nemajú reálny záznam v histórii. Boli odfiltrované všetky varianty synchronizácií.
- Zarovnanie stĺpca akcií v tabuľke členov: Tlačidlo "View" v zozname členov projektu už neposkakuje kvôli chýbajúcim prepínačom na riadkoch učiteľov.
Zmenené
- Spätná väzba pri refreshe histórie: Ručné obnovenie histórie úloh teraz zobrazuje indikátor načítania a pri chybe ponúkne odkaz na vytvorenie tiketu podpory.
[2026-06-08] - Oprava výpočtov a lokalizácie 2026.6.8.post3
Opravené
- Počet študentov v checkliste: Opravený výpočet menovateľa pre checklist v analytike kurzu (počíta iba aktívnych študentov).
- Oprava SyntaxError: Odstránená chyba v klientskom skripte pre week explorer.
Zmenené
- Vylepšený pozdrav a chybové stavy: Pridaný detailný podnadpis s rolou na dashboard a odkazy na podporu do chybových stavov HTMX.
[2026-06-08] - Synchrónne hlavičky detailov 2026.6.8.post2
Zmenené
- Hlavičky detailov tímu a projektu: Načítavajú sa priamo v SSR šablóne shellu, čím sa predišlo posunu layoutu.
[2026-06-08] - Prepracovanie skeleton loaderov 2026.6.8.post1
Odstránené
- Mŕtve celostránkové skeletony: Vymazané nepoužívané makrá a optimalizované zobrazenie učiteľských profilov bez compliance gridov.
[2026-06-05] - "Needs Attention" vedie na presnu skupinu 2026.6.5.post18
Zmenene
- KPI karta "Needs Attention" teraz vedie presne na element: ak je problemova prave jedna skupina, otvori ju priamo; pri viacerych vedie na prehlad. So skorsim odlisenim karty "Students" ziadne dve karty nevedu na to iste miesto.
[2026-06-05] - Stranka studenta: stlpec "Project" odstraneny 2026.6.5.post17
Zmenene
- Stlpec "Project" bol uplne odstraneny zo vsetkych tabuliek na stranke studenta v skupine (commity, issues, MR). Na stranke jednej skupiny je projekt vzdy rovnaky, takze isiel len o zbytocny sum; odkaz na GitLab ostava na cisle commitu/issue/MR. Tabulky sa zameriavaju na to, co sa hodnoti: vlastna praca clena (DOING) oddelene od code review kolegov (COMMUNICATING).
- Vymazanie uloh z Historie uloh teraz vycisti aj "Follow the latest updates" (job-rows v prehlade maju rovnaky zdroj).
[2026-06-05] - Konzistentny prehlad aktivit + plynuly skeleton 2026.6.5.post16
Opravene
- "Follow the latest updates" je teraz konzistentny s Historiou uloh - uz nezobrazuje "fantomove" zaznamy o synku/reporte, ktore v Historii uloh neexistuju. Job-ove aktivity sa cerpaju z toho isteho zdroja ako Historia uloh; audit-log ponecha len skutocne ne-jobove udalosti.
Zmenene
- Obsah stranky sa po nacitani plynulo usadi na miesto skeletonu (GitLab styl) namiesto tvrdeho preblesknutia.
[2026-06-05] - Cistejsi dashboard + oprava CI 2026.6.5.post15
Opravene
- CI je opat zelene -
requirements.lockbol regenerovany na Linuxe (presne ako v CI), nie na Windowse. - Z prehladu poslednych aktivit zmizli "fantomove" systemove zaznamy (telemetricke snimky, zostatky planovanych sweepov) - ostavaju len v admin Historii uloh.
Zmenene
- KPI karta "Students" uz nevedie na rovnake miesto ako "Users" - otvara zoznam pouzivatelov predfiltrovany na studentov.
[2026-06-05] - Rychlejsie nacitanie (dlhsia cache) 2026.6.5.post14
Zmenene
- Cache vyrendrovaneho HTML drzi teraz 5 minut namiesto 60 sekund. Cerstvost to neovplyvnuje - cache sa presne zneplatnuje pri kazdej zmene (webhook aj akcia v aplikacii) a pri kazdom nasadeni. Vysledok: viac okamzitych nacitani bez rizika zastaralych dat.
[2026-06-05] - Uplne pokrytie webhookmi 2026.6.5.post13
Zmenene
- Doverne (confidential) issues a komentare sa uz spracuvavaju rovnako ako verejne (predtym sa ticho ignorovali).
- Navod na nastavenie webhooku odporuca zapnut vsetky relevantne udalosti a nastavit hook na urovni skupiny/podskupiny - len tak GitLab posiela udalosti o clenoch a podskupinach, cim sa automaticky zachyti pridanie/odobratie clena aj prerozdelenie.
[2026-06-05] - Odstranenie periodickych jobov (cisto webhookovy system) 2026.6.5.post12
Odstranene
- Vsetky periodicke (cron) joby aj samotny scheduler boli odstranene (subor
scheduler.py, compose sluzbascheduler, zavislostrq-scheduler). Panel jobov uz nezahlcuju "duchove" ulohy a na GitLab nie je ziadna zataz na pozadi. - Vsetky zmienky o periodickom planovani boli odstranene z kodu aj dokumentacie.
Zmenene
- System je teraz cisto webhookovy + manualny: data sa obnovuju udalostami z GitLabu a explicitnymi akciami. Udrzbove operacie ostavaju ako rucne joby v System -> udrzbove joby.
- Opakovanie doruchenia e-mailu sa planuje samo (
Queue.enqueue_in, vstavany RQ scheduler vo workeri) - bez samostatnej sluzby.
[2026-06-05] - Jemnejsia ochrana proti spam-klikaniu 2026.6.5.post11
Opravene
- Rychle dvojklik na tlacidlo, ktore spusta uz prebiehajucu akciu, uz nezobrazuje matucu cervenu chybu. Namiesto toho sa zobrazi jemne modre upozornenie "Pockajte - predchadzajuca akcia stale prebieha" a duplicitna poziadavka sa ticho ignoruje (centralna oprava, bez zasahu do jednotlivych tlacidiel).
[2026-06-05] - Strankovanie tabulky Service Accounts 2026.6.5.post10
Zmenene
- Tabulka Service Accounts (GitLab boti) na stranke Pouzivatelia ma teraz vlastnu strankovaciu listu (10/20/50 na stranu), nezavislu od hlavnej tabulky a spolupracujucu s triedenim stlpcov. Pri velkom pocte botov uz stranka nie je zahltena.
[2026-06-05] - Prehladnejsia stranka studenta v skupine 2026.6.5.post9
Zmenene
- Skeleton (placeholder pocas nacitania) tejto stranky bol prepisany tak, aby presne zodpovedal novej strukture - obsahuje uz oba rozdelovace skupin a tabulka commitov ma spravny pocet stlpcov, takze pri vymene obsahu nedochadza k posunu rozlozenia.
- Stranka studenta v skupine je rozdelena na dve jasne oznacene casti: "Praca od <clen>" (commity, MR a issues, ktorych je clen autorom) a "Revizia kodu a komunikacia" (komentare k revizii, ktore napisal kolegom, oddelene od spatnej vazby, ktoru dostal). Ucitel cita stranku zhora nadol ako pribeh "robenie + komunikovanie".
- Stlpec Project v tabulkach sa zobrazuje uz len ak skupina ma viac nez jeden aktivny projekt; samostatny stlpec SHA bol odstraneny (odkaz na GitLab je na nazve commitu).
Opravene (post5-post7)
- Opraveny dvojity "Done" stav v globalnom job bare (idempotentne voci faze "finishing").
- Pozdrav sa renderuje server-side v shell strane, takze sa uz neblika; jeho duplicitny statisticky podnadpis bol odstraneny.
- "Items that need your attention" uz nezobrazuje matuci "N projektov so zastaralymi datami" - upozornenie je teraz zoskupene podla kurzu.
[2026-06-05] - Klikatelne dashboard KPI + hlbke docistenie dokov 2026.6.5.post4
Zmenene
- Dashboard KPI karty teraz naviguju (admin na users/courses admin stranky; ucitel/student na svoj kurz/analytiku). Klikatelny styl ma iba karta s realnym cielom.
Odstranene
- Odstraneny zbytocny stat-pas v System Settings (duplikoval dashboard karty) aj jeho mrtvy JS.
- Vycistene vsetky zvysne zmienky v dokumentacii o odstranenych funkciach (rubric/gaming/async-report/roster-import) - ziadne nezostali.
[2026-06-05] - Docistenie retired schema/API tailu 2026.6.5.post3
Odstranene
- Pridana Alembic migracia
049, ktora dropuje posledny retired schema tail: legacy stlpec v student compliance snapshote a osirele history/report tabulky. - Odstraneny stary telemetry PDF report endpoint, schemy, ORM model, generator service a report-only testy.
- Odstranene stale aktivne doky, fixture JSON sekcie, support-form labely, login metadata a i18n kluce naviazane na retired grading/heuristic/report/import subsystems.
Zmenene
- Full course configuration priklady teraz uvadzaju iba aktivne import sekcie: course metadata, settings, built-in checks, custom checks, weekly deadlines, Docker lint config a CI failure config.
- Metadata aplikacie/dokov su
2026.6.5.post3; Service Worker cache namespace jegitpulse-v160.
[2026-06-05] - Odstranenie scheduler master switchu a mrtvych scheduled fallbackov 2026.6.5.post2
Odstranene
- Odstraneny retired scheduler master switch zo Settings, Docker Compose, scheduler runtime, tracked wrappera, admin scheduled registra, manual retry routingu, testov, README a architekturnych dokov.
- Odstranene posledne neaktivne scheduled fallback joby: periodicky prepocet metrik, cleanup background jobov, overovanie webhookov, polling mrtvych projektov, cleanup metric snapshotov, audit logov a expirovanych webhook secretov. Cerstvost dat ostava na webhook/manual sync flow; metriky sa prepocitavaju inline v sync/event flow.
- Odstranene stare activity-feed/global-job labely pre uz zmazane GitLab polling a discovery joby, aby UI nezobrazovalo retired scheduled procesy.
Zmenene
- Scheduler/admin katalog teraz ukazuje iba 12 aktivnych scheduled jobov: event recovery, CI rollback, conflict expiry/verification, volitelne LLM, volitelnu telemetriu, DLQ resurrection, volitelny Docker reverify, event retention, email queue/log retention a semester auto-archive.
- Metadata aplikacie/dokov su
2026.6.5.post2; staticke bundle boli rebuildnute a Service Worker cache namespace jegitpulse-v159.
[2026-06-05] - Odstranenie periodickeho GitLab pollingu a hlbke cistenie dokov 2026.6.5.post1
Odstranene
- Odstranene periodicke GitLab polling joby (
periodic_enrich_all,periodic_enrich_users,sweep_stale_projects,sweep_discover_new_projects,sweep_discover_new_teams) a uz prazdne modulysweep_enrichment.py/sweep_discover.py, vratane ich config intervalov a admin registrov. Cerstvost dat teraz zabezpecuju len webhooky, manualna synchronizacia a sync pri vytvoreni kurzu.
Zmenene
- Hlbke cistenie dokumentacie a diplomovej prace od zmienok o retired grading/heuristic/ intervention/polling (vyvojarska struktura, API referencia, abstrakt/kluc. slova).
[2026-06-05] - Odstranenie retired grading engine, retired heuristic detection, intervention flags a polling sweep 2026.6.5
Odstranene
- Kompletne odstranene retired grading hodnotenie, retired heuristic detection, panel Intervention Flags + flag endpointy a periodicky membership-sync sweep (kod, settings UI, API, DB stlpce/tabulky cez migraciu
048). Manualna synchronizacia, webhooky, sync pri aktivacii a auto-sync pri importe ostavaju; evaluation-report/telemetria ostava nedotknuta. Jadro hodnotenia su teraz uz len konfigurovatelne kontroly R01-R13, ktore vyhodnocuju studenta.
Pridane
- Globalny capture-phase click-lock na tlacidlach: opakovane kliky do 600 ms su zahodene s jednym throttled "pockajte" toastom, takze kazda akcia da spatnu vazbu aj ked sa stav nemeni. UI prepinace su vynimka.
Opravene
- Reset tlacidlo vo filtri clenov v skeletone je teraz zarovnane vpravo ako realny filter bar a zvysne retired grading/retired heuristic/flags placeholdery v skeletone boli odstranene.
[2026-06-04] - Odstranenie legacy global gates a System Health parity 2026.6.4.post4
Odstranene
- Stare globalne prepinace pre retired grading, manualne intervencie, heuristiky a GitLab polling automatizaciu su odstranene zo settings, template globals, API guardov, scheduler metadata, docker-compose, testov aj dokumentacie.
Zmenene
- System Health a scheduler metadata boli zladene s vtedajsim transition stavom pred uplnym odstrananim retired subsystemov.
Opravene
- System Health checking skeleton uz zobrazuje Database, Redis aj Session_store, takze sedi s finalnou operational kartou.
- Team detail a course Activity skeletony boli znovu porovnane s aktualnymi SSR fragmentmi po odstraneni kariet.
[2026-06-04] - Odstranenie legacy roster uploadu a exportu, grading KPI 2026.6.4.post3
Odstranene
- Roster CSV import odstraneny (studenti vstupuju cez GitLab sync) - flag
retired roster switch,roster_service, model/schemaRosterImport, upload/history API a UI, ajroster_importjob-bar hooky. Pohlad Roster + CSV export zostavaju. - Team CSV/JSON export odstraneny (tlacidla +
/teams/{id}/export/*). - Zbytocne karty - course-detail KPI pas a duplicitna Compliance Checks.
Zmenene
- Grading-focused KPI - admin/teacher home karty maju Needs Attention (skupiny s padajucimi kontrolami) namiesto poctu "Groups".
Opravene
- Week Analytics donut tooltip je spat nad skore.
- Tesnejsi profil studenta (odstranena zbytocna ciara).
- Ziadne blikanie/spam - System Health drzi citatelny minimalny stav; tlacidla zostavaju disabled pocas celej poziadavky.
- Skeleton loadery sedia s realnymi strankami (odstranene placeholdery, ploche profilove meta, duty Week Analytics prstenec).
[2026-06-04] - Odstranenie Retired Report a UI cleanup 2026.6.4.post2
Odstranene
- Async funkcia "Retired Report" bola kompletne odstranena - team report API/worker, mrtvy
retired_reportservis, flagretired report switchs jehocleanup_old_reportssweepom a retention configom,generate_reportjob-bar hooky, tlacidlo na team-detail, i18n retazce aj tour krok. Samostatny telemetry evaluation-report subsystem zostava nedotknuty. - Odstranene zbytocne karty - Summary (activity), Compliance by Category (vratane Chart.js grafu a backend roll-upu) a Group Summary (team).
Opravene
- Konzistentne stat karty - nekonzistentne
stat-card--glowpodsvietenie (na niektorych kartach, na inych nie) bolo odstranene, takze vsetky stat karty maju jeden neutralny hover plus standardny focus ring. - Ploche profilove udaje - Email / GitLab / Role su teraz plochy
profile-metariadok namiesto kariet. - Ziadne blikanie loadingu, ziadny spam klikov -
setButtonLoadingdrzi loading stav minimalny cas a nechava tlacidlo disabled pocas celej poziadavky, centralne pre kazde tlacidlo (System Health, refresh, sync, ...). - Viditelny prazdny Week Analytics prstenec - no-data stav pouzival 6% bielu (neviditelnu na tmavom pozadi); teraz pouziva viditelny slate.
[2026-06-04] - Analytics refresh a sync cache coherence 2026.6.4.post1
Opravene
- Course analytics refresh ma jednu SSR/cache-busted cestu. Stary evaluation-report povrch, report Alpine factory, tour krok, lokalne report job hooky a report skeleton boli odstranene z analytics stranky aj generovanych bundlov. Refresh akcia najprv reloaduje SSR lazy fragment s cache-busting parametrom a az potom pada na spolocny scroll-preserving reload helper.
- Sync completion caka na cerstve metriky pred terminalnym SSE. Project syncy recomputuju team metrics inline pred oznacenim syncu ako completed a webhook/metrics side effects invaliduju page-cache fragmenty pred live notifikaciou klientov.
- Profile/stat karty si nechavaju uzitocnu interakciu bez entrance animacii. Student profile metadata je spat v kompaktnych kartach, course KPI karty linkuju na groups/roster a glow/process animacie ostavaju bez duplicitnych card-entry efektov.
- Analytics a system micro-UX boli dotiahnute. Week Analytics doughnut pouziva HTML center label s vypnutymi chart tooltip hitboxmi a System Health checking drzi spinner/glow feedback bez tvrdeho blikania.
- Release metadata su aktualne pre
2026.6.4.post1. Dashboard Latest changes, docs, generovane bundly/minified siblings a Service Worker cache namespace (gitpulse-v154) boli obnovene.
[2026-06-04] - Jednotne dokoncenie synchronizacie a cache-busted refresh 2026.6.4
Opravene
- Terminalne stavy sync/check uloh maju jeden citatelny tok vsade. Sync kurzu, timu, projektu aj run-check ulohy najprv prejdu do spolocneho
Finishing, ostanu viditelne pocas navigacie a az potom ukazu kanonicky riadok/toastDonepresne raz. - SSR refresh po zmene dat obchadza stale page cache.
reloadKeepScroll()teraz reloaduje cez cache-busting URL parameter, zachova scroll/toasty a parameter po boote odstrani, takze refresh po SSE alebo mutacii cita cerstve server-rendered data. - No-change sync vysvetli, co sa stalo. Project/team sync summary teraz povie, ked GitLab nevratil ziadne zmenene data, ale metrics/cache refresh sa aj tak dokoncil; team summary pri beznych zmenach pocita aj commity.
- Legacy appearance efekty a duplicity profilovych kariet boli odstranene. Metadata studenta su v jednom kompaktnom profile header bloku a dotknute course, project, support, student a team povrchy uz nepouzivaju odstranene glow/counter/card entrance animacie.
- Release metadata su aktualne pre
2026.6.4. Dashboard Latest changes, docs, generovane bundly/minified siblings a Service Worker cache namespace (gitpulse-v153) boli obnovene.
[2026-06-03] - Odstraneny race pri live update nastaveni 2026.6.3.post6
Opravene
- Live update Course Settings uz nepreteka na stare nastavenia ani stale page fragmenty. Endpoint nastaveni teraz najprv commitne nove nastavenia, invaliduje dotknute SSR fragmenty kurzu/timov a az potom publikuje
settings_changed. Otvorene stranky kurzu, timu, projektu a nastaveni, ktore na tuto udalost reloaduju, tak citaju commitnute data a cerstve Redis page-cache tela. - Post-update SSR reloady pouzivaju spolocny reload helper. Dokoncenie syncu projektu a fallback refresh v Support tikete teraz volaju
reloadKeepScroll()namiesto surovehowindow.location.reload(), takze SSR reload zachova scroll aj viditelne toasty. - Release metadata su aktualne pre
2026.6.3.post6. Dashboard Latest changes, docs, generovane bundly/minified siblings a Service Worker cache namespace (gitpulse-v152) boli obnovene.
[2026-06-03] - Konzistentny live refresh a cache na nastenke 2026.6.3.post5
Opravene
- Live refresh na nastenke ma jednu spolocnu cestu. SSE udalosti, fallback po dokonceni globalnej ulohy aj navrat na zalozku volaju jeden dashboard helper pre statistiky, upozornenia, aktivitu a badge v sidebare. Nastenka tak po synchronizacii neobnovi iba cast dat.
- Kratkodobe dashboard live cache sa cistia pred globalnym SSE pushom. Publisher notifikacii teraz invaliduje Redis kluce
dashboard:stats:*adashboard:badges:*pred publikovanimdashboard:global, takze okamzity refresh po synchronizacii necita stare 5-sekundove cache hodnoty. - Skeleton
Your coursesteraz vykresli dve karty. Loading stav zodpoveda pozadovanej hustote nastenky namiesto troch placeholder kariet kurzu. - Release metadata su aktualne pre
2026.6.3.post5. Priklady verzii v aplikacii/docs, docs-sitelatest, dashboard Latest changes, generovane bundly a Service Worker cache namespace (gitpulse-v151) boli obnovene.
[2026-06-03] - Dokoncenie synchronizacie ostava citatelne pocas navigacie 2026.6.3.post1
Opravene
- Dokoncenie synchronizacie kurzu ostava citatelne pocas navigacie pred prechodom do Done. Globalny panel obnovuje
finishingako vlastny stav, necha ho viditelny minimalne okno a az potom ho ukonci cez standardnu cestucompleteGlobalJob(), takze kanonicky riadok "Sync completed!" a toast sa nestratia pocas bootstrapu stranky./sync/activegrace snapshoty srunning=0, queued=0uz riadok nevymazu/nevytvoria znova ani ho neprepisu spat na running a stranka kurzu berie tento zero-work active snapshot ako Finishing namiesto okamziteho reloadu. - Dokoncene single-stage welcome tour sa uz neobjavia znova po zmene DOM fingerprintu. Legacy migracia dokoncenia teraz hlada realne prefixed
gp_tour_v2:localStorage kluce, takze starsie per-stage completion zaznamy sa spravne povysia na globalny completed kluc. Tour-seen POSTy pouzivaju ajkeepalivea pri neuspesnej odpovedi sa daju zopakovat, takze rychla navigacia po Done nestrati serverovy tour stav natrvalo. - Release metadata su aktualne pre
2026.6.3.post1. Verzie aplikacie/docs balikov, docs-sitelatest, operator/developer priklady verzii, dashboard Latest changes a Service Worker cache namespace (gitpulse-v147) boli obnovene.
[2026-06-03] - Dokoncenie synchronizacie prezije navigaciu; dokoncene tour sa neponukaju znova 2026.6.3
Opravene
- Dokoncenie synchronizacie prezije navigaciu a dokoncene welcome tour sa neponukaju znova. Tento release pridal persistenciu
lastUpdateafinishingSincea migraciu/retry spracovanie dokoncenia welcome tour.
[2026-06-02] - Tlacidla zamknute pocas synchronizacie nekolabuju; odznak synchronizacie na karte sa nezasekne 2026.6.2.post24
Opravene
- Tlacidla zamknute pocas synchronizacie uz nemaju nerovnomerne sirky. Pocas behu synchronizacie sa mutacne akcie (napr. Upravit kurz, Archivovat kurz v ponuke Akcie kurzu) zamknu a zamok obali kazde tlacidlo do
<span class="gl-tip-wrap">, aby sa pri prejdeni mysou zobrazil tooltip s dovodom zablokovania. Tento span nemal ziadny styl a sprava sa akodisplay: inline, takze zuzil kazde tlacidlo s plnou sirkou (btn-block) na sirku jeho textu, kym susedne nezablokovane tlacidla zostali plnej sirky - poskladane ponuky tak ukazovali chaoticky nerovnake sirky tlacidiel. Obal teraz zrkadli plnu blokovu sirkubtn-blockpotomka. - Odznak synchronizacie na karte kurzu uz nezostane visiet na zastaralom stave "Dokoncuje sa.../Synchronizacia...". Oneskorena udalost
gp:job-update, ktora prisla tesne po dokonceni ulohy, mohla preznacit (alebo ozivit) odznak karty pre uz dokoncenu ulohu, takze karta zostala zaseknuta na "Dokoncuje sa...", kym globalny panel uz ukazoval "Synchronizacia dokoncena!". Obsluha aktualizacii teraz ignoruje udalosti pre uz ukoncene ulohy a obranne cistenie odstrani kazdy odznak, ktoreho globalna uloha je done/error, pri kazdom dokonceni aj pri navrate na zalozku.
[2026-06-02] - Karty GitLab inteligencie sa vykresluju serverovo; ziadna animacia objavenia 2026.6.2.post23
Opravene
- Karty GitLab inteligencie sa teraz vykresluju kompletne na serveri. Karty Chranene vetvy, Prispievatelia a Statistiky repozitara (aj riadok Posledna synchronizacia) na stranke projektu sa predtym vykreslili s pomlckovymi zastupnymi hodnotami a az JavaScript ich doplnil pri prvom SSE
connectedudalosti s animacioufadeSlideUp- takze statistiky nad zlomom viditelne problikli. Novegl_intel_viewsa teraz pocita priamo v route (zrkadli logiku vykreslenia z JS: formatovanie bajtov, zlucenie a triedenie prispievatelov, parsovanie statistik) a sablona vykresli telo kariet priamo. Vstupna animacia na informacnom riadku a kartach API panelu bola odstranena a mrtva cesta predbezneho nacitania cez JSON (gp-gl-intelligence) aj prekreslenie pri prvom pripojeni boli zmazane. Zive obnovenia (synchronizacia / dokoncenie ulohy) stale stiahnu a prekreslia data ako predtym.
[2026-06-02] - Stranky sa pri nacitani uz neblikaju; jednotny format sprav uloh 2026.6.2.post22
Opravene
- Stranky kurzu, timu a projektu sa uz pri nacitani neblikaju. Nastenka uz preskakovala prve SSE
connectedobnovenie a verila hodnotam vykreslenym serverom; tri detailne stranky nie - hned po pripojeni SSE streamu spustili plne/live-datastiahnutie a prekreslenie, takze cerstvo serverom vykreslene karty/riadky sa nakratko prepisali (blikanie blank-then-JS). Vsetky tri teraz maju ochranu_connectedOnce(podla nastenky), ktora preskoci prve prekreslenie poconnecteda obnovi sa az pri skutocnom znovupripojeni. Zive SSE udalosti sa prekresluju ako predtym. Na stranke projektu sa lenive nacitanie GitLab inteligencie pri prvom pripojeni stale spusti (nie je vykreslene serverom, takze nic neblika). - Spravy o priebehu uloh maju teraz jeden spolocny format vsade; duplicitny kod odstraneny. Admin pohlad mal vlastny
_translateJobMsg/_jobTypeLabel/_JOB_TYPE_LABELS, zatial co globalny panel uloh zobrazoval surovy anglickyresult_summary(napr.Synced N issues, N MRs...) bez prekladu. JedinyGP.formatJobMessage/GP.jobTypeLabelteraz zije vcore/00-base.js; globalny panel formatuje na hranici zobrazenia (toast dokoncenia + zivy riadok) a admin pohlad to deleguje nan. Format je idempotentny, takze uz prelozene retazce prejdu nezmenene.
[2026-06-02] - Zmazanie skupiny obnovi vsetky cisla, nielen projekt 2026.6.2.post21
Opravene
- Zmazanie alebo obnovenie celej skupiny teraz obnovi vsetky statistiky, nielen pohlad projektu. Odpojenie a obnovenie projektu uz prepocitavalo metriky a posielalo SSE upozornenie, ale zmazanie a obnovenie skupiny len zneplatnilo cache stranky - neposlalo ziadnu SSE udalost ani neprepocitalo snapshot. Po zmazani skupiny tak otvorena stranka kurzu drzala zastarany zoznam skupin, suhrnne karty, kanal aktivit aj analytiku az do rucneho nacitania. Zmazanie a obnovenie skupiny teraz explicitne potvrdi zmenu, posle SSE udalost
team_deleted/team_reactivatedna kanal timu aj kurzu a zaradi prepocet metrik. Stranky timu a kurzu ich povazuju za strukturalne zmeny a prerenderuju sa na serveri (poloha skrolovania zostane zachovana).
[2026-06-02] - Odpojenie projektu prepocita aj suhrnne cisla skupiny 2026.6.2.post20
Opravene
- Odpojenie projektu teraz aktualizuje aj cisla v Suhrne skupiny. Karty suhrnu (priemerne skore, stav semaforu, uspesnost pipeline) sa servuju z posledneho ulozeneho
TeamMetricSnapshot, ktory prepocitava len metricky job - nie samotne odpojenie. Zoznam a pocet sa teda aktualizovali, ale hlavne cisla ostali zaseknute na starom prispevku odpojeneho projektu. Odpojenie aj obnovenie teraz zaradia prepocet metrik (compliance engine uz ignoruje projekty sis_active=False); ked dobehne, publikuje SSE upozorneniemetrics_computed, takze otvorene stranky timu/kurzu/nastenky obnovia karty zive.
[2026-06-02] - Odpojenie/obnovenie projektu sa naozaj obnovi zive 2026.6.2.post19
Opravene
- Odpojenie/obnovenie projektu sa teraz naozaj obnovi, nielen zobrazi toast. Dashboard SSE upozornenie sa odosielalo z handlera predtym, nez sa transakcia potvrdila (session commituje az po navrate handlera), takze okamzity refetch zive-data na klientovi predbehol este otvorenu transakciu a precital projekt ako aktivny - toast "Data updated" sa zobrazil, ale nic sa nezmenilo. Odpojenie aj obnovenie teraz najprv explicitne commitnu a az potom publikuju SSE udalost (
expire_on_commit=Falseponecha zachytene id platne). - Odpojeny riadok projektu teraz zmizne zo zoznamu.
refreshTeamData()aktualizoval karty statistik, riadky clenov a rubriku, ale nikdy serverom vykresleny zoznam Skupiny a Projekty, takze odpojeny riadok ostaval. Strukturne udalosti projektu (odpojenie / obnovenie / pripojenie) teraz spustia serverove prerenderovanie so zachovanim scrollu na strankach timu a kurzu, takze zoznam, pocet Zmazane aj suhrnne karty zodpovedaju potvrdenemu stavu.
[2026-06-02] - Zive obnovenie po odpojeni/obnoveni projektu, ziadne duplicitne pruhy priebehu 2026.6.2.post18
Opravene
- Odpojenie/obnovenie projektu obnovi cele UI zive. Odpojenie alebo obnovenie projektu teraz publikuje dashboard SSE udalost pre jeho skupinu aj kurz, takze otvorene zobrazenia dashboardu, kurzu a analytiky okamzite obnovia svoje statisticke karty, kanal aktivit a metriky namiesto cakania na rucne nacitanie.
- Ziadne duplicitne pruhy priebehu. Jedina akcia synchronizacie/obnovenia mohla zobrazit dva riadky v globalnom paneli priebehu - pruh konkretneho projektu ("Synchronizujem projekt...") plus agregatny pruh kurzu z
/sync/active. Reconciler/sync/activeteraz potlaci agregat kurzu, kym uz bezi pruh projektu/skupiny pre ten isty kurz, a render faza ako poistka zluci akekolvek zvysne riadky toho isteho kurzu do jedneho.
[2026-06-02] - Pozdrav podla dennej doby, zivy kanal aktivit, pocitanie len aktivnych poloziek 2026.6.2.post17
Pridane
- Pozdrav nastenky podla dennej doby. Pozdrav na domovskej stranke teraz zobrazuje "Dobre rano / Dobre popoludnie / Dobry vecer" podla lokalneho casu navstevnika (prelozene na serveri, s fallbackom "Ahoj" ak je JavaScript vypnuty) a prehodnoti sa po navrate na zalozku.
- Zivy kanal Sledujte najnovsie aktualizacie. Kanal je servovany z
/dashboard/activitya obnovuje sa zive cez SSE stream nastenky (fallback na polling zachovany) a teraz zachytava aj zmazanie a obnovenie skupiny ci projektu s vlastnymi ikonami, popismi a odkazmi.
Opravene
- Hlavne pocitadla pocitaju len aktivne polozky. Pocitadlo Skupiny aj pocty projektov za pipeline health filtruju
is_active, takze odpojene a zmazane skupiny a projekty (a GitLabdeletion_scheduledtombstones) zmiznu okamzite namiesto navysovania kariet.
Zmenene
- Mriezka aktivnych uloh v admin systeme je SSE-first. Panel naplanovanych uloh reaguje na SSE stream nastenky namiesto cakania az 10 s, pricom 10 s interval zostava len ako fallback na polling.
- Release metadata su aktualne pre
2026.6.2.post17. JS/CSS bundles a minifikovane sibling subory su pregenerovane, docs-sitelatestsmeruje na tuto verziu, dashboard Latest changes je aktualizovany a namespace service-worker cache jegitpulse-v139.
[2026-06-02] - Hranica config importu a oprava validacie formularov 2026.6.2.post16
Opravene
- Auto-import konfiguracie kurzu uz nezavisi od internych route exportov dashboardu.
scripts/import_course_configs.pyimportuje priamo dedikovany modulcourse_settings_config, takze deployment bootstrap netaha privatne helpery cez HTTP route modul a strict mypy je znovu cisty. - Zdielane formularove komponenty zachovavaju svoj deklarovany API. Bare text inputy uz prenesu validacne atributy (
pattern,minlength,autofocus), bare checkbox odosle zadanu hodnotu a required custom dropdown validuje cez focusovatelny proxy control namiesto ignorovanehorequiredhidden inputu. - Lokalny security scan wrapper reportuje riziko production zavislosti.
scripts/security_scan.pypouziva timezone-aware timestampy, parsujepip-auditJSON aj ked tool vypise advisory text a predvolene auditujerequirements.locknamiesto nesuvisiacich balikov z developer virtualenv.
Zmenene
- Release metadata su aktualne pre
2026.6.2.post16. JS/CSS bundles a minifikovane sibling subory su pregenerovane, docs-sitelatestsmeruje na tuto verziu, dashboard Latest changes je aktualizovany a namespace service-worker cache jegitpulse-v138.
[2026-06-02] - Kontrakt SSE helpera a vycistenie UI stylov 2026.6.2.post15
Opravene
- Zdielany SSE helper pre background ulohy ma explicitny kontrakt fallback pollingu. Manualny fallback pouziva
GP.apiCallnamiesto nahodneho globalneho identifikatora a completion callbacky su izolovane, aby chyba v page-level callbacku nenechala EventSource alebo fallback poller bezat donekonecna. - Globalny panel priebehu uz nepersistuje odstraneny ETA stav. ETA UI uz bolo nahradene elapsed casom, ale stary state kluc stale prechadzal cez localStorage a cross-tab merge. Legacy stav sa teraz ignoruje a uz sa nezapisuje.
- Drobne staticke inline styly sa presunuli do komponentoveho CSS. Link v cookie banneri, farby quick-access avatarov na dashboarde, summary header service accountov a rozmery avataru v dropdowne teraz pouzivaju triedy namiesto opakovanych inline deklaracii.
Zmenene
- Release metadata su aktualne pre
2026.6.2.post15. docs-sitelatestsmeruje na tuto verziu, dashboard Latest changes je aktualizovany a namespace service-worker cache jegitpulse-v137.
[2026-06-02] - Synchronizacia sekcie Diplomovka s aktualnym thesis repozitarom 2026.6.2.post14
Pridane
- Sekcia Diplomovka v docs-site je zosynchronizovana s aktualnym textom diplomovej prace. Slovenske kapitoly teraz zrkadlia najnovsi LaTeX zdroj z repozitara
dp.mykyta.olym/thesis, vratane novych stranok 4. Navrh riesenia a 5. Zaver, aktualizovaneho indexu prace a Mermaid diagramov architektury a toku udalosti. - Pridany je opakovatelny sync skript pre diplomovku.
scripts/sync_thesis_docs.pyprevadza LaTeX kapitoly cez Pandoc, spracuje projektove glossary/reference/tabulkove/diagramove makra a obmedzuje rucne kopirovanie textu.
Zmenene
- Ciele prace, navigacia a Latest changes su aktualne pre
2026.6.2.post14. Stranka cielov uz odkazuje na hotovy navrh riesenia, pilot a vyhodnotenie oznacuje ako dalsiu fazu, docs-sitelatestsmeruje na2026.6.2.post14a namespace service-worker cache jegitpulse-v136.
[2026-06-02] - Dedup fallback pollingu po SSE vypadku + aktualne docs metadata 2026.6.2.post13
Opravene
- Globalny panel priebehu uz po vypadku SSE nespusta duplicitne polling timery pre tu istu background ulohu.
streamJobProgress()uz vlastni fallback zo SSE na polling, ale globalny panel z error callbacku spustal aj svoj legacy poller. To mohlo zatvorit helper pocas prepinania rezimu a nechat duplicitne polling requesty na/api/v1/jobs/{id}. Panel teraz deleguje fallback zdielanemu helperu a helper znovu kontroluje, ci nebol zatvoreny pred spustenim interneho pollingu. - GitLab recovery toast sa uz nezobrazi pod hlavnym backend-health bannerom. GitLab-only recovery toast pocas sirseho backend vypadku bol zavadzajuci, preto sa teraz zobrazi len vtedy, ked je stale viditelny priamo GitLab banner.
- Metadata dokumentacie su znovu aktualne. Application/docs metadata je
2026.6.2.post13, docs-sitelatestsmeruje na rovnaku verziu, namespace service-worker cache jegitpulse-v135, dashboard Latest changes je aktualizovany a stare docs odkazy na2026.6.2.post4boli opravene.
[2026-06-02] - Zatvorenie beziacej synchronizacie nechava tlacidla zamknute + poistky pri mazani skupiny 2026.6.2.post12
Opravene
- Zatvorenie beziacej synchronizacie uz neodomkne tlacidla, ktore zamkla. Kliknutie na X pri stale beziacej ulohe v globalnej liste priebehu vymazalo ulohu z registra, ktory citaju strazcovia procesnych akcii, takze tlacidla Sync / Run Checks / Unlink / Delete Group sa nespravne odomkli pocas synchronizacie. Zatvorenie beziacej ulohy teraz iba skryje jej riadok priebehu - uloha zostava aktivna, takze tlacidla zostavaju zamknute a poller dalej sleduje dokoncenie; odstrani sa normalne, ked synchronizacia naozaj skonci.
- Projekt uz nie je mozne obnovit, kym je jeho skupina odstranena. Obnovenie jedneho projektu pod odstranenou skupinou by ho nechalo osamoteny (aktivny, no skryty vsade, kde je skryta skupina, a vyluceny z agregatu kurzu). Endpoint obnovenia to teraz odmietne s jasnou spravou a stranka projektu zobrazi vyhradeny banner "Skupina tohto projektu je odstranena", ktory ucitelov nasmeruje na obnovenie celej skupiny.
[2026-06-02] - Jeden toast synchronizacie v spravny cas + obnoveny CI lint 2026.6.2.post11
Opravene
- Jedno obnovenie alebo synchronizacia projektu uz nezobrazi dva toasty "Sync completed". Synchronizacia projektu zobrazila vlastny toast ("Sync completed"), zatial co agregat na urovni kurzu zobrazil dalsi ("Sync completed!"). Ich text sa lisi, takze 5-sekundova deduplikacia podla textu ich neodchytila, a ich kluce uloh sa lisia, takze ich neodchytila ani relacna deduplikacia - a rychlejsi toast projektu sa objavil skor, este pred dokoncenim agregatu. Toasty dokoncenia projektu / skupiny sa teraz zlucia do smerodajneho agregatu kurzu, takze jedna operacia ukaze presne jeden toast v spravny cas.
- Obnoveny CI lint (ruff). Pomocny skript mal nezoradene importy a nenaformatovane telo, ktore zlyhavalo v lint ulohe; teraz je zoradeny a naformatovany.
[2026-06-02] - Jeden riadok na synchronizaciu v globalnom paneli priebehu 2026.6.2.post10
Opravene
- Globalny panel priebehu uz nezobrazuje dva riadky pre jedno obnovenie alebo synchronizaciu projektu. Obnovenie ci synchronizacia jedneho projektu zaregistruje zaznam pre projekt ("Synchronizuje sa projekt..."), ale tu istu pracu ukazuje aj agregat na urovni kurzu ("DEVOPS: Syncing..."), pretoze feed aktivnych synchronizacii pocita bezsiace ulohy podla kurzu. Predchadzajuca deduplikacia zlucila oba zaznamy len pokym oba bezali, takze synchronizacia projektu, ktora skoncila skor (bezne pri malych/prazdnych repozitaroch), nechala druhy riadok "Sync completed". Zaznam synchronizacie projektu / skupiny sa teraz zluci do agregatu kurzu pre ten isty kurz bez ohladu na stav dokoncenia, takze jedna operacia ukaze presne jeden riadok.
[2026-06-02] - Odpojenie/obnovenie sa prejavi okamzite (zneplatnenie cache stranky) 2026.6.2.post9
Opravene
- Odpojenie alebo obnovenie projektu ci skupiny sa teraz prejavi okamzite bez toho, aby ste museli odist zo stranky a vratit sa. Detailove stranky servuju svoj narocny obsah z kratkozivej (60s) Redis cache fragmentu stranky, ale endpointy na odpojenie/obnovenie tuto cache nikdy nezahodili, takze opatovne nacitanie na mieste stale servovalo predchadzajuce telo (este aktivne alebo este odpojene), kym cache nevyprsala - preto sa zdalo, ze funguje len odchod a navrat. Endpointy na odpojenie a obnovenie pre projekty aj skupiny teraz okamzite zneplatnia dotknute cache stranok projektu / skupiny / kurzu / studenta, takze opatovne nacitana stranka hned zobrazi novy stav. Tym sa odstrani aj falosny duplicitny riadok v lavici postupu, ktory sa objavoval, kym zastarana stranka znovu registrovala prebiehajucu synchronizaciu.
[2026-06-02] - Bez vstupnych animacii, okamzite obnovenie/odpojenie, bez duplicitneho riadku 2026.6.2.post8
Opravene
- Stranky uz pri nacitani neblednu, neposuvaju sa ani neblikaju. Odstranili sme kazdu vstupnu/zobrazovaciu animaciu - krizovy prechod stranok, cele odhalenie stranky, postupne zobrazovanie lenivo nacitanych kariet aj zasunutie upozorneni/bannerov. Obsah sa vykresli okamzite a zostane staticky, takze pri nacitani, obnoveni ani zivom osviezeni nic neblika. Mrtve CSS a JS sme zmazali, nie len vypli.
- Odpojenie alebo obnovenie projektu sa teraz prejavi okamzite. Znovunacitanie, ktore prepne banner a tlacidla, prekryval snimok prechodu zobrazenia; po jeho odstraneni sa stranka cisto prekresli a novy stav sa zobrazi hned, nie az po opustenie a navrate do projektu.
- Globalny panel priebehu uz nezobrazuje duplicitny riadok "Waiting in queue...". Pocas behu synchronizacie na urovni kurzu sa nadbytocny zaznam pre projekt/tim rovnakeho kurzu zluci do agregatu kurzu.
[2026-06-02] - Sync po obnoveni dobehne a data sa osviezia na mieste 2026.6.2.post7
Opravene
- Obnovenie projektu uz nenecha sync donekonecna tocit. Endpoint obnovenia vracal surove RQ job id, ale globalny panel priebehu sa pyta
GET /api/v1/jobs/{id}, ktory hlada zaznam ulohy - surove id teda vzdy vratilo 404 a panel "Syncing project..." nikdy nedobehol. Endpoint teraz vytvori skutocnu ulohu na pozadi a vrati jej id, takze panel dobehne. - Stranka projektu osviezi data hned ako sync po obnoveni dobehne. Prispievatelia, commity a pipeline sa nacitaju znova na mieste, takze uz nemusite opustit projekt a vratit sa, aby ste videli aktualne cisla.
- Male karty uz neblikaju ani sa "neaktivuju dvakrat". Vstupna animacia na lenivo nacitanych paneloch (Prispievatelia, Statistiky repozitara, Chranene vetvy) teraz bezi najviac raz na kontajner namiesto opakovania pri kazdom zivom osviezeni.
[2026-06-02] - Obnovenie uz nezamrzne na "Restoring..." 2026.6.2.post6
Opravene
- Obnovenie odpojeneho projektu uz nezamrzne na "Restoring...". Predchadzajuci postup obnovenia cakal na dokoncenie syncu na pozadi este pred opatovnym nacitanim stranky; pri prazdnom alebo pomalom repozitari toto dokoncenie neprislo vcas, takze tlacidlo "Restoring..." a globalny panel priebehu visel 20-40+ sekund a stranka sa nikdy znovu nenacitala. Stranka projektu teraz zaregistruje sync v trvalom globalnom paneli priebehu a nacita sa ihned, takze projekt zobrazi obnoveny stav okamzite, kym sync bezi na pozadi.
[2026-06-02] - Obnovenie/odpojenie uz nevyhodi pouzivatela 2026.6.2.post5
Opravene
- Odpojenie projektu ani odstranenie skupiny uz nevyhodi pouzivatela na inu stranku. Obe akcie teraz znovu nacitaju aktualnu stranku na mieste, takze ihned vidite banner "odpojene"/"archivovane" a tlacidlo Obnovit namiesto presmerovania inam.
- Obnovenie projektu zobrazi sync na pozadi a osviezi data, ked dobehne. Endpoint na reaktivaciu vracia ID zaradenej ulohy obnovy; stranka projektu ho pripoji ku globalnemu panelu priebehu, streamuje priebeh a znovu nacita az ked sync naozaj dobehne.
- Prazdne repozitare teraz uvadzaju, ze sa nezapocitavaju. Upozornenie na prazdny repozitar teraz vyslovne uvadza, ze projekt je vyluceny z priemeru skupiny a rebrickov, kym tim nenahra kod.
[2026-06-02] - Tombstone projekty a blikanie animacii pri prvom nacitani 2026.6.2.post4
Opravene
- Projekty, ktore GitLab automaticky premenoval na
deletion_scheduledtombstone, sa uz nenacitavaju ani nezobrazuju ako obnovitelne skupiny. Ked GitLab naplanuje projekt na zmazanie, premenuje cestu na<path>-<hash>-deletion_scheduled-<id>, ale kratko ho dalej vracia cez API. Discovery sweep teraz tieto tombstone preskakuje a zoznamy na detaile kurzu a skupiny ich odfiltruju, takze projekt, ktory ucitel nikdy nezmazal, sa uz nezobrazuje ako duch "Deleted" skupina s anomalnymi datami. - Uvodne animacie a skeleton loadery uz pri prvom nacitani stranky neblikaju. Page-enter reveal teraz potlaca vsetky vstupne animacie potomkov pocas odhalenia (namiesto pevne zadaneho zoznamu tried), pricom slucky loaderov - spinnery, bodky, bar/skeleton shimmer, status pulzy - bezia dalej.
Zmenene
- Metadata aplikacie/docs zvysene na
2026.6.2.post4; namespace cache service-workera zvyseny nagitpulse-v128; bundle a minifikovane subory prebuildovane; dashboard Latest changes obnoveny.
[2026-06-02] - Obnova skupin a projektov ucitelom 2026.6.2.post3
Pridane
- Ucitelia mozu obnovit soft-deleted skupiny a odpojene projekty.
POST /api/v1/teams/{team_id}/reactivateaPOST /api/v1/projects/{project_id}/reactivateuz nie su len pre adminov; obnovit moze kazdy ucitel s pristupom ku kurzu. Obnova skupiny presne znovu aktivuje clenov a projekty deaktivovane poslednym delete a zaradi sync na pozadi, takze rebricky, metriky a kontroly sa hned zotavia. - Studenti maju nadalej read-only viditelnost skore vlastnej archivovanej skupiny. Odstranene skupiny a odpojene projekty ostavaju dostupne pre ich clenov s jasnym archivacnym bannerom, ze data su zmrazene pre referenciu, zatial co personal vidi Delete/Unlink odznaky, tlacidla obnovy a prepinac na zobrazenie alebo skrytie archivovanych riadkov.
Opravene
- Deaktivovane skupiny a projekty uz nenavysuju agregaty kurzu. Pocty prispievatelov, zelene/cervene stavy, ukazovatele never-synced a stale-data a sync pocitadla beru do uvahy len aktivne skupiny. Metrics worker, project sync worker aj
compute_team_metricspreskakuju archivovane skupiny/projekty, takze scoring, rebricky a analytika ich vylucuju konzistentne.
Zmenene
- Application/docs metadata je
2026.6.2.post3; Service Worker cache jegitpulse-v127; bundle a minifikovane sablony su prebuildene, slovenske preklady su kompletne (0 chybajucich retazcov) a obnovovacie endpointy vracaju DTO-style JSON odpovede pokryte unit testami.
[2026-06-02] - Guardy pre Delete Group a Unlink Project 2026.6.2.post2
Opravene
- Nebezpecne akcie skupin a projektov maju backend guard.
DELETE /api/v1/teams/{team_id}aDELETE /api/v1/projects/{project_id}sa serializuju cez team/project mutation scope a pocas aktivnehosyncaleborun_checksvracaju409 Conflict, takze priamy API request nemoze obist UI guard a pretekat so zapisom score alebo project state. - Delete Group deaktivuje aj projekty skupiny. Soft-delete skupiny teraz vypne aktivne
GitLabProjectriadky spolu s aktivnymi clenmi, aby dashboard, sync discovery a webhook spracovanie zodpovedali kontraktu tlacidla. - Webhooky z odpojenych projektov sa uz nespracuju. Autentifikovane GitLab webhooky pre inactive project vracaju
ignoredbez vytvoreniaWebhookEvent, takze odpojeny projekt ostane preskoceny az do explicitnej reaktivacie. - Delete Group v course detaile pouziva kliknute tlacidlo. Odstranenie riadku uz nepouziva substring selector cez
data-action-argsa scoring toggle tlacidla maju deklarativnysync run_checksprocess lock. - Application/docs metadata je
2026.6.2.post2; Service Worker cache jegitpulse-v126; bundle a minifikovane sablony su prebuildene a guardy destructive akcii su pokryte focused unit/source-pattern testami.
[2026-06-02] - Latest changes limit a release-date guard 2026.6.2.post1
Opravene
- Dashboard Latest changes ma deterministicky non-positive limit.
_get_changelog_entries(limit=0)aj negativne limity vracaju prazdny zoznam namiesto Python negative slicing spravania, kdelimit=-1vratil takmer cely feed widgetu. - Validacia release datumu dashboard changelogu cita datum z package verzie. Test odvodi aktualny release den z CalVer hodnoty v
pyproject.toml, takze sa uz neduplikuje rucne udrziavana konstanta. - Application/docs metadata je
2026.6.2.post1; Service Worker cache jegitpulse-v125; bundle a minifikovane sablony su prebuildene a limit/date kontrakty widgetu su pokryte unit testami.
[2026-06-02] - Team member badge bez bodiek 2026.6.2
Opravene
- Role a score badge v tabulke clenov skupiny uz nezobrazuju osamotene bodky. Textove bunky v
team-members-tablesa stale skracuju cez ellipsis, ale badge-only bunky maju vlastnymember-badge-cellkontrakt stext-overflow: clip, takzeMentor,Maintainera percenta score neziskaju bodku vedla pilulky. - Mapovanie access-role badge je single-source. Duplicita v student aj staff variante tabulky sa presunula do zdielaneho
member_access_role_badge()komponentu. - Application/docs metadata je
2026.6.2; Service Worker cache jegitpulse-v124; bundle a minifikovane sablony su prebuildene a overflow kontrakt badge buniek je pokryty unit testami.
[2026-06-01] - Docs-site nginx bez cache/index dier pri 404 2026.6.1.post8
Opravene
- Vlastna 404 stranka docs-site uz nezostava cacheovatelna ani indexovatelna. Internal
/404.htmllocation teraz opakuje explicitnyCache-Control: no-store, no-cache, must-revalidateheader a pridavaX-Robots-Tag: noindex, nofollow, nosnippet, cim zatvara medzeru sposobenu tym, ze Nginxadd_headersa pri definicii v location blokoch nededi. - Health endpoint docs-site je presny plain-text kontrakt.
/healthje exact location sdefault_type text/plain, takze nahodne/health...cesty uz nevyzeraju zdravo a endpoint nepouzivaadd_headernaContent-Type. - Application/docs metadata je
2026.6.1.post8; Service Worker cache jegitpulse-v123; bundle a minifikovane sablony su prebuildene a nginx header kontrakty su pokryte unit testami.
[2026-06-01] - Lokalny cas vsade a ziadny nativny pull-to-refresh 2026.6.1.post7
Opravene
- Vsetky casove udaje sa teraz zobrazuju v lokalnom casovom pasme namiesto UTC. "Posledna synchronizacia" na stranke projektu (chybal jej marker
data-localize-timea pouzivalaisoformat()bez casoveho pasma), plus casy commitov, issues, merge requestov, CI scenarov, konfliktov, Docker reportov, importu rosteru a analyz zobrazovali surovy serverovy UTC cas. Vsetky teraz renderuju cez jednu zdielanu Jinja funkciulocal_time(), ktora emituje kanonicky...Z<time data-localize-time>element;localize-time.jsho prevedie na strane klienta a ziskaldata-localize-format, takze vlastne formaty (HH:MM,Mon DD, HH:MM) prezivaju. - Nativny biely pull-to-refresh indikator Chrome uz nevyskakuje na mobile / nainstalovanej PWA. Potlacenie overscrollu bolo nastavene iba na
<body>, ale vlastnost musi byt na korenovom<html>, aby dosiahla viewport, takze nativny refresh sa stale zobrazoval popri vlastnom indikatore aplikacie. Pravidlo teraz cieli aj na<html>. - Application/docs metadata je
2026.6.1.post7; Service Worker cache jegitpulse-v122; bundle a minifikovane sablony su prebuildene.
[2026-06-01] - Stlpec Posledna aktualizacia bez blikania 2026.6.1.post6
Opravene
- Stlpec "Posledna aktualizacia" v tabulke skupin uz neblika medzi UTC a lokalnym casom. SSE feedy
/sync-streama/live-datazdielali tu istu bunku, ale renderovali ju roznymi formatmi, takze hodnota pri kazdom update skakala medzi serverovym UTC casom a lokalnym casom pouzivatela. Obe feedy teraz prechadzaju cez jednu funkciu_renderLastUpdated()kluciovanu ISO peciatkou, ktora prekresli bunku iba ked sa skutocne zmeni casova peciatka. - Application/docs metadata je
2026.6.1.post6; Service Worker cache jegitpulse-v121; bundle a minifikovane sablony su prebuildene.
[2026-06-01] - Deklarativne akcie bez inline expression eval 2026.6.1.post5
Zmenené
- Komponentove akcie uz nepouzivaju
data-action-expraninew Function. Zdielane frontend core spusta iba pomenovanedata-actionhandlery s JSON argumentmi a projektove empty-state tlacidla teraz volajuclickElementByIdcez tento strukturovany kontrakt. - Application/docs metadata je
2026.6.1.post5; Service Worker cache jegitpulse-v120; generovane bundle a minifikovane siblings boli rebuildnute.
[2026-06-01] - Okamzity refresh process guardov pri job update 2026.6.1.post4
Opravene
- Zamky procesnych akcii teraz reaguju na
gp:job-update. Zdielany guard sa obnovi, ked global job bar spusti alebo aktualizuje sync/import/run-checks job, takze konfliktne tlacidla sa vypnu hned a necakaju na fallback polling interval. - Application/docs metadata je
2026.6.1.post4; Service Worker cache jegitpulse-v119; generovane bundle a minifikovane siblings boli rebuildnute.
[2026-06-01] - Process guard root refresh a component cleanup 2026.6.1.post3
Zmenené
- Nepouzivany komponent
process_status.htmlbol odstraneny. Dashboard a detail predmetu pouzivaju externy modulimport-stream.jsa zdielane global-job/process-guard moduly namiesto importu legacy inline-JS makier. GP.refreshProcessActionGuards(button)teraz vyhodnoti aj samotny button. Jednotlivo dynamicky vlozene ovladacie prvky sa zamknu hned pocas aktivneho sync/import/run-checks procesu, aj ked sa neobnovuje parent kontajner.- Application/docs metadata je
2026.6.1.post3; Service Worker cache jegitpulse-v118; generovane bundle a minifikovane siblings boli rebuildnute.
[2026-06-01] - Preskocenie cross-document View Transition sa uz neloguje 2026.6.1.post2
Opravene
- Cross-document View Transitions uz nelogovaju
AbortError: Transition was skipped. Taby predmetu a odkazy navigacie idu cross-document, kde CSS pravidlo@view-transition { navigation: auto }riadi prelinanie. Ked sa transition preskoci (klik na dalsi tab pred dokoncenim prveho, opakovany klik na aktivny tab, alebo skrytie tabu pocas navigacie), prehliadac odmietne promisy transitionu. Teraz su spracovane priamo cez udalostipageswapapagerevealnamiesto neodchytenej "(in promise)" chyby. - Application/docs metadata je
2026.6.1.post2; Service Worker cache jegitpulse-v117; generovane bundle a minifikovane siblings boli rebuildnute.
[2026-06-01] - Externy course-tabs modul a cistenie komponentov 2026.6.1.post1
Zmenené
- Klavesova navigacia v course taboch je v
course-tabs.js. Zdielany partial navigacie predmetu uz nevklada inline JavaScript; spravanie je vcore.bundle.jsa chrani ho regresny test. - Zdielany native select komponent uz neponuka inline
onchangeescape hatch. Aktualni volaci pouzivaju deklarativne data/action kontrakty alebo Alpine bindingy. - Application/docs metadata je
2026.6.1.post1; Service Worker cache jegitpulse-v116; generovane bundle a minifikovane siblings boli rebuildnute.
[2026-06-01] - Oprava tooltipov bez hoveru 2026.6.1
Opravené
- Tooltipy sa už nezobrazujú bez prejdenia myšou. Predvolený trigger Tippy je
mouseenter focus, takže keď focus-trap modalu (alebo kliknutie myšou) programovo zaostril tlačidlo sdata-tippy-content- najviditeľnejšie zatváracie (X) tlačidlo - tooltip sa zobrazil bez hoveru. Tooltipy teraz potlačia zobrazenie pri focuse, pokiaľ focus nepochádza z klávesnice (:focus-visible), čím sa zachová prístupnosť a odstránia neželané popupy. - Application/docs metadata je
2026.6.1; Service Worker cache jegitpulse-v115.
[2026-05-31] - Bezpečnejšie cache dashboardu a oprava HTML v docs 2026.5.31.post3
Opravené
- Prihlásené dashboard HTML sa už neukladá cez Service Worker. Worker obchádza
/dashboardnavigácie a spoločné cache helpery odmietajú odpovede sCache-Control: no-storealeboprivate, aby zodpovedali kontraktu security middleware. - Logout teraz posiela dokumentovaný browser cleanup header.
GET /dashboard/logoutodstráni session cookie a vrátiClear-Site-Data: "cache", "storage". - Docs logo override už nevytvára vnorené anchory. Custom MkDocs Material partial renderuje iba obrázok/ikonu a vlastníctvo linku necháva na theme template header/nav.
- Application/docs metadata je
2026.5.31.post3; Service Worker cache jegitpulse-v114.
[2026-05-31] - Centralizovana SEO politika dokumentacie 2026.5.31.post2
Zmenene
- Dokumentacne SEO signaly su teraz riadene centralne. MkDocs hook
hooks/seo_policy.pyoznacuje technicke a interne sekcie (vyvojari,operatori,gitlab,bezpecnost,api,diplomovka,changelog,tags) akonoindex, follow, nosnippet, aby sa v Google nezobrazovali nahodne runbooky, tokenove priklady alebo interny changelog ako sitelinky. Verejne sekcie pre produkt, onboarding studentov/ucitelov a pravne stranky ostavaju indexovatelne. - Sitemapy su rozdelene podla vlastnictva. Root
/sitemap.xmlpatri aplikacii a obsahuje iba/dashboard/login;/docs/sitemap.xmlpatri MkDocs a hook z neho odstraňujenoindexURL.robots.txtexplicitne uvadza oba sitemapy, takze Google dostava konzistentne signaly bez duplicitnych docs URL v root sitemape.
[2026-05-31] - SRP rozdelenie stranok prehladu, analytiky a administracie 2026.5.31.post1
Zmenene
- Rozdelenie kontrolerov stranok prehladu, analytiky kurzu a administracie na zdrojove casti s jednou zodpovednostou. Po rozdeleni Admin Courses su aj tri zostavajuce ~1,1 tis. riadkov dlhe skripty stranok teraz pisane ako usporiadane fragmenty
_parts/<stranka>/NN-*.jsa builder ich spaja doslovne spat do obsluhovaneho suboru. Vystup je bajtovo identicky, takze nedochadza k ziadnej zmene spravania - iba zdrojovy kod je teraz maly a ma jednu zodpovednost, v zhode s kazdym inym rozdelenym strankovym kontrolerom.
[2026-05-31] - SRP rozdelenie Admin Courses a refresh cache 2026.5.31
Zmenene
- Admin Courses frontend teraz pouziva rovnaky SRP vzor ako ostatne velke strankove kontrolery.
pages/admin-courses.jssa generuje z_parts/admin-courses/00-core.js,10-lifecycle.jsa20-events.js, takze konfiguracia, lifecycle mutacie a delegovane udalosti maju oddelenych vlastnikov a served subor ostava deterministicky build artifact. - Lifecycle zmeny riadkov kurzov pouzivaju spolocne UI kontrakty. Archive/activate/delete swapy renderuju spolocny
status-indicator, icon-only tlacidla, obnovene tooltipy a scoped process guards po kazdej dynamickej DOM zmene. - Release metadata a staticke assety su aktualizovane. Verzia je
2026.5.31, bundly a.minsiblingy boli rebuildnute, dashboard Latest changes bol aktualizovany a Service Worker cache jegitpulse-v113.
[2026-05-30] - Animovany prepinac oka pre skore, konzistentne tooltipy, zivy prepocet 2026.5.30.post11
Zmenene
- Vylepseny ovladac zahrnut/vylucit zo skore (oko) v tabulkach clenov. Ikona oka / preskrtnuteho oka sa teraz pri prepnuti studenta animuje pruzny "pop", tlacidlo zostava viditelne a zafarbene pokial je riadok vyluceny, takze vratitelny stav je jasne citatelny, a hover/stlacenie pridavaju jemnu zmenu mierky. Ovladac teraz pouziva konzistentny Tippy tooltip (ziadny duplicitny natívny tooltip prehliadaca) a stmavnutie vyluceneho riadku prechadza plynulo namiesto skokoveho. Prepnutie studenta stale prepocita skupinovy priemer, semafor, pocty prispievatelov a skore rubriky naživo - bez obnovenia stranky. Vsetka animacia respektuje
prefers-reduced-motion.
[2026-05-30] - Oprava resetu casovaca medzi navigaciami a SW v101 2026.5.30.post10
Opravene
- Oprava resetovania casovaca priebehu pri kazdej navigacii medzi strankami. Ked sa riadok synchronizacie kurzu po prechode na inu stranku znova vytvoril, dostal aktualny cas namiesto skutocneho casu zaciatku synchronizacie zo servera, takze sekundy sa zakazdym vynulovali. Riadok teraz ukotvi svoj casovac na serverovy
started_at_msa zachova najskorsi znamy zaciatok, takze casovac je medzi navigaciami monotonicky.
[2026-05-30] - Spresnenie casovacieho vlakna, SRP refaktor cashovania a SW v100 2026.5.30.post9
Opravene
- Oprava restartovania casovaca v riadku uloh. Pasivne rekonciliacne volania (skenovanie kariet kurzu) predtym mohli omylom interpretovat beziacu synchronizaciu ako novy beh, vynulovat progress bar a nastavit zaciatok uloh na aktualny cas. Indikator SSE teraz stabilne chrani povodny monotonic_start cas, vdaka comu sa sekundy v zobrazeni neresetuju spat na nulu.
Zmenene
- Refaktorizovali sme cache system pre splnenie Single Responsibility Principle (SRP). Zarucena nulova sanca uniku pre CSRF tokeny a CSP nonce napriec vsetkymi strankami cache htmx detailov.
- Service Worker verzia kesovania povysena na v100. Static cache kluce boli povysene na ciste zneplatnenie starych offline cache suborov.
[2026-05-30] - Okamzity globalny indikator s fazou "Pripajanie..." 2026.5.30.post8
Zmenene
- Globalny indikator priebehu sa teraz zobrazi okamzite s fazou "Pripajanie...". Spustenie synchronizacie kurzu (Sync All), projektu alebo synchronizacie zo stranky nastaveni kurzu predtym zobrazilo globalny indikator az po navrate poziadavky zo servera. Kvoli kontrole dostupnosti GitLabu (ktora opakuje a moze trvat niekolko sekund) pouzivatel pocas toho okna nevidel ziadny indikator a mohol tlacidlo opakovane klikat. Indikator sa teraz zobrazi s neurcitym spinnerom "Pripajanie na GitLab..." hned po kliknuti, co tiez okamzite aktivuje existujucu ochranu proti opakovanemu kliknutiu. Po zaradeni synchronizacie sa indikator zmeni na realnu spravu "Synchronizujem: X/Y skupin..."; ak poziadavka zlyha, chyba sa zobrazi priamo v indikatore (nielen ako docasny toast). Bezpecnostny casovac zaruci, ze spinner "Pripajanie" nikdy nezostane viset.
[2026-05-30] - Spolahlivost synchronizacie: opakovany pre-flight GitLabu 2026.5.30.post7
Opravene
- Synchronizacia uz nezlyha, ked GitLab raz odpovie pomaly. Vstupne body synchronizacie pred zaradenim uloh spustaju kontrolu dostupnosti GitLabu. Pouzivala jednu 4 s poziadavku bez opakovania, takze jedna prechodna pomala odpoved vratila
503 "GitLab server is currently unreachable"a synchronizacia neurobila nic. Kontrola teraz raz zopakuje pokus (5 s na pokus, 0,4 s odstup) a za nedostupne povazuje az dve po sebe iduce zlyhania.
[2026-05-30] - Opravy Tyzdennej analytiky + telemetricke typovanie 2026.5.30.post6
Opravene
- Tyzdenna analytika sa otvori na poslednom tyzdni s datami. Ked sa vyucba konci, studenti prestanu commitovat, takze aktualny tyzden je casto prazdny, zatial co tyzdenny vypocet skore prenasa compliance dalej. Prehliadac predtym automaticky vybral aktualny (prazdny) tyzden a zobrazil "Ziadne GitLab udalosti v tomto tyzdni", co vyzeralo ako strata dat. Teraz automaticky vyberie posledny tyzden so skutocnou aktivitou alebo compliance trendom. Sonda do produkcnej DB potvrdila, ze ziadne data sa nestratili - po vyucbovom tyzdni 12 jednoducho neboli ziadne commity.
- Tyzdne skuskoveho obdobia su dostupne a oznacene v Tyzdennej analytike. Vyber tyzdna bezal len
1..semester_weeks, takze tyzdne skuskoveho obdobia nemali ziadnu znacku a nezobrazovali oranzove oznacenie EXAM PERIOD. Vyber sa teraz rozsiruje cez skuskove obdobie s oranzovymi znackami "Exam" a cipom "Exam Period - Tyzden N" v hlavicke detailu. - Prazdny stav vyhladavania kurzov. Filtrovanie mriezky "Vase kurzy" na dopyt bez zhody teraz zobrazi prehladny komponent prazdneho stavu namiesto prazdnej plochy.
- Sest telemetrickych modelov prepisanych na typovanie SQLAlchemy 2.0.
FlaggedTeamResolution,StudentComplianceSnapshot,ClicksAvoidedMetric,TeacherActivityMetric,TelemetryAggregateaEvaluationReportboli prepisane zo starych priradeniColumn(...)naMapped[] / mapped_column, rovnako ako skorsia migraciaSupportTicket. Pylance teraz spravne odvodzuje typy atributov (napr.flagged_at: datetime,week_number: int) namiestoColumn[X], cim zmizli falosne typove chyby vpilot_telemetry.pya nadbytocne obalycast(...); pridana bola aj chybajuca kontrolaNonepred odpocitanimdatetime. Bez zmeny spravania ani schemy databazy.
[2026-05-30] - Zeleny scan kontajnerov (protobuf CVE) 2026.5.30.post5
Opravene
- Bezpecnostny scan kontajnerov (Trivy) je opat zeleny. Tranzitivna zavislost
protobufbola drzana na4.25.9stropomprotobuf<5.0, ktory zaroven pripinalopentelemetry-protona starsiu vetvu1.27. Tato verziaprotobufobsahovala opravitelnu HIGH/CRITICAL zranitelnost CVE-2026-0994, takze jobycontainer-scan-apiacontainer-scan-workerpadali. Strop sa zvysil naprotobuf>=5.29.6,<6.0, cim saprotobufposunul na opravenu5.29.6a OpenTelemetry sa dorozriesilo na1.42.1(stabilne1.xAPI - ziadna zmena kodu aplikacie).requirements.lockbol pregenerovany na Linuxe, aby sedel s CI.
[2026-05-30] - Zelena CI pipeline + rychlejsia analytika 2026.5.30.post4
Opravene
- CI pipeline opat zelena. Commit
f0cb9816malrequirements.lockvygenerovany na Windowse, takze obsahovalcolorama(len Windows) a chybaluvloop(len Linux). CI bezi na Linuxe (python:3.12-slim), takzelockfile-checklock pregeneroval, dostal opacnu sadu balickov a job sa rozbil. Lock je teraz vygenerovany na Linuxe (zhoduje sa s CI). Zarovenmypyhlasil zvysnycast(int, ...)a# type: ignore[assignment], ktore sa stali nadbytocnymi po post3 typovani modeluSupportTicket- odstranene - ahome_changelog.pybol preformatovany cezruff format. - Stranka analytiky kurzu sa uz nezasekne pri prvom nacitani. Tazky fragment analytiky sa pocita ~60-95 s na velkom kurze, co prekracovalo globalny 90 s htmx timeout, takze po kazdom deployi (cache je viazana na GIT_SHA = studeny stav) prve nacitanie spadlo do
htmx:timeouta "nic sa nenacitalo". Timeout pre tento fragment je teraz 180 s a TTL cache stupol z 60 s na 600 s, takze raz vypocitana analytika ostane tepla a dalsie nacitania su okamzite. Verzia2026.5.30.post4.
Opravene
- Model
SupportTicketprepisany na SQLAlchemy 2.0 typovanie. StareColumn(...)priradenia sposobovali, ze Pylance odvodzoval kazdy atribut akoColumn[X], co produkovalo 11 falosnych chyb v dashboard support route. Model teraz pouzivaMapped[...] / mapped_column(...)ako jeho susedne modely. Cisto typova zmena - spravanie ORM je identicke;mypyaj cielene testy prechadzaju. lockfile-checkopat deterministicky.exclude-newerukazoval na buduci cas, takze kazde CI re-rozriesenie chytalo balicky vydane "dnes" arequirements.lockdriftoval do cervena. Teraz je pripnuty na minuly cas a novy.gitattributesvynucujeeol=lfprerequirements.lock, takze Windows CRLF commity uz nemozu zlomit lint gate. Verzia2026.5.30.post3.
[2026-05-30] - SRP rozdelenie (najvacsi subor -> JSON data) 2026.5.30.post2
Zmenene
- Najvacsi zdrojovy subor bol rozdeleny podla principu jednej zodpovednosti.
src/app/api/dashboard/home_changelog.py(1511 riadkov) obsahoval ~1490 riadkov rucne udrziavanych "Latest changes" dat priamo v kode. Data su teraz vhome_changelog_entries.jsona Python modul je tenky lokalizacny nacitavac. Data su oddelene od logiky; dashboard widget aj regresne testy citaju rovnake zaznamy s nulovou zmenou spravania. - Verzia
2026.5.30.post2. Iba struktura backendu - ziadna zmena sablon, JS ani CSS, takze bundles a service-worker cache ostavaju nezmenene.
[2026-05-30] - Pokracovanie SRP rozdelenia (strankove kontrolery) 2026.5.30.post1
Zmenene
- Pokracovanie SRP rozdelenia na dalsiu vrstvu velkych strankovych kontrolerov.
pages/course-detail.js(1414 riadkov) apages/team-detail.js(1216 riadkov) su teraz rozdelene na usporiadane, 'cisto zostavove' casti v_parts/, ktorescripts/build_bundle.pyspaja verbatim:course-detail/na00-sync-stream/10-teams-crud/20-sync-all/30-course-dataateam-detail/na00-core/10-sync/20-analysis-boot/30-live. Doruceny subor sa regeneruje bajt po bajte identicky (overene cez SHA-256 abuild_bundle.py --check), takze ziadna zmena spravania.
[2026-05-30] - SRP rozdelenie vsetkych 1500+ riadkovych suborov 2026.5.30
Zmenene
- Vsetky 1500+ riadkove zdrojove subory boli rozdelene podla principu jednej zodpovednosti (SRP) na mensie moduly bez zmeny spravania. Front-endove giganty (
core.js,global-job-bar.js,tour-engine.js,project-detail.js,course-settings.jsaresponsive.css) boli rozdelene na 'cisto zostavove' casti v priecinkoch_parts/, ktore build skript spaja spat do identickeho vysledku (overene bajt po bajte na minifikovanom bundli). Backendove API moduly (courses, sync, telemetry, teams, projects, report/sync joby) maju pomocne casti vyclenene do susednych modulov.
[2026-05-29] - Skeletony pouzivaju realne komponenty 2026.5.29.post1
Zmenene
- Nacitavacie skeletony teraz pouzivaju realne komponenty stranky namiesto paralelneho
gl-skeleton-*rozlozenia. Skeleton primitiva vcomponents/loaders.htmlmali vlastne kontajnery pre karty / statistiky / tabulky / formulare, kazdy s osobitnymi responzivnymi media queries, ktore sa lisili od realneho UI. Makrask_stat,sk_stats,sk_card,sk_tableask_formteraz generuju realny markup komponentov -.stat-card/.stats-grid/.card/table.data-table/.form-group- so shimmer pruhmi.gl-skeletonv listovych slotoch, takze rozlozenie a responzivnost dedia priamo od zivych komponentov a nemozu driftovat. Signatury makier sa nezmenili, takze ziadne call-site nebolo treba upravovat. - Odstranene mrtve skeleton CSS (
.gl-skeleton-card,.gl-skeleton-stat,.gl-skeleton-table/-thead/-rows ichnth-childvariabilitou a media queries,.gl-skeleton-stats-grid,.gl-skeleton-field/-label/-input). Primitiv.gl-skeleton,.gl-skeleton-tr,.gl-skeleton-cards-grida rodina.gl-skeleton-list*ostavaju.
Release
- Verzia
2026.5.29.post1. Iba zmena sablon + CSS; bundly prebudovane. Bez backend zmien.
[2026-05-29] - Deterministicky lockfile-check 2026.5.29
Opravene
- CI job
lockfile-checkje teraz deterministicky a uz nepada kvoli nesuvisiacim novym verziam balikov. Job spustauv pip compile pyproject.toml --extra otel -o requirements.locka potomgit diff --exit-code requirements.lock. Kedze takmer kazda zavislost pouziva otvoreny rozsah>=,uvpri kazdom behu znova rozriesil na najnovsie verzie z PyPI, takze lockfile "driftoval" a job sa rozsvietil na cerveno vzdy, ked hociktora priama alebo tranzitivna zavislost vydala novu verziu - aj ked sa v repozitari nic nezmenilo. Pridana sekcia[tool.uv]sexclude-newer = "2026-05-30T00:00:00Z", ktora pripne rozriesenie na pevny casovy bod.requirements.locksa regeneruje bajt po bajte rovnako a gate ostava reprodukovatelny, kym sa timestamp zamerne neposunie.
Vydanie
- Verzia
2026.5.29. Bez bumpu service-worker cache: ide o zmenu iba v CI/build konfiguracii, ziadne klientske assety sa nezmenili.
[2026-05-23] - Dolacenie commit kategorie v UI 2026.5.23.post2
Opravene
- Checklist chart na Course Analytics farbi commit-kategorie bary spravnou ruzovou (
#ec4899). Po remape R13 nacommitvpost1mapacategoryColorsvcourse-analytics.jsstale kludila klucquality:(engine takuto hodnotu uz neposiela). R13 a vlastne commit-kategorie kontroly preto padali na fallbackcustom(fialova). Kluc premenovany nacommit:(rovnaka ruzova), takze category stripe na chart-e zladi s farbou badgeu inde v UI. - Filter toolbar v Course Settings dostal chybajuce tlacidlo
Commit. Filter nad tabulkou kontrol ponukal ibaIssue,MR,Review,CI/CD- bezCommitucitelia nedokazali tabulku zuzitkovat na R13 alebo vlastne kontroly scategory="commit". Tlacidlo doplnene cez existujucifilter_btnmacro; JS filter handler je data-driven a nepotreboval zmenu.
Release
- Verzia
2026.5.23.post2, service-worker cachegitpulse-v99.
[2026-05-23] - Kategoria Commit naprie celym stackom 2026.5.23.post1
Opravene
- Kategoria
Commitje teraz plnohodnotna naprie celym stackom kontrol. Edit Check modal predtym ponukal iba pat moznosti (issue,mr,review,ci,custom); kontroly ulozene scategory=commitsa zobrazovali s prazdnym pollom Category, lebo hodnota nebola v zozname a JS badge/label mapy ju nemapovali. Pridana volba('commit', t('Commit'))do dropdownu acommit:zaznamy doCATEGORY_BADGES(badge-purple) aCATEGORY_LABELSvcourse-settings.js. - Pydantic schemy a backend validatory akceptuju
commit. RozsireneALLOWED_CATEGORIESa dvaLiteral[...]unie vschemas/custom_check.py, takze custom-check API uz nevracia 422. Zladene ajvalid_categoriesset a docstring pre LLM suggestions vapi/dashboard/course_checks.pya stlpcovy komentar vmodels/custom_check.py. - R13 (
Commit Quality) je teraz mapovany na kategoriucommit. Predtym_CHECK_CATEGORIESvcompliance/engine.pymapovalR13na osamoteny"quality"bucket, ktory nikto iny nepouzival, takzecommit_scorebol vzdyNonev category breakdown a pilot telemetrii. Premapovane na"commit", do mnozinyall_catsv_compute_category_scorespridana hodnota"commit", rovnaka zmena vpilot_telemetry._FALLBACK_CHECK_CATEGORIESa pridanie"commit"do iteracnej n-tice v_derive_category_scores.
Release
- Verzia
2026.5.23.post1, service-worker cachegitpulse-v98.
[2026-05-23] - Scoped button a modal guards 2026.5.23
Opravene
- Tlacidla a modaly uz pokryvaju zvysne course/project write akcie. Archive/activate/delete kurzu, dashboard Add Group a edit kurzu, course-settings scoring/config importy, admin course actions a project unlink kontroluju aktivny
course/team/projectprocess scope pred otvorenim modalu alebo zmenou dat. - Process-lock click guard je fail-closed. Kazdy element s
data-process-lock-whensa overi este raz pri kliku, nie iba cez 1.5s poll, takze zastarany disabled stav nepusti konfliktne sync/import/run-check akcie. - Dynamicke tlacidla dedia scope. Tlacidla vlozene po archive/activate operacii sa hned refreshnu cez zdielany process guard bez reloadu stranky.
Release
- Verzia
2026.5.23, sw cachegitpulse-v97.
[2026-05-22] - Spinner anomalie a obnova toastov 2026.5.22.post7
Opravene
- SVG spinnery (.spinner, .spinner-inline) maju teraz
transform-origin: 50% 50%atransform-box: fill-box, takze sa pri hoveri rodicovskej karty s transform efektom uz netocia okolo lavho horneho rohu a animacia je hladka. - Stratene completion toasty pocas navigacie. Ked sync skoncil presne v momente navigacie (SSE complete event medzi
beforeunloada unload),_preserveFlashToast()uz mal odfotenu prazdnu toast schranku a toast sa stratil. Restore vetva v_restoreJobsteraz pre obnovene done/error/finishing jobs zaradi completion toast do replay fronty (session-dedup blokuje duplicity v ramci toho isteho page-load) a okno pre nav-replay sa rozsirilo z 3 s na 8 s, aby sa pomalsie navigacie stihli.
[2026-05-22] - Scoped process locks 2026.5.22.post6
Fixed
- Scoped process locky sleduju hierarchiu course/team/project. Per-team sync, per-project sync a run-check jobs pouzivaju stabilne scoped job keys, takze aktivna praca v jednej skupine neblokuje nesuvisiace kurzy alebo skupiny, no konfliktne akcie v rovnakom team/project scope ostavaju zamknute.
- Course-level Run Checks ostava zamknuty az do realneho konca prace. Pribudol aggregate run-check status endpoint a global job bar ho polluje, aby sa modaly/tlacidla neodomkli hned po fan-out enqueue, kym per-team joby este bezia.
- Exclude from scoring je guardovane konzistentne. Toggle tlacidla hodnotia scope konkretneho riadku, pouzivaju zdielane ikony a backend berie team advisory lock pred kontrolou aktivnych scoring jobov.
Release
- Verzia
2026.5.22.post6, sw cachegitpulse-v95.
[2026-05-22] - Scope-aware imperative guards 2026.5.22.post5
Fixed
- Doplnene scope filtrovanie aj pre imperativne process guards. Click handlery pre per-team sync, per-project sync, run checks a course-level sync-all/import/run-checks teraz posielaju
course/team/projectscope doguardProcessAction, takze varovny toast "Wait for the active sync to finish" uz nevyskakuje pri akciach v inom kurze. - Dashboardove Import tlacitka. Zamykaju sa iba inym aktivnym importom, nie bezucim sync v lubovolnom kurze.
- Skeleton course-detail. Vykresluje vsetky 4 akcne tlacitka (Add Group / Import from GitLab / Sync All / Run Checks), aby zodpovedal realnej strukture po nacitani HTMX obsahu 1-na-1.
Release
- Verzia
2026.5.22.post5, sw cachegitpulse-v94.
[2026-05-22] - Per-course sync independence 2026.5.22.post4
Fixed
- Opravene blokovanie synchronizacie naprieg kurzami. Process guard uz vie rozlisit, ktoreho kurzu/grupy/projektu sa bezici job tyka. Spustenie sync v jednom kurze uz neblokuje import alebo sync v inom kurze; run-checks a sync sa stale navzajom branie iba v ramci toho isteho tymu/projektu; dashboardove Import tlacitka su nezavisle od per-kurzovych jobov. Vsetky job-start call-sites pridavaju
courseId,teamId,projectIdajobKinddo meta, takze guards filtruju presne.
Release
- Verzia
2026.5.22.post4, sw cachegitpulse-v93.
[2026-05-22] - Process action guards 2026.5.22.post3
Opravene
- Konfliktne sync/import/run-check akcie sa blokuju konzistentne. Tlacidla a modal triggery pouzivaju spolocny process guard a page handlery robia rovnaky preflight pred programatickym spustenim prace.
- Project sync pouziva spravny global-job API povrch. Project stranka uz necita chybajuce aliasy z
window.GP, takze detekcia aktivneho syncu, registracia progressu aj cleanup po dokonceni idu cez kanonicke global-job helpery. - Backend sync/check races teraz failuju zatvorene. Team/project/course sync a run-check endpointy zdielaju team-scope advisory locky a pri konfliktnych aktivnych joboch vracaju 409 namiesto paralelneho enqueue.
- ASGI framework zavislosti su spevnene. FastAPI teraz zacina na
0.136.1a Starlette na1.0.1, cim sa cisti aktualny StarlettePYSEC-2026-161audit finding bez uvolnenia runtime kompatibility.
Release
- Verzia aplikacie je
2026.5.22.post3; Service Worker cache jegitpulse-v92.
[2026-05-22] - Konzistentne scoring exclusion 2026.5.22
Opravene
- Exclude from scoring je zosuladene v team aj project dashboarde. Backend toggle teraz odmieta race s aktivnym sync/run-checks jobom, pouziva row lock, hned prepocita team metrics a invaliduje team, course, project aj student page-cache scope-y.
- Project live-data respektuje scoring exclusion. Excluded clenovia uz nevstupuju do project live-data scoring cohort ani Issues to Address refreshu.
- Member toggle ma jedneho frontend ownera. Team aj project stranky zdielaju rovnaky handler, pri vrateni do scoringu zachovaju inherited/manual/csv kategoriu clena a blokuju konfliktnu akciu pocas sync/import/check runu.
Release
- Verzia aplikacie je
2026.5.22; Service Worker cache jegitpulse-v89.
[2026-05-21] - Release housekeeping 2026.5.21.post26
Zmenené
- Dashboard changelog datumy su normalizovane.
Latest changesuz neobsahuje zaznamy datovane po aktualnom release dni 2026-05-21 a regresny test teraz odmietne future-dated dashboard changelog riadky. - Deploy workspace je cistejsi. Stare ignorovane
deploy-post*.log/redeploy.logsubory a jednorazovy ignorovany SRP split helper skript boli odstranene pred redeployom.
Release
- Verzia aplikacie je
2026.5.21.post26; Service Worker cache jegitpulse-v76.
[2026-05-21] - Sync cache invalidation modul 2026.5.21.post25
Zmenené
- Sync cache invalidacia ma samostatneho vlastnika.
_invalidate_dashboard_cache_after_syncsa presunul z velkehoworkers/sync_job.pyworkera doworkers/sync_cache.py. Full-team aj per-project sync dalej invaliduju project, team, course a student page-cache scope-y, ale worker drzi menej cache plumbing inline. - Release metadata je znovu zosuladene s aktualnym package baseline. Root/docs changelogy a version refs teraz ukazuju na
2026.5.21.post25agitpulse-v75.
Testy
- Sync cache invalidation regresny test teraz mieri na
app.workers.sync_cache.
Release
- Verzia aplikacie je
2026.5.21.post25; Service Worker cache jegitpulse-v75.
[2026-05-21] - Dashboard role-context modul 2026.5.21.post3
Zmenené
- Dashboard role-context helpery maju samostatneho vlastnika. Sidebar badge pocty, greeting subtitle, student dashboard context a admin dashboard context sa presunuli z
dashboard/home.pydodashboard/home_context.py.home.pysa tak sustredi viac na orchestraciu stranky. - Context fast-paths maju pokrytie. Student context vracia defaultny zero-state bez DB pristupu, ked nie su aktivne predmety alebo GitLab username, a student sidebar badges ostavaju bez DB dotazu.
Release
- Verzia aplikacie je
2026.5.21.post3; Service Worker cache jegitpulse-v53.
[2026-05-21] - Dashboard Latest changes split + course health modul 2026.5.21.post2
Zmenené
- Dashboard Latest changes ma samostatneho vlastnika. Rucne udrziavane release zaznamy a vyber lokalizacie sa presunuli z velkeho
dashboard/home.pyroutu dodashboard/home_changelog.py, aby home route riesil orchestraciu stranky namiesto release-note dat. - Course-card health SQL je mimo route. Per-course RED-team health je teraz v
dashboard/home_course_health.py. Helper pri prazdnom active-course vstupe hned vracia prazdny vysledok, bez zbytocnej DB prace pre onboarding a empty states.
Testy
- Pridane regresne pokrytie pre prazdny active-course course-health path a dashboard changelog testy mieria na noveho vlastnika
home_changelog.py.
Release
- Verzia aplikacie je
2026.5.21.post2; Service Worker cache jegitpulse-v52.
[2026-05-21] - Dashboard stats split + 429 asset cache busting 2026.5.21.post1
Zmenené
- Stat-card SQL pre dashboard home ma samostatny modul. Role-specific stat karty sa presunuli z velkeho
dashboard/home.pyroutera dodashboard/home_stats.py. RED-team pocty a priemer compliance zdielaju jeden latest-team-snapshot subquery a student bez aktivnych predmetov dostane nulove karty bez zbytocnych DB dotazov. - Standalone 429 stranka pouziva deploy-hash static URL. Rate-limit middleware nemoze bezpecne zavisiet od Jinja
static_url(), preto jeho browser HTML doplnaBUILD_HASHquery string pre favicon, stylesheet a ilustraciu. - Supply-chain extras su uzsie. Pridany
idna>=3.15, redundantny optional scannersafetyje prec v prospechpip-audit+ CycloneDX a Locust je presunuty do samostatneholoadextra.
Testy
- Pridane regresne testy pre student stat-card path bez aktivnych predmetov a pre deploy-hash
/static/...linky na browser rate-limit stranke.
Release
- Verzia aplikacie je
2026.5.21.post1; Service Worker cache jegitpulse-v51.
[2026-05-19] - Page/static cache hardening 2026.5.19.post25
Opravené
- Page-fragment cache ma bezkolizne variant kluce. Variant casti sa serializuju cez JSON pred BLAKE2b digestom, takze hodnoty ako
("a|b", "c")a("a", "b|c")nemozu skoncit v tom istom cache kluci. Redis namespace je bumpnuty nagp:page:v2, co vynuti bezpecny cold-start starych fragmentov. - Static cache headers su kanonicke.
/static/*odpovede nahradzaju existujuciCache-Controlnamiesto pridavania duplicit,Vary: Accept-Encodingsa merguje s existujucimiVaryhodnotami a jednoročny immutable cache profil sa pouzije len pre validny hex content-hash?v=. - Dashboard home cleanup. Odstranene nepouzite stat-card parametre a stare lokalne premenne v
home.py; support-ticket sidebar badge jasne rata tikety vo viditelnych predmetoch.
Zmenené
- Verzia aplikacie je
2026.5.19.post25; Service Worker cache jegitpulse-v50.
[2026-05-18] - Stabilita global-job-bar + debounce webhook metrik 2026.5.18.post24
Opravené
- Progress bar uz neflikrue po dokonceni syncu. 30-sekundovy
/sync/activewatchdog ajhtmx:loadrekoncilator preskakuju pracu na 3 s pocompleteGlobalJob. Predtym mohol stary/sync/activesnapshot alebo navigacia nakratko zase pridať uz schovany bar. - Stale
Last Syncedpo uspesnom syncu je teraz viditelne v logoch. Zlyhania_invalidate_dashboard_cache_after_syncsu logovane na WARNING (predtym DEBUG) vo full-team-sync aj per-project-sync vetve, takze Redis/SCAN hiccup uz nezostane ticho.
Vykon
- Webhook bursty zlucuju metrics-refresh enqueue na uroven tymu. Burst N eventov od toho isteho tymu v ramci 2 sekund teraz enqueuje iba jeden
metrics_refreshjob namiesto N (RedisSET ... NX EX 2debounce). Job je idempotentny - debounce nestrati ziaden stav. Odstranuje vacsinu Redis chatteru z CI pipelines emitujucich 10+ eventov v rade.
[2026-05-18] - Animovaný empty state + Diff column fix 2026.5.18.post23
Opravené
- Diff stĺpec v MR tabuľke už nezobrazuje "- files". Keď chýbajú
files_changed,lines_addedajlines_removed, bunka zobrazí pomlčku (-). Ak chýba iba počet súborov a sú dostupné ± riadky, ukáže sa iba delta. - Ikony prázdnych stavov na detaile projektu majú rovnakú animáciu ako zvyšok dashboardu. "Issues to Address -> No scored members yet" a "All passing" zdieľajú
emptyStateFloatkeyframy s ostatnými.empty-state-icon, s opt-outomprefers-reduced-motion: reduce.
Zmenené
- Widget Posledné zmeny na hlavnej stránke skrátený na posledných 5 záznamov a jednoodstavcové súhrny; dlhá história je tu a v
docs-site/docs/changelog*.md. - Verzia aplikácie a docs metadata sú
2026.5.18.post23; Service Worker cache jegitpulse-v48.
[2026-05-18] - Cache invalidácia syncu + CSP cleanup 2026.5.18.post22
Opravené
- Dokončené sync joby teraz okamžite invalidujú dashboard fragment cache. Team sync aj per-projektový sync mažú dotknuté cache scope-y pre projekt, tím, kurz/activity/analytics a aktívnych študentov, takže používateľ po dokončení jobu nedostane starý HTML fragment z krátkej TTL cache.
- Zvyšné inline časovače a Course Settings LLM helper sú mimo šablón. 401/429 redirect/countdown logika a LLM resource/prompt helper bežia z externých JS súborov; CSS/minified assets boli pregenerované.
Zmenené
- Verzia aplikácie a docs metadata sú
2026.5.18.post22; Service Worker cache jegitpulse-v47.
[2026-05-18] - Per-projektový Sync v aktivite + seméstrový audit 2026.5.18.post21
Pridané
- Widget Najnovšie udalosti na dashboarde teraz rozlišuje per-projektový sync. Keď učiteľ klikne Sync priamo na konkrétnom projekte (nie na celej skupine, nie cez globálny Sync all), záznam v aktivite sa vykreslí ako "System - Project synced from GitLab", v detaile sa zobrazí názov projektu a odkaz vedie na
/dashboard/projects/{id}namiesto stránky skupiny. Skupinové a globálne syncy zóstavajú bez zmeny.run_checkssa po-prejavuje na všetkých úrovniach, kde sa dá spustiť (skupina + fan-out kurzu).
Opravené
- Seméstrové skópovanie po celom systéme. Viacero agregátnych a contributor dotazov beŽalo cez celú históriu namiesto aktuálneho semestra, čo nafukovalo čísla a nechávalo zastarané health projektov pretrvávať medzi semestrami. Opravené:
course_detail,get_course_sync_statusa SSE builder pre/courses/{id}/sync-streamteraz posielajúcommit_since = semester_floor_utc(course.settings)doteam_contributor_counts()ajtotal_distinct_contributors().- DB fallback
api/projects.py:get_contributorsfiltruje commity podľa seméstrovej hranice kurzu projektu. - V
dashboard/teams.pysa mapovanie študent -> primárny projekt používa rovnaký_commit_window_clauseako zvyšok detailu skupiny (študent, ktorý zmenil skupinu medzi semestrami, sa už nezasekne na projekte z minulého termu). - V
dashboard/courses.pyagregáty pipelines per skupinu (total / passed / failed / latest_status) aj alternatívna cesta cez kurz teraz limitujúsemester_floor_utc, takže úspíšna pipeline z minulého semestra už neprekýva reálny stav.
Odstránené
- Vrátená späť experimentálna karta aktivity na detaile projektu - dashboardový widget Najnovšie udalosti je jediné miesto pravdy, detail projektu ho neduplikuje.
[2026-05-18] - Per-projektový Sync + presné SYNCING odznaky 2026.5.18.post17
Pridané
- Nový endpoint
POST /api/v1/projects/{project_id}/sync. Tlačidlo Sync na detaile projektu už nesynchronizuje celý team (group), ale refreshuje iba dotknutý projekt - issues, MR-y, MR-notes, pipelines, commits (default branch + per-MR source branches). Member sync a project discovery ostávajú team-scoped (kvôli pridávaniu nových projektov v podskupine). Endpoint má vlastný advisory lock naproject_id, dedup voči bežiacim team-syncom a auditný záznamsync_project. - Per-row SYNCING/QUEUED/FAILED odznak v tabuľke projektov tímu.
GET /api/v1/courses/{course_id}/sync-statuspo novom vraciasync_status_by_project, takže detail skupiny presne vyznačí iba riadky tých projektov, ktorých sync skutočne beží - namiesto svietiť všetkým aktívnym riadkom kedykoľvek beží akýkoľvek team-job.
Opravené
- Fantómové "½ groups done" pri jednej bežiacej synchronizácii. Čítač X/Y groups už nezahŕňa project-scoped joby (tie majú vlastný
project_sync_running_count) a používa 3-minútové burst okno na počítanie completed/failed - stará 2-hodinová odlúčka v denominátore bola hlavná príčina misleading "½". - Migrácia
047_bg_job_project_idpridávaBackgroundJob.project_id(FK nagitlab_projectsON DELETE SET NULL) + index - kostra pre per-project sync sledovanie.
Technické
- Service Worker cache:
gitpulse-v46.
[2026-05-18] - Pravdivé sync toasty + SYNCING badge v tabuľkách 2026.5.18.post16
Opravené
- Falošný toast "Sync started!" na detaile projektu. Tlačidlo
Syncpredtým ukazovalo "Sync started!" pri každom kliknutí - aj keď backend vrátilskipped_fresh(dáta sú čerstvé),failed(Redis down) alebo existujúcu prácu vo fronte. Handler teraz vetví podľa skutočnéhostatusv odpovedi a zobrazuje pravdivý toast (info/danger/success). - Fantómové sloty "½ groups" v globálnom job bare po jednorazovom sync z detailu projektu.
completeGlobalJob('sync', ...)sa teraz volá vo všetkých vetvách handlera, takže odložený slot sa vždy uzavrie. - Tlačidlo
Syncsa odomykalo predčasne - pôvodnýfinallyho uvoľnil hneď po POST. Teraz drží stavloadingaž kým SSE stream nevráticomplete/errorpre konkrétnyjob_id.
Pridané
- Dynamický badge
SYNCING/QUEUED/FAILEDv stĺpci Status tabuľkySubgroups and Projectsna detaile skupiny. Keď sa skupina synchronizuje (lokálne klik naSyncalebo paralelne cez course-levelSync All), všetky aktívne projektové riadky zobrazia stav skupinového syncu namiesto pôvodného Active/Template. Po dokončení sa originálne badge automaticky obnovia. Mechanika zrkadlí už existujúci per-row status v tabuľke skupín na detaile kurzu.
[2026-05-18] - Sync na projekte + odstránenie duplicitnej rotácie webhook secret 2026.5.18.post15
Pridané
- Tlačidlo
Syncpriamo na detaile projektu. Predtým bolo synchronizáciu jedného projektu z GitLab-u možné spustiť iba z nadradeného kurzu/skupiny. Lišta nástrojov na/dashboard/projects/<uuid>má teraz vlastné tlačidloSyncvedľaUnlink, gated cezcan_edit and team, ktoré posielaPOST /api/v1/teams/{team_id}/synca zobrazuje priebeh v globálnom job bar rovnako ako sync na úrovni skupiny.
Odstránené
- Tlačidlo
Rotate Webhook Secreta endpointPOST /api/v1/projects/{project_id}/rotate-secret. Per-projektová rotácia webhook secret v UI duplikovala flowSettings -> Webhook Configurations(zavedený migráciou 041) bez akejkoľvek pridanej hodnoty. Tlačidlo, JS handler, FastAPI endpoint, Pydantic schémaProjectSecretRotated, krok tour-u, riadok contract testu aj sekcia v security dokumentácii sú preč.Project.webhook_secret_hashsa stále generuje pri importe a overuje pri doručení webhook-u - len manuálna rotácia bola stiahnutá.
Opravené
- Skrátený tooltip
Unlink. 4-vetový opis pravidiel reaktivácie sa orezával na menších viewportoch; stiahnutý na jednu vetu.
[2026-05-18] - Odstránenie duplicitnej modálky Sync Group Data 2026.5.18.post14
Opravené
- Odstránená duplicitná modálka
Sync Group Data. Pri kliknutí naSync/Sync Allsa otváral celostránkový modal, ktorý zobrazoval presne ten istý progresProject N/15: ... synced (X%)aký už ukazuje perzistentný global job bar na vrchu stránky. Dve kópie tej istej informácie na obrazovke naraz boli zbytočné a rušivé. Teraz progres ukazuje len global bar; modal markup (team/_modals.html) je odstránený a_DEFAULT_LOCAL_SELECTORS.syncvglobal-job-bar.jstiež. - Sync tlačidlo už nepretieka na mobile.
triggerSync/triggerSyncAllpredtým volalisetButtonLoading(btn, true, 'Syncing...')čo nahradilo HTML ikonkového tlačidla doslovným reťazcomSyncing.... Na úzkych viewportoch tento text vyliezal mimo malého ikonkového tlačidla ako/ncing. ArgumentloadingTextzhodený - tlačidlo si zachová pôvodnú ikonu / popis a dostane len triedu.loadingpre spinner stav, rovnako ako všetky ostatné action tlačidlá.
[2026-05-18] - Doladenie profilu študenta a kontrastu loaderov 2026.5.18.post13
Zmenené
- Profil študenta - vizuálny polish. Žlté tlačidlo
Run Checksz post12 už nevisí ako samostatný pruh nad stránkou - presunulo sa do hlavičky kartyStudent Profile/My Profile/Teacher Profilevedľa názvu, takže sedí na povrchu karty namiesto holého pozadia. - Kontribútori projektu - kanonické mená. Widget Contributors na detaile projektu teraz mapuje zhodu git autorov na
Student.full_name(najprv podľa emailu, potom podľa lowercasedgitlab_username). Generické / zdieľané display názvy akostudentsa už nezobrazujú, ak má študent zle nastavený lokálny git config. Pôvodný git názov ostáva v payloade akoraw_namepre audit. - Skeleton loadery - lepší kontrast.
.gl-skeletončíta z vyhradených tokenov--gl-skeleton-bg/--gl-skeleton-shimmer(tokens.css), shimmer overlay z 0.05 na 0.12. Riadky loaderu na detaile projektu / študenta sú viditeľne kontrastné voči pozadiu stránky namiesto takmer neviditeľných.
[2026-05-18] - Run Checks na všetkých 3 úrovniach (kurz/skupina/študent) + pravdivé tooltipy Rotate/Unlink 2026.5.18.post12
- Run Checks teraz existuje na všetkých troch úrovniach hierarchie GitPulse (kurz -> skupina -> študent). Tlačidlo na úrovni skupiny tu bolo už dávno; v tomto release pribudli zvyšné dve.
- Úroveň kurzu. V action bar-e kurzu pribudol žltý button
Run Checks (all groups)vedľaSync All. Volá nový endpointPOST /api/v1/courses/{course_id}/run-checks, ktorý vytvorí samostatnýrun_checksBackgroundJob pre každú aktívnu skupinu v kurze (rovnaké 10-minútové dedup okno ako pri tímovom volaní). Viditeľné pre kohokoľvek scan_editna kurze. - Úroveň študenta. Profil študenta má rovnaký žltý button. Worker je stále team-scoped (GitPulse drží jednu snímku na študenta-v-tíme), takže button volá
/teams/{team_id}/run-checksa snímka študenta sa obnoví automaticky cez existujúce SSE. _run_checks_modal.htmlmá novú vetvu pre Course scope v scope banner-i, takže dynamický kontext prechádza čisto: Course -> Group -> Project -> Student.
- Úroveň kurzu. V action bar-e kurzu pribudol žltý button
- Pravdivý tooltip "Rotate Webhook Secret". Predchádzajúci text nevysvetľoval, odkiaľ secret pochádza. Nový tooltip hovorí, že GitPulse webhook signing secret vygeneroval automaticky pri importe projektu, rotácia má zmysel iba ak mohol secret uniknúť, a starý token ostáva platný 24 h, aby sa nestratili in-flight delivery z GitLabu.
- Pravdivý tooltip a confirm "Unlink from GitLab". Starý text klamal, že projekt sa "znovu prilinkuje pri ďalšom sync-u". V realite
_upsert_projectrešpektuje manuálne mazanie - soft- deactivated projekt ostane neaktívny natrvalo, kým admin explicitne nezavoláPOST /projects/{id}/reactivate. Tooltip aj confirm to teraz hovoria priamo a zdôrazňujú, že všetky dáta (commits, MRs, kontroly, snímky) ostávajú zachované. - Poznámka k rolám.
User.rolemá len tri hodnoty:admin,teacher,student. Systémová rola "mentor" NEEXISTUJE -team_member.is_mentorje iba per-team flag pre seniornejších študentov, ktorí pomáhajú skupine; sú vyňatí z agregátnych metrík ale nemajú zvýšené práva. Všetky Run Checks UIs sa rozhodujú podľacan_edit(course owner / teacher s členstvom v kurze / admin), nie podľaUser.rolepriamo.
[2026-05-18] - Oprava modrého pozadia skeletonov + ikony v modálkach + GitLab import UX 2026.5.18.post11
- Skeleton loadery už nesvietia modrou/červenou farbou notifikácií. Semantické triedy (
.member-api-note,.advisory-banner,.alert) použité vnútri[aria-busy="true"]skeleton stromov presakovali svoje feature pozadia (modré--info-bg, modré--gl-blue-950) cez placeholdery. Defenzívne pravidlo vloaders.cssteraz núti neutrálne--surface-strong+--border-colorpre akýkoľvek semantický banner v skeleton kontexte - aplikované system-wide, aby budúce skeleton makra nikdy nezdedili feature farby. - Ikony v titulkoch modálov sú teraz vertikálne centrované voči textu.
.modal-titlebol obyčajný<h3>, takže predradené ikony sedeli na text baseline. Prepnuté nadisplay: inline-flex; align-items: center- opravuje každý modal v aplikácii (Edit Check, Settings, Import, Rotate, Edit Course, ...). - Tlačidlo "Rotate Secret" na hlavičke projektu je teraz označené ako "Rotate Webhook Secret" s rozšíreným tooltipom, ktorý vysvetľuje, že sa generuje nový GitLab webhook token a predošlý zostáva platný 24 hodín ako grace window. Susedné "Unlink" tlačidlo premenované na "Unlink from GitLab" s tooltipom o automatickom re-linke pri ďalšej synchronizácii.
- Modál Import from GitLab teraz ponúka rovnaký Quick preset dropdown a Semester start/end date pickery ako Create Course. Výber TUKE FEI presetu vyplní akademický rok, semester a obe dátumy jedným klikom; dátumy sú perzistované na nastavenia importovaného kurzu, takže auto-archive a semester windowing fungujú okamžite bez ďalšieho "Edit Settings" kroku.
- Scope banner v Run Compliance Checks modáli teraz podporuje vetvu
student(poradie: student -> project -> team), takže študentom scopovaný Run Checks dialog ukáže meno študenta namiesto nadradeného tímu - príprava pre nadchádzajúce študentom-scopované "Run Checks" tlačidlo v hlavičke.
[2026-05-18] - Skeleton loader DOM parity a feature-flag gating 2026.5.18.post10
- Skeleton loadery každej lazy-loaded stránky (dashboard, course detail/activity/analytics/teachers, project detail, student detail, team detail, admin users, support tickets/detail/form) presne zrkadlia živú DOM štruktúru - rovnaký počet karet, stĺpcov tabuľky, toolbar a pagination - takže swap zo skeletonu na obsah neposúva layout.
- Skeletony rešpektujú runtime podmienky: project detail honoruje dostupnosť rubriky,
feature_docker_verification,feature_ci_failure_generator,feature_conflict_simulator,feature_llm_suggestionsa viditeľnosť GitLab tlačidiel; student detail honoruje dostupnosť rubriky a own-profile gate; analytics honoruje course-staff gate; dashboard honoruje rolu a toggle changelog panela; team detail rešpektuje student-privacy mód; course detail / teachers honorujecan_editacan_see_admins. Loader pre vypnutý komponent sa už nezobrazuje. - Service worker cache
gitpulse-v39. - Lokálny baseline:
2583 passed, 19 deselected.
[2026-05-17] - Quality gate a release metadata hygiene 2026.5.18.post9
src/app/api/dashboard/home.pyje znovu v súlade sruff format; zmena je iba formátovanie bez zmeny správania.- Release metadata, dashboard latest changes, docs-site
versions.jsona lokálne validačné dokumenty boli zosúladené s auditom dňa 2026-05-17. - Opravené budúce dátumy v najnovších changelog záznamoch; aktuálny lokálny baseline testov je
2583 passed, 19 deselected. dead_code_report.py, static artifact guard apip-auditostávajú čisté pre aktuálne nainštalované prostredie.- Service worker cache
gitpulse-v38.
[2026-05-17] - Static cache a CSP hygiena 2026.5.18.post8
- Cache statických assetov teraz rozlišuje content-hash URL od priamych statických ciest:
/static/*?v=<hash>má ročnýimmutablecache, zatiaľ čo neoverzionované/static/*má 5-minútové TTL. - Inline JavaScript z login a error stránok sa presunul do externých statických modulov (
js/pages/login.js,js/error-actions.js). redeploy.pyteraz používa systémové OpenSSH s deploy kľúčom alebo SSH agentom, predvolene odmieta neznáme host kľúče a už nezávisí od Paramiko.- Python/docs dependency floors boli zvýšené podľa aktuálnych
pip-auditadvisories vrátanecryptography,python-multipart,Pillow,Pygments,requestsaurllib3. - Template metadata odkazy používajú
static_url()/absolute_static_url()pre lokálne statické assety všade, kde sa dá vypočítať content hash. - Service worker cache
gitpulse-v37.
[2026-05-17] - Mobilná responzivita skeletonov 2026.5.18.post6
sk_chart(vertikálne pruhy) sa zmenšuje na<768px(96 px min-výška, 20 px pruhy) a<480px(80 px, 14 px); osové ticky sa orezávajú.sk_h_barsdostal<360pxbreakpoint so 56 px štítkovým stĺpcom a 12 px pruhmi; na malých obrazovkách sa skrývajú posledné osové ticky.- Service worker cache
gitpulse-v35.
[2026-05-17] - Mobilný skeleton Week Analytics 2026.5.18.post5
- Skeleton
sk_week_analyticsbol na telefónoch vizuálne príliš vysoký (240 px graf + 140 px doughnut + 3 stĺpce 1.9em). Pridané pravidlá pre<768pxa<480px: graf 240->180->140 px, pruhy 140->64->44 px, doughnut 140->120->96 px, toolbar sa zalamuje, štatistika 1.9em->1.5em. - Service worker cache
gitpulse-v34.
[2026-05-17] - Offline banner namiesto false alarmu 2026.5.18.post4
- Health monitor teraz rozlišuje klient offline (
navigator.onLine === false) od server nedostupný. Offline stav zobrazuje neutrálny sivý banner s ikonouwifi-offa textom "Ste offline. Niektoré funkcie nemusia byť dostupné, kým sa pripojenie neobnoví." namiesto zavádzajúceho červeného "Systém je momentálne nedostupný". _performChecksa preruší keď je klient offline (žiadne fetch volania, žiadna eskalácia nadown).window 'online'listener vyčistí dismissed flag, skryje offline banner a spustí okamžitú re-kontrolu + toast "Pripojenie obnovené".- Pridaná ikona
wifi-offdo JS registra ikon (GP.icons.get('wifi-off')). - Service worker cache
gitpulse-v33.
[2026-05-17] - Pixel-paritá skeleton parity 2026.5.18.post2
sk_h_bars(Teačerov checklist) má teraz 170 px široký štítkový stĺpec, 18 px stolčeky a spodnú os 0-100 % - zhoduje sa s reálnym horizontálnym grafom.- Pláceďovák pre "Compliance by Category" používa
sk_h_bars(count=4)(reálny graf je tiež horizontálny). sk_chartprerobý nagl-skeleton-chart-wrapso shimmer pruhmi (predtým sú neviditeľné na tmavom povrchu) a tickami osi naspodku.- Service worker cache
gitpulse-v31.
[2026-05-17] - Page-specific skeleton parity 2026.5.18.post1
Zmenené
- Skeleton loadery teraz lepšie zodpovedajú reálnej štruktúre stránok:
- Nové makro
sk_h_barsvykresľuje horizontálne pruhy ako placeholder pre Teacher's Checklist (13 riadkov R01-R13 s rôznou výplňou). - Nové makro
sk_legendvykresľuje legendu kategórií grafu nad Teacher's Checklist. - Nové makro
sk_week_pillsvykresľuje pilulky týždenného navigátora.
- Nové makro
- Doughnut skeleton zdravia pipeline na stránke Aktivity teraz používa radiálny gradient (číta sa ako doughnut graf, nie ako plný disk).
- Odstránený osirelý
to { opacity: 1; }blok ponechaný vloaders.csspo predchádzajúcej čistke progressive-reveal mechanizmu. - Service worker cache verzia bumpnutá na
gitpulse-v30.
[2026-05-17] - Skeleton legacy cleanup 2026.5.18
Zmenené
- Skeleton loadery sú prepísané na čistý GitLab Pajamas shimmer bez progressive reveal scaffoldingu. Všetky skeleton primitives (texty, stats, karty, tabuľky, taby, grafy, zoznamy, activity feedy, formuláre) sa renderujú naraz s jednotnou Pajamas shimmer animáciou.
- Odstránené legacy markery a mŕtve kontrolery: triedy
gl-skeleton-progressive,gl-skeleton-deferred,gl-skeleton-row--deferred; atribútydata-skeleton-progressive,data-skeleton-table,data-skeleton-total-items,data-skeleton-initial-items,data-skeleton-total-rows,data-skeleton-initial-rows,data-skeleton-delay; kwargyinitial,initial_lines,initial_rows,initial_bars,deferredv skeleton makrách; JS funkcia_initProgressiveSkeletonsa jejGP.initProgressiveSkeletons/GP.initProgressiveSkeletonTablesexporty; pravidlo@keyframes glSkeletonItemReveala reduced-motion selektor.gl-skeleton-table.is-progressive-expanded .gl-skeleton-row--deferred. - Service-worker cache verzia je teraz
gitpulse-v29a bundle/min súbory boli prebuildnuté.
[2026-05-17] - System-wide progressive skeleton reveal 2026.5.17.post4
Zmenené
- GitLab/Pajamas-style progressive skeleton reveal teraz platí pre zdieľané skeleton primitives, nielen pre tabuľky: textové bloky, stats gridy, karty, taby, grafy, zoznamy, activity feedy, key-value riadky a formuláre zobrazia ľahký prvý batch a rozšíria sa iba keď lazy load zostane viditeľný.
- Dashboard home stats a course cards používajú rovnaký progressive reveal contract, takže primárne placeholders sa ukážu prvé a sekundárne doplnia štruktúru bez prázdnych medzier.
- Support ticket a support form skeletony už nemiešajú spinner do rovnakého content regiónu. Odpovede a follow-up polia majú štruktúrne placeholders; spinnery ostávajú pre action/background stavy.
- Asynchrónne tabuľky v Course Settings teraz používajú progressive table skeletony pre webhook konfigurácie a compliance checks namiesto centrovaných spinner blokov.
- Nepoužívaný
sk_content_spinnermacro a jeho CSS boli odstránené, takže loader primitives už neponúkajú zastaranú cestu pre page-content spinner. - Aplikačná aj dokumentačná metadata teraz používajú
2026.5.17.post4. - Service-worker cache verzia je teraz
gitpulse-v28.
[2026-05-17] - Progressive skeleton table loading 2026.5.17.post3
Zmenené
- Zdieľané dashboard table skeletony teraz používajú postupné načítanie: najprv sa zobrazia tri riadky a až pri pomalšom lazy requeste sa otvorí page-specific počet riadkov.
- Dokumentácia quality gates dopĺňa frontend loading contract: skeleton pre sekcie, ktoré sa postupne naplnia obsahom, spinner pre akcie a background prácu, bez miešania skeletonu a spinneru pre rovnaký región.
- Scale load-test konzolový status používa ASCII
[PASS]/[FAIL]značky, aby kontroly neboli závislé od Unicode podpory vo Windows termináli. - Aplikačná aj dokumentačná metadata teraz používajú
2026.5.17.post3. - Service-worker cache verzia je teraz
gitpulse-v27.
[2026-05-17] - Avatar loading a health version display 2026.5.17.post2
Opravené
- Avatary na dashboarde a v topbare sa teraz načítavajú eager s vysokou prioritou a používajú neutrálny image background. Pomalá odpoveď GitLab avatar URL už počas vstupu na stránku neukáže fialový initials fallback.
- Health karta v Admin System zobrazuje runtime verziu presne tak, ako ju vracia
/health(2026.5.17.post2), bez pridania prefixuv. Formav...je vyhradená pre názvy git tagov. - Service-worker cache verzia je teraz
gitpulse-v26.
[2026-05-17] - CSP inline cleanup a release metadata 2026.5.17.post1
Zmenené
- Aplikačná aj dokumentačná metadata teraz používajú
2026.5.17.post1. Existujúci tagv2026.5.17zostáva nezmenený, preto tento release používa.post1namiesto prepisovania histórie tagov. - Dashboard shell už nevkladá inline script pre registráciu service workera. Registráciu rieši zdieľaný bundle
core.js. - Warning toasty na stránke Admin Events sú riadené cez JSON
gp-page-configa renderuje ichadmin-events.js; stránka už negeneruje state-specific inline scripty. - DLQ loading spinner používa zdieľanú CSS utilitu
.gl-spinner-inlinenamiesto inline style atribútu. - Service-worker cache verzia je teraz
gitpulse-v25.
Overené
- Konzervatívny dead-code scan nenašiel bezpečných kandidátov na odstránenie.
- Typography cleanup scan nenašiel žiadne project-owned súbory na zmenu.
[2026-05-16] - Semester scope a docs hygiene 2026.5.16.post2
Pridané
- Formulár nastavení kurzu zobrazuje viditeľnú info-poznámku "Kaskáda rozsahu", ktorá vždy upozorňuje, že zmena semestrálneho okna prepočíta rozsah pre všetky dashboardy, synchronizácie, hodnotenie zhody a reporty.
- Pred uložením zmeny semestrálnych dátumov sa zobrazí potvrdzovací dialóg s presným zoznamom dôsledkov (čo bude skryté, čo bude opäť pridané).
- Prázdne stavy v profile študenta uvádzajú aktuálne semestrálne okno ("Showing current semester window: ..."), aby bolo jasné, prečo neexistujú žiadne komity / MR / issues.
- Skript na čistenie typografie teraz pokrýva JSON, web manifesty, extensionless deployment súbory a voliteľne i18n katalógy; normalizuje smart punctuation, dekoratívne šípky a box-drawing oddeľovače v komentároch.
Zmenené
- Aplikačná aj dokumentačná metadata používajú
2026.5.16.post2. Omylom future-dated metadata boli opravené, pretože dátum releasu je 16. máj 2026. - Sweep, enrichment a LLM joby (
enrich_issue,enrich_mr,llm_job,_enrich_all_async) explicitne filtrujú entity vytvorené predcourse.settings.semester_start_date. Staršie komity, MR, issues a pipeliny zostávajú uložené, ale nie sú znovu spracované ani započítané do current-semester metrík. - Dashboardy admina, hlavnej stránky, kurzov a tímov používajú spoločnú helper-funkciu
semester_floor_utc, takže read-path a worker-path zdieľajú presne tú istú dolnú hranicu. - Spodná hranica pre HTML5 validáciu dátumov sa automaticky posúva každý rok (
semester_date_min= January 1 oftoday.year - 2) namiesto fixného2020-01-01- tým sa zabraňuje vstupu zastaraných dátumov, ktoré by "spôsobili nulový rozsah" a tichú stratu komitov. - Reporty a exporty používajú zdieľaný mobile-safe blob download helper.
- Service-worker cache verzia je teraz
gitpulse-v24.
Opravené
- Generovanie reportov zachováva full name učiteľov, počíta distinct student improvements, uvádza compliance delta ako percentuálne body a spoľahlivo sťahuje PDF aj v mobilných prehliadačoch.
- Vrchný progress bar sa už nespúšťa skôr, než AJAX form handlery stihnú zastaviť native submit, takže report formuláre nemajú falošný progress flash.
[2026-05-16] - Health version follow-up 2026.5.16.post1
Opravené
- Aplikačná verzia je teraz
2026.5.16.post1. - Runtime kontajnery teraz čítajú
project.versionzpyproject.toml, keď nie je dostupná installed package metadata, takže/healtha metrics už po source-checkout deploymente nehlásiaversion="unknown".
[2026-05-16] - Course-scoped dashboard release 2026.5.16
Zmenené
- Aplikačná verzia je teraz
2026.5.16. - Aktivita v detaile študenta je pri nastavenom začiatku semestra obmedzená na aktívne časové okno kurzu. Importovaná história repozitára zo starších akademických rokov sa skryje z tabuliek commitov a riadkových súčtov namiesto toho, aby nafukovala aktuálny kurz.
- Weekly compliance výpočet aj historický backfill ignorujú issues, merge requesty, review aktivitu, pipelines a commity pred začiatkom semestra.
- Tabuľky členov už neduplikujú globálne GitLab access role vedľa mena člena, keď ich už zobrazuje samostatný stĺpec Role.
Opravené
- Staré commity z rokov 2021/2022 už nemôžu v kurze 2026 vytvárať zavádzajúcu commit quality ani contribution totals.
- Dashboard latest-changes feed už neobsahuje future-dated záznam.
[2026-05-15] - Declarative client actions release 2026.5.15.post2
Zmenené
- Aplikačná verzia je teraz
2026.5.15.post2. - Reload ovládacie prvky generované JavaScriptom teraz používajú spoločný kontrakt
data-action="reload-keep-scroll"namiesto inlineonclickhandlerov. - Read-only hint v detaile support ticketu používa CSS triedu na spacing namiesto inline štýlu v template.
- Service-worker cache namespace zvýšený
gitpulse-v6->gitpulse-v7a generované bundle sú obnovené.
Opravené
- Offline fallback page už neemituje inline click handler; retry používa obyčajný GET formulár.
- Pridané statické frontend testy, ktoré chránia source JS a service worker pred návratom inline
onclick=handlerov.
[2026-05-15] - Login alert polish release 2026.5.15.post1
Zmenené
- Aplikačná verzia je teraz
2026.5.15.post1. - Chyby autentifikácie na login stránke používajú reusable GitLab-style alert: tmavý surface, červený horný border, alert ikonu, dismiss akciu a žiadne inline štýly.
- Client-side login failures používajú rovnaký alert DOM/CSS kontrakt ako server-rendered chyby.
- Service-worker cache namespace zvýšený
gitpulse-v5->gitpulse-v6a generated bundles sú obnovené.
Opravené
- Odstránený starý login-specific error block a neplatný red fallback v login stylesheet.
- Pridané statické testy pre login alert component contract.
[2026-05-15] - Version baseline a obnovenie cache
Zmenené
- Aplikačná verzia je teraz CalVer
2026.5.15. - Dôvod: repozitár začal ako full-codebase initial commit a pre-release audit pred týmto normalizačným commitom našiel
1875commitov, 47 Alembic migračných súborov a žiadne historické release tagy. Spätne zrekonštruovaný SemVer by bol arbitrárny; CalVer čestne zapisuje dátum produkčného releasu. - Service-worker cache namespace zvýšený
gitpulse-v4->gitpulse-v5. - Documentation status, deployment príklady a dashboard latest changes sú obnovené pre release 2026-05-15.
Opravené
dead-code-report.txtje ignorovaný ako generovaný lokálny/CI artefakt.- Overené, že aktuálne static/dead-code guard skripty sú shell-independent a nespoliehajú sa na
git ls-files.
[2026-05-14] - Production-safe cleanup release 0.1.1
Zmenené
- Stabilizované lokálne a CI gate-y: normalizácia test env, shell-independent pre-push unit runner, Ruff pin na
0.15.4, bundle drift check, static artifact guard a non-blocking dead-code report. - Dashboard scheduler registry teraz zodpovedá produkčnému scheduleru: 26 registrovaných jobov vrátane email log retention, cleanup expirovaných previous webhook secretov, team discovery a semester auto-archive.
- OpenAPI hygiena:
/dashboard/loginGET má stabilný operation id a HEAD je skrytý zo schémy, aby nevznikali duplicate operation IDs. - Test suite je warning-clean v default lokálnom gate:
2583 passed, 19 deselected.
Opravené
- Odstránený náhodne trackovaný root artefakt
-w. - Bundle/vendor skripty používajú ASCII status markery, takže Windows cp1252 terminály nepadajú.
- Previous webhook secret sa akceptuje len do
webhook_secret_previous_expires_at, potom ho čistí scheduler. - legacy roster upload validuje všetky riadky pred zápisom, takže nevzniká partial commit.
- Retired grading save odmieta nulový súčet category weights.
- Redis session-store fallback inkrementuje
session_store_fallback_totala readiness robí probe iba keď je store zapnutý.
[2026-05-14 - root-cause patch] - Opätovné prihlasovanie na každej návšteve opravené
Príčina
Defaulty v app/config.py boli správne (persistent_sessions=True, 30 dní idle, 90 dní absolútne), ale docker-compose.yml riadky 11-12 hardkódovali zlé defaulty:
| YAML | |
|---|---|
Produkcia mala v .env.production PERSISTENT_SESSIONS=true, avšak SESSION_MAX_AGE_SECONDS=28800 (8 h) znamenalo, že idle okno podpísanej cookie vypršalo po 8 hodinách - kto sa vrátil raz za deň, musel prejsť celým GitLab OAuth flow.
Opravené
docker-compose.ymldefaulty prepnuté:PERSISTENT_SESSIONS:-true,SESSION_MAX_AGE_SECONDS:-2592000(30 dní) a novýSESSION_ABSOLUTE_MAX_AGE_SECONDS:-7776000(90 dní).redeploy.pyinjektuje všetky tri hodnoty do.env.productionpri každom deploye (idempotentnýsed/echovzor ako priGIT_SHA). Auditovateľné, odolné voči driftu..envaj.env.productionaktualizované na nové 30 d / 90 d hodnoty ako baseline pre ďalší deploy.
Odstránené (dead code)
session_auth.verify_password()asession_auth.hash_password()- produkcia beží výhradne cez GitLab OAuth; tieto pomocné funkcie nemali žiadneho volajúceho mimo import smoke testu. Odstránené spolu s už nevyužívanýmbcryptimportom vsession_auth.py(samotnýbcryptpackage zostáva vpyproject.toml, využíva ho webhook autentifikácia).- Príslušné riadky v
tests/unit/test_module_imports.pyodstránené.
Overené ako používané (ponechané, NIE dead code)
Audit potvrdil, že gitlab_oauth.refresh_access_token() JE používaná - volaná z dependencies.get_fresh_gitlab_token() (riadok 626) s 5-minútovou rezervou pred expiráciou tokenu. Tichý OAuth refresh pri telemetry/sync volaniach už funguje.
[2026-05-14] - Trvalé relácie a celosystémová multi-tab synchronizácia
Zmenené (autentifikácia)
persistent_sessionsprepnuté naTrue(default) - relácie prežijú reštart servera aj redeploy. Používateľ sa už nemusí opätovne prihlasovať pri každom nasadení nového buildu.- Idle TTL 8 h -> 30 dní, absolútna TTL 24 h -> 90 dní (
session_max_age_seconds,session_absolute_max_age_secondsvapp/config.py). Obranné mechanizmy ostávajú: podpísaná cookie + Redis opaque sid + Secure/HttpOnly/SameSite=Lax/__Host-prefix + UA fingerprint (voliteľný) + explicitné zneplatnenie pri logoute.
Pridané (multi-tab synchronizácia - celosystémovo)
- Locale (
gp_lang) -locale-sync.jspočúvastorageevent a po zmene jazyka v ktorejkoľvek karte aktualizuje cookie a reloadne ostatné karty. - Kolaps sidebaru - desktopové zbalenie/rozbalenie sa zrkadlí v reálnom čase medzi všetkými otvorenými kartami cez
sidebar-collapsedvlocalStorage+ novýstoragelistener. - Banner pre cookies -
BroadcastChannel('gp_cookie_consent_sync')skryje banner vo všetkých sesterských kartách v okamihu, keď ho ktorákoľvek karta akceptuje;dismiss()je teraz idempotentný a po dokončení animácie sa odstránicookie-banner-hidingtrieda.
Overené (už synchronizované, bezo zmeny)
- Dokončenie tour (
tour-engine.js), globálny job bar (global-job-bar.js), cross-toast broadcast (core.js), dismiss PWA install karty (pwa-install.js).
[2026-05-13 - round 3] - PWA install card: multi-tab sync, prevencia konfliktov, životný cyklus
Pridané
- Cross-tab synchronizácia -
BroadcastChannel('gp_pwa_install')plus záloha cezlocalStoragestorageevent. Dismiss alebo inštalácia v jednej karte sa okamžite prepáli do všetkých ostatných. - Prevencia konfliktov -
_conflictPresent()odloží zobrazenie karty, kým je viditeľný#cookieConsent,.gp-tour-welcome,.driver-active/.driver-popover,.modal.show/.gl-modal-overlayalebo.gp-app-loader.is-visible. 800 ms re-poll loop kartu znova ukáže hneď, ako prekážajúci element zmizne. - Page-synced životný cyklus -
visibilitychangezastaví plánovanie pri skrytej karte a po návrate ho obnoví (žiadna animácia na nečinnej karte). - Event-hooky - počúva
gp:cookie-consent,gp:tour:welcome:dismissed,gp:modal:closea okamžite skúsi zobraziť.tour-engine.dismissWelcomeCard()teraz dispatchujegp:tour:welcome:dismissedpo skončení 320 ms exit animácie. - UX detaily - Escape zatvára bez perzistencie;
BroadcastChannelsa čisto zatvára pripagehide.
Zmenené (PWA copy)
- Popis karty už neklame o "offline support" (dashboard vyžaduje autentifikáciu a DB, offline fungovať nemôže). Nový text: "Install this app on your device for a faster, full-screen experience with quick access from your home screen."
[2026-05-13 - round 2] - Modernizácia JS a oprava chýb v PWA prompte
Zmenené
pwa-install.jsprepísané do moderného ES6+:const/let, arrow funkcie,async/await, optional chaining, nullish coalescing.core.jsAlpine$mdShowPreviewmagic - 6vardeklarácií (stack, i, node, refEl, rendered, rm) nahradenýchconst/let.
Opravené
- Race condition v hide-timeri:
_hide()setTimeoutsa nedal zrušiť pri opätovnom zobrazení. Pridaný_hideTimerreferenčný cyklus na úrovni modulu. - Deprecated
userChoiceAPI:_triggerInstallprepísaný cezresult?.outcome ?? (await prompt.userChoice?.catch(()=>null))?.outcome- podporuje moderné (Chrome 97+) aj staršie dvojkrokové API. clearTimeout(t)vo vnútri fired callbacku: presunuté pred plánovanie, aby sa timer skutočne dal zrušiť.
[2026-05-13] - PWA install prompt (štýl GitLab Pajamas)
Pridané
- Vlastná PWA install karta (
pwa-install.js+pwa-install.css) - zachytíbeforeinstallprompta vykreslí elegantnú kartu v pravom dolnom rohu s ikonou, titulkom, popisom, akciami Install a Not now a tlačidlom×. - 90-dňová pamäť dismissu (
gp_pwa_install_dismissed_untilvlocalStorage). - Rešpektuje reduced-motion (
prefers-reduced-motion: reducezníži tranzíciu na čistý fade). - Mobil - prilepené k spodku viewportu, šírka cez celú obrazovku.
- Public API -
window.GP.installApp.{ show, dismiss, isAvailable }. - i18n háčiky -
pwa.install.title,pwa.install.desc,pwa.install.cta,pwa.install.cancel,pwa.install.close(s fallback reťazcami).
[2026-05-12] - Deduplikácia toastov a zoradenie z-index ladderu
Opravené
- Duplicitné sync-completion toasty - pri dokončení sync jobu sa toast občas publikoval dvakrát (jedenkrát z SSE eventu, druhý raz z terminal pollu). Pridaný
sessionStoragekľúčgp_job_completion_dedup_v1na potlačenie duplicít v rámci session; auto-poll je preskočený pre terminálne joby. - Z-index konflikty - toast container sa občas renderoval pod app loaderom / cookie bannerom. Token ladder je teraz:
--z-cookie-banner: 1040,--z-tour-welcome: 1045,--z-app-loader: 1050, PWA install karta hardkódovaná na 1055,--z-toast: 1060.
[2026-05-11] - Oprava dismissu sprievodcu a responzívnosť na mobile
Opravené
- Sprievodca - dismiss pri kliknutí do sidebaru na deskope/tablete: na desktopoch a tabletoch je sidebar permanentná súčasť layoutu - kliknutie na navigačný odkaz, prepínač jazyka alebo tlačidlo Collapse už welcome card ani aktívne turné nerušia. Guard pridaný do click listenera:
if (!_isMobile() && t.closest('#appSidebar, .gl-sidebar')) return;. - Sprievodca - príliš broad
summaryselektor: click handler používal holý selektorsummary, ktorý zachytil každý<summary>element na stránke vrátane collapsible sekcií (napr.code-referencepanely v nastaveniach kurzu). Selektor zúžený nadetails.gp-menu, details.dropdown, details.user-menu-.closest()sa cez DOM strom sám dostane k<summary>deťom, takže žiadna funkčnosť nevypadla. - Tour popover - Android 3-tlačidlový nav bar skrýval footer: pri aktívnom
viewport-fit=coversa viewport roztiahne za systémový panel, aleenv(safe-area-inset-bottom)môže byť na Android 3-button nav nulové. Dvojfázová oprava: transform bottom-sheetu odrátavaenv(safe-area-inset-bottom, 0px); prehliadače s podporoudvhdostanú@supports (height: 100dvh)blok s100dvh, ktorý vylúči systémový panel spoľahlivo. Rovnaká logika platí pre tablet portrait a landscape breakpointy. - Tour popover footer - minimálna dotyková plocha:
padding-bottom: max(env(safe-area-inset-bottom, 0px), 12px)garantuje aspoň 12 px nad systémovým panelom aj tam, kdeenv()vracia 0. Pridanémin-height: 44px(WCAG 2.5.5). - Welcome card - poloha nad systémovým panelom:
bottom: calc(0.75rem + env(safe-area-inset-bottom, 0px))posúva kartu nahor o výšku systémového panela. - Tour popover - max-height dvh:
max-height: 70dvh(s fallbackom70vh) používa dynamickú jednotku, ktorá vylučuje adresný riadok prehliadača aj systémovú lištu.
[2026-05-10 - round 3] - Attribution chips: kto skutočne robil prácu na MR a Issues
Pridané
- Attribution chips v tabuľke MR (detail študenta): keď MR neobsahuje žiadne commity od zobrazeného študenta, zobrazí sa oranžový badge "Žiadne commity študenta" a mená skutočných autorov (modrý = učiteľ, sivý = spolužiak). Ak študent commitoval spolu s inými, zobrazí sa riadok "Tiež od:" s menami.
- Stĺpec "Assigned to" v tabuľke Authored Issues: kto má issue pridelenú - modrý badge pre učiteľa, sivý pre spolužiaka, pomlčka ak nikto.
- Stĺpec "Opened by" v tabuľke Assigned Issues: kto issue otvoril - rovnaká farebná logika.
- Preklady (
sk.json): 6 nových kľúčov -Also by:,No student commits, tooltip pre "Žiadne commity študenta",Opened by,Assigned to,Peer student.
Implementácia
src/app/api/dashboard/students.py: batch SQL query ceztuple_(Commit.project_id, Commit.ref).in_(branch_pairs)- žiadne N+1;teacher_ids(UUID set) +teacher_gitlab_ids(int set) pre správnu detekciu učiteľov aj bezauthor_id;aliased(StudentModel)/aliased(TeamMember)pre dva outerjoin na Issues.src/app/templates/partials/student/_merge_requests.html: attribution row sekcia s podmienkaminot _student_commits/_other_commits.src/app/templates/partials/student/_detail_content.html: nové stĺpce "Assigned to" a "Opened by".
[2026-05-10 - round 2] - Badge "Vetva zmazaná" a synchronizácia commitov cez MR API
Pridané
- Badge "Vetva zmazaná" v tabuľke MR (detail študenta): keď bola zdrojová vetva MR zmazaná po zlúčení (GitLab
force_remove_source_branchalebo ručné zmazanie), na príslušnom riadku sa zobrazí sivý badge s tooltipom. Vyžaduje nový DB stĺpecmerge_requests.source_branch_deleted(migrácia044). - Primárna detekcia zmazania vetvy (
mr_processor.py): GitLab posielaforce_remove_source_branch=truev REST aj webhook payloade - hodnota sa ukladá do stĺpca pri každom spracovaní MR. - Sekundárna detekcia (
sync_job.py): sync-job sleduje počty commitov per-vetva; ak MR fallback loop obnoví > 0 commitov, ale branch-ref vrátil 0 a MR jemerged, systém automaticky nastavísource_branch_deleted = True- zachytí aj manuálne zmazania bez GitLab príznaku. - Obnovenie commitov cez MR API (
sync_job.py): po slučke branch-ref nasleduje fallback slučka, ktorá pre každý MR zavoláGET /projects/:id/merge_requests/:iid/commits- tento endpoint funguje aj po zmazaní zdrojovej vetvy. - Fallback priradenia commitov podľa mena autora (
students.py): dotaz pre commity na stránke detailu študenta pridáva klauzuluauthor_name = student.full_name- zachytí prípady, keď sa email nezhodoval, ale git display name áno. - Preklady (
sk.json):"Branch Deleted": "Vetva zmazaná"+ slovenský preklad tooltip textu.
Opravené
- CI - mypy (
students.py): holá anotácia: listna_commit_clausesspôsobovala chybutype-argv strict móde -> odstránená. - CI - ruff-format (
students.py): viacriadkové.append(func.lower(...))volania zmestia na jeden riadok -> jednoradková forma.
[2026-05-10] - Oprava priradenia commitov (email fallback, noreply prefix)
Opravené
- Fallback priradenia commitov podľa emailu (
students.py): dotaz na commity na stránke detailu študenta obsahuje klauzuluauthor_email = student.email- commity bezauthor_idsa zobrazia, ak email sedí. - Odstraňovanie prefixu
<čísla>+z GitLab noreply emailov (commit_processor.py): GitLab generuje noreply emaily vo formáte123456+username@users.noreply.gitlab.com; prefix sa pred porovnaním orezal - sync správne zaradí commity k správnemu študentovi.
[2026-05-09 - round 2] - Druhý sprint na sprievodcu, DLQ a tabuľky
Opravené
- Sprievodca v2 (
gp_tour_v1->gp_tour_v2storage prefix): jednorazový čistý reset zastaralých:completedkľúčov, ktoré pod v1 vznikali pri každom dokončení turné a navždy potlačili welcome card na všetkých etapách multistage stránky/dashboard/support(course_id->category-> formulár). Pod v2 sa bare kľúč zapisuje iba pri explicitnom zavretí welcome card (× alebo "Maybe later") - dokončenie konkrétnej etapy si pamätáme len pod fingerprintovým kľúčom, takže ďalšia etapa stránky znova ponúkne sprievodcu. - Sprievodca - synchronizácia medzi tabmi: nový
storageevent listener počúva zápisy dogp_tour_v2:v iných tabách. Akonáhle používateľ dokončí alebo zatvorí sprievodcu v jednom tabe, ostatné taby okamžite skryjú welcome card a (ak práve beží) zatvoria aj aktívny Driver.js overlay. Kým predtým sa dva taby pretekali o to, ktorý prepíše localStorage neskôr. - Admin / Event Pipeline - DLQ loader: krúžiaci spinner v prázdnej tabuľke DLQ Events bol vizuálne statický. SVG
transform-origindefaultne býva0 0, takže ikona sa "točila" okolo svojho ľavého horného rohu a v 20×20 px bunke vyzerala zamrznutá. Pridanýtransform-origin: 50% 50%; transform-box: fill-box;na.spinrotuje ikonu okolo jej skutočného stredu - naprieč všetkými stránkami, ktoré túto utility class používajú. - Admin / Users + DLQ tabuľky - orezávanie textu:
Role(badge "Student") aStatus(badge "Active") boli orezané na trojbodku alebo zalomené uprostred slova, lebotd { overflow: hidden; text-overflow: ellipsis }platilo na celú tabuľku vrátane buniek s pill badgemi. Truncation teraz cieli iba textové stĺpce (Username,GitLab ID,Full name,Email,Created);Role/Status/Actionsmajúwhite-space: nowrap; overflow: visible, takže sa zmestia kompletne. Upravené šírky stĺpcov:Actions8 % -> 12 %,Email22 % -> 18 %. - Admin / Users + DLQ tabuľky - responzívnosť: pod 900 px (Users) a 1024 px (DLQ) tabuľky prepínajú na
table-layout: autosmin-widthv reálnych pixeloch, takže sa skryjú za horizontálny scroll svojho.table-responsivewrappera namiesto skreslenia hlavičiek typu "GitLab User I..." alebo orezania pravostranných tlačidiel.
[2026-05-09] - Oprava OAuth slučky a UI ladenia
Opravené
- OAuth prihlasovanie: koniec nekonečnej slučky "Session expired" po návrate z GitLabu. Callback teraz robí explicitný HTTP 303 See Other s
Cache-Control: no-store, predĺžili smeSTATE_TTLz 600 s na 900 s a opravili sme atribúty cookiegp_returning, takže prehliadač spoľahlivo prenesie session-id na cieľovú stránku. select_fieldformulár: koniec doslovného textuu2014v dropdown poliach. Filtertojson_attrteraz serializuje JSON sensure_ascii=False, takže em-dash (-) ide do HTML atribútu ako natívny UTF-8 znak a nestráca sa cestou backslash escape.- Sprievodca - popover na mobile: zmiernené pravidlo auto-prepnutia na vrchný panel. Predtým striktné podmienky (≥ 40 % prekrytia zdola a ≤ 10 % zhora) blokovali legitímne preklopenia pre polia v dolnej polovici obrazovky (napr. "Priorita" v
/dashboard/support), takže popover fyzicky zakrýval pole, na ktoré ukazoval. - Sprievodca - viacstupňové stránky: každá etapa
/dashboard/support(výber kurzu -> kategória -> formulár) má teraz vlastný welcome card. Predtým dokončenie jednej etapy zapísalo aj "globálny":completedkľúč, čím navždy potlačilo welcome card na ostatných etapách. Globálny kľúč sa teraz zapisuje len pri explicitnom zavretí (× alebo "Maybe later").
[2026-05-07] - Sprievodca a UI vylepšenia
Pridané
- Sprievodca používateľa (Tour): nová časť o "Servisných účtoch" v administrácii (
admin_userstour), ktorá vysvetľuje botov a analytickú kartu.
Opravené
- Nastavenia kurzu: fix renderovania Unicode znakov (Em-dash vizuálny glitch ako
\u2014) nahradením spojovníkom v "Select a preset" poliach. - Sprievodca (Tour engine): oprava logiky pre cache (lokálne verzus re-prompt po refreshi, kedy sa nesprávne ukladalo
skipped). Po skutočnom dokončení turné sa označí akocompleteda zbytočne sa neopakuje. - Zamedzenie layout shiftov: nasadenie spinnerov pre nastavenia kurzu miesto ťažkých skeleton tabuliek pri načítavaní kontrol s HTMX.
[2026-05-06] - Servisné účty (boti) ako prvotriedna entita
Pridané
- Stĺpec
users.is_bot+ parciálny index (Alembic042_user_is_bot): nováBOOLEAN NOT NULL DEFAULT FALSEnauserstabuľke s parciálnym indexomix_users_is_bot_false WHERE is_bot=false. Migrácia urobí backfill cez vzory zhodné sis_bot_user()(project_*,group_*,*_bot,*-bot,ghost,alert-bot,support-bot). Predošlé runtime-regex filtrovanie sa nahradilo jediným indexovaným predikátomhumans_only_clause(). - Nastavenie
is_botpri každom vytvorení používateľa: 9 miest, kde aplikácia vytváraUser/UserModelriadok (group import, OAuth first login, dev-mode auto-create, admin manuál sync, student create, projects/teams auto-create z inherited members) teraz voláis_bot_user(username, user_type=...)a ukladá výsledok do stĺpca. Servisné účty sú tým označené raz pri vstupe, nie sa heuristicky filtrujú pri každom dotaze. - Stat karta "Service Accounts" na admin System Settings + samostatné
botsčíslo v/dashboard/api/v1/admin/system/stats. User Role Breakdown (chart) teraz počíta iba ľudí - botov treba čítať z dedikovanej karty, nemiešajú sa s rolami. - Service Accounts collapsible panel pod hlavnou tabuľkou User Management. Botov sa nedá editovať/deaktivovať z UI; ostáva len
Infotlačidlo, ktoré otvára rovnaký User Info modal sService Accountbadge vedľa rolovej značky a tooltipom "GitLab service account / bot - not a human user". Skeleton (sk_admin_users) zarovnaný s reálnym layoutom: 4 filter pily (All/Admin/Teacher/Student) + náznak servisného panelu pod tabuľkou. - Vylúčenie botov z agregovaných počtov:
dashboard_stats/home._build_stat_cards(Active Users / Students),member_sync_service.get_teachers_for_course(učiteľský whitelist),users.update_userlast-admin guard, support assignee dropdown - všetky teraz ignorujúis_bot=true.
Opravené
- Predošlý regex-based filter
not_bot_user_clause()bol band-aid: tá istá logika sa duplikovala v Pythone (is_bot_user) aj v SQL (ilike-OR strom). Existuje stále ako alias, ale nový kód má používaťhumans_only_clause()/bots_only_clause()zapp.services.user_filters. sk_admin_usersskeleton mal len 3 filter pily namiesto 4 - pri lazy load sa layout vizuálne posúval, keď doľahla skutočná hlavička.
Zmenené
- Preklady (
sk.json): pridanéService Account,Service Accounts,Bot,View service account details,GitLab bots - read-only,GitLab service account / bot - not a human user.
[2026-05-05] - Mobile-friendly tours + sync access control
Pridané
- Sprievodcovia plne responzívni na mobile (
static/css/tour.css): pridaný@media (max-width: 600px)blok, ktorý zmení popover na bottom-sheet zaberajúci celú šírku obrazovky, max 70 vh, s tlačidlami Späť/Ďalej v zalamovacom päte. Welcome karta sa rozťahuje na celú šírku mínus 0.75 rem margins. Žiadne horizontálne scrollovanie, žiadne odrezané popover-y. - Tour engine otvorí sidebar automaticky (
static/js/tour-engine.js): keď krok cieli element vnútri#appSidebar/.gl-sidebara používateľ je na mobile (≤ 768 px), engine pred meraním rectu cieľa pridámobile-openclass na sidebar avisiblena overlay. VonDeselected(aonDestroyed) sa sidebar zatvorí, aby ďalší krok mimo sidebaru nebol prekrytý drawerom. Kľúčový fix: doteraz mali sidebar prvky kladný bounding rect aj v zatvorenom stave (translateX(-100%)), takže Driver.js kreslil cut-out mimo viewport - používateľ videl len stmavnutý overlay s ničím vyznačeným.
Opravené
- Sync progress bar - viditeľnosť pre študentov bez kurzov:
/api/sync/activevracalper_courseslovník so všetkými prebiehajúcimi syncmi systému; študenti, ktorí nie sú zapísaní do žiadneho kurzu, videli aktivitu cudzích kurzov. Endpoint teraz volá_filter_courses_for_user(rovnaká logika ako dashboard widgets), takže ne-admin používateľ vidí iba kurzy, do ktorých má prístup. Bearer-token volania a admini obchádzajú filter. - Multi-job count badge - prekrývanie v Opere: badge bol absolútne polohovaný v pravom hornom rohu
#globalJobBar, čo v Opere s úzkym viewport-om prekrývalo titulok jobu. Badge sa presunul do tenkého header pásu nad listom úloh (bar.insertBefore(countBadge, bar.firstChild)) a má teraz prirodzený vlastný riadok.
Zmenené
- Dokumentácia (
docs-site): pridané záznamy vchangelog.md(SK) achangelog.en.md(EN). Dashboard "Latest changes" widget zoradený rovnakým poradím cez_CHANGELOG_ENTRIESvsrc/app/api/dashboard/home_changelog.py.
[2026-05-04] - Sprievodca aplikáciou (Guided Tours)
Pridané
- Driver.js v1.3.6 vendored v
static/vendor/driver.js/(MIT, ~21 KB JS + 4 KB CSS, žiadny CDN). Globálny entry pointwindow.driver.js.driver({...})je predvolene súčasťou každej autentifikovanej stránky. - Tour engine (
static/js/tour-engine.js): role-aware (študent / učiteľ / admin), multi-language (en + sk), per-page detekcia podľalocation.pathname, perzistencia stavu vlocalStorage(gp_tour_v1:<slug>@<role>:{completed,skipped,prompted}). Kľúče sú scope-nuté podľa role, takže po promócii študenta na učiteľa sa nové sprievodci ponúknu znovu. - Tour content registry (
static/js/tour-content.js): 20 sprievodcov pokrývajúcich Dashboard, Course Detail / Settings / Roster / Teachers / Analytics / Activity, Team Detail, Project Detail, Student Profile, Admin Users / Courses / System, Retired grading Editor a Support - každý plne preložený. - First-visit welcome card: nenápadná floating karta vpravo dole s názvom sprievodca, počtom krokov, odhadom času a CTA "Take the tour / Maybe later". Auto-zatváranie po 25 s, jednorázová ponuka per role.
- Help launcher v hlavičke: položky "Take a tour" a "Replay tours" v existujúcom user dropdowne, klikom na Replay sa vyčistí história sprievodcov.
- Themed Driver.js popover (
static/css/tour.css): plne zhodný s design tokenmi (--surface-default,--primary,--shadow-lg), animovaný stage pulse cez.gp-tour-pulse, redukovaný režim animácií (prefers-reduced-motion). - Hard role guard:
run(slug)odmietne spustiť sprievodcu, ktoréhorolesneobsahujú aktuálnu rolu používateľa - bezpečnostná poistka pre prípad, že content registry omylom registruje teacher-only sprievodcu na študentskej stránke.
Opravené
- Run Compliance Checks modal - biely pruh dole:
rcm-footermalbackground: var(--card-bg, var(--surface, #fff)), ale ani jeden token nie je v aplikácii definovaný (existujú len--surface-default,--surface-strong). Fallback#fffvykreslil biely sticky footer. Footer používa--surface-stronga vystupuje cez--gl-spacing-5modal padding, takže lícuje s okrajmi modálu. Rovnakorcm-grouparcm-itemboli prepojené na reálne tokeny - checkbox riadky majú teraz povrch, hover state, focus ring a inset border-stripe pri zaškrtnutí.
Zmenené
- Tour CSS používa real SVG ikony / unicode dots namiesto emoji (žiadne rakety / mávanie / žiarovky / špendlíky / stopky). Welcome card meta riadok má dva pillové badge s farebnou bodkou (primary pre "steps", success pre čas).
- Build pipeline:
tour-engine.jsatour-content.jspridané doJS_MODULESvscripts/build_bundle.py;tour.csspridaný dostatic/styles.cssmanifestu - minifikované.minsiblingy a gzip-precompressed bundle sa generujú automaticky.
[2026-05-03] - Webhooks v2
Pridané
- Multi-scope konfigurácie webhookov: Každý kurz môže mať ľubovoľný počet webhook tajomstiev, každé priradené ku GitLab Group, Sub-group, zoznamu projektov alebo celému kurzu. Tajomstvá sa generujú na serveri, zobrazia sa práve raz a rotácia má 24h grace okno. Audit log zachytáva všetky create / rotate / revoke události.
- Auto-detekcia GitLab group path: Pole
gitlab_group_pathna úrovni kurzu sa už nezadáva ručne - systém počíta najdlhší spoločný prefix zgitlab_group_pathexistujúcich tímov pri uložení. Pole odstránené z UI kvôli duplicite s per-config scope. - Archive-safe webhooky: Pri archivácii kurzu sa všetky jeho
WebhookConfigurationriadky preklopia nais_active=False, takže auth lookup ďalšie doručenia odmietne s 401. Riadky zostanú zachované (audit + rotation grace). Pri reaktivácii kurzu zostanú konfigurácie deaktivované - operator manuálne rozhodne, ktoré scope sú ešte relevantné.
Opravené
- Webhook config modal sa neotvára: Vnútorný
.modaldiv malclass='d-none', čo prepisalo.activetriedu na backdrope. Backdrop sa zobrazil, ale obsah zÿstal skrytý. Odstránenéd-nonezo všetkých 3 webhook modálov. - "Heads up" upozornenie prerobé aby ladilo s ostatnými
.alert.alert-infov modáloch (jednoriadkový callout, bez bold-prologu).
Zmenené
- Odstránené legacy
api/group_webhooks.py,schemas/group_webhook.py,services/group_webhook.pyatests/unit/test_group_webhook_service.py(nahradené modulomwebhook_configurations). Pomocná funkcia na označovanie posledného použitia legacy course-level tajomstva bola priamo vložená doapi/webhooks.py;ROTATION_GRACEteraz žije vservices/webhook_configurations.py.
[2026-05-03] - Late
Zmenené
- Backend refactor (-60 LOC, -73 net riadkov): Hoistovanie 60+ duplicitných inúlínovaných importov v
admin.py,home.py,evaluation_report.py,pilot_telemetry.pyna úroveň modúlu. Odstránené mrtve cesty, opravené PERF401/PERF403 list/dict comprehensions a S110 "best-effort swallow" bloky majú explicitnýnoqakomentár. Žiadna zmena správania -ruff+mypy 1.11ostali čisté. - Analýza stránky kurzu - rýchla cesta:
EvaluationReportServicemá novú metódu_collect_preview_data(), ktorá preskčí 3 drahé agregáty (compliance trends, support summary, weekly aggregates) pre načítanie analytickej stránky. Generovanie PDF zostalo nezmenené.
Opravené
- Prístupnosť (a11y) -
<label>bez asociovaného poľa: - V
_analytics_content.html(formulár generovania PDF reportu) štyri "header" labely (Course Name, Semester, Teacher Name, Report Period) prekonvertované z<label>na<span class="form-label">, lebo neopisujú žiaden vstupný prvok - označujú readonly zobrazenia. - V
member_filters.html,_run_checks_modal.htmlaforms.html(toggle, bare checkbox, file-upload) doplnený explicitnýfor=atribút na obalľvé<label>prvky a generovanéidk checkbox vstupom v_run_checks_modal.html. Implicitné zabalenie aj explicitnéforzahája oba kontrolné mechanizmy DevTools/axe.
[2026-05-03]
Zmenené
- Detaily študentov (Collapsibles): Prvá sekcia typu
<details>sa teraz automaticky otvára aj v prípade prázdnych dát. Pokiaľ študent nemá priradené Issues alebo MR Diskusie, prázdny stav sa vizualizuje s inštruktážnym textom (namiesto potichu zbaleného zoznamu). - Vizuálne úpravy komponentov:
- Pridaná automaticky rotujúca šípka (chevron) pre element
.summary-toggle(používaný v prehľadoch detailov študenta). - Component Raw Check Details (JSON) prestajlovaný ako štandardný rozbaľovací element s
pre-formátovaním a lepšie ladí so zvyškom dashboardu. - Okraje v elemente
pagination-controlssa po vložení dodetailsneprekrývajú cez content (odstránený tzv. CSS notch).
Opravené
- Sprievodný text pod hlásením GitLab Health: Notifikáčný banner je teraz vertikálne stohovaný s globálnym task barom, aby sa elementy neprekrývali. Hranica pre notifikáciu (
GL_FAIL_THRESHOLD) bola zvýšená na 3 nadväzujúce výpadky. - Skeleton tabuľky (
.gl-skeleton-table): Vizuálne loaderi teraz lepšie využívajú flexbox a šírky sú rôznorodejšie (nth-childpattern) pre odstránenie monotónnych "blokov", no animácia a kompozícia zostáva konzistentná po celý čas načítania bez zablokovania vlákna DOM. - Oprava CSP pre
<script>a<link>inliny: Priamy atribútonloadprepísaný,noncepridaný na všetky inline script značky pre fungovanie striktného Strict CSP bez varovaní vo všetkých dashboard template moduloch. - Markdown úniky: Znak spätného lomítka
\pred Markdown kľúčovými znakmi sa už vo výslednom parsovaní renderuje bezpečne namiesto jeho tichého odseknutia.
[2026-05-02]
Bezpečnosť
- Strict CSP -
@alpinejs/cspbuild povýšený na 3.15.12 a defaultne zapnutý. Pôvodne vendorovaný 3.14.9 mal očesaný evaluator výrazov, ktorý odmietal||,===,!==,!,&&a reťazcové argumenty metód - po zapnutí flagu padali všetky stránky používajúceselect_field(), markdown editor taby, dropdowny pre vyhľadanie assignee, role-toggle dropdowny a sidebar taby (Alpine Error: Alpine is unable to interpret the following expression...v konzole). Alpine 3.15.3 (PR #4711, "Improve evaluator") obnovil plnú podporu inline výrazov; vendorujeme 3.15.12 (vendor/alpine-csp-3.15.12.min.js, SHA-256566167134bb2...), takže šablóny zostávajú idiomatické. Middleware posiela enforced policy (sunsafe-eval/unsafe-inlinepre spätnú kompatibilitu) aj strict Report-Only policy (nonce-{nonce}+strict-dynamic); povýšenie na enforce čaká na prázdny violation report.
Zmenené
- Markdown editor extrahovaný do jedného komponentu (
components/markdown_editor.html). ~30-riadkový GitHub-style toolbar (Heading / Bold / Italic / Quote / Code / Link / Bulleted list + Write / Preview taby) bol duplikovaný v troch templatoch (support formulár, detail tiketu, odpoveď v tikete). Jedno makromd_editor()teraz poháňa všetky tri miesta. Tlačidlá toolbaru prešli ztitle=nadata-tippy-content=pre konzistentné tooltipy, dostaliaria-label, a wrapper márole="toolbar"+aria-label="Markdown formatting". Taby dostalirole="tab"+aria-selected.
Opravené
- Tlačidlo Code v markdown toolbar opravené (regresia z CSP migrácie). Predošlý overlapping regex cez tri support templaty dvojito predprifixoval volanie
$mdInsertna$$mdInsert, ktoré ticho zlyhávalo. Opravené a konsolidované cez nové makro, takže sa to už per-template nemôže opakovať. - Edit User - loader na Save changes je vycentrovaný v tlačidle (
inset:0; margin:auto). - Dashboard - duplicitné riadky soft-deleted projektov sú skryté; projekty s rovnakým názvom v rôznych tímoch sú v course tree disambiguované.
Bezpečnosť
- Absolútny TTL session-y vynucovaný aj na stateless (cookie-only) session-ách (AUTH-06b): predošlý AUTH-06 fix pridal
session_absolute_max_age_secondsiba do Redis session store-u. Stateless cookies (fallback pri nedostupnom Redise) naďalej záviseli výlučne od slidingmax_age- aktívny používateľ (alebo ukradnutý cookie) si mohol TTL obnovovať donekonečna.get_current_session()teraz validuje claimts(dátum vytvorenia) oprotisession_absolute_max_age(default 24 h) pri každom načítaní session, nezávisle od storage backendu. Malformovanýts= expired (fail-closed). - Rate-limit fail-closed vo VŠETKÝCH prostrediach (AUTH-05b): predošlý AUTH-05 fix aplikoval fail-closed iba na
APP_ENV=production; dev a test boli stále fail-open. Ak by dev.envomylom unikol na produkciu, rate limiting by sa tichto degradoval na no-op. Zjednotené naHTTP 503 + Retry-After: 30všade. - UA fingerprint sa ukladá vždy - aj pri prázdnom User-Agent (AUTH-08): predtým pri chýbajúcom alebo prázdnom
User-Agentheadri cookie obsahovalua="", čo obišlo kontrolu fingerprintu. Útočník s ukradnutým cookie ho mohol replayovať z ľubovoľného klienta jednoduchým vynechaním headra. Session-y teraz vždy nesú fingerprint; prázdny UA produkuje hodnotu"no_ua|no_ua", takže mismatch check sa spúšťa aj proti replay útokom, ktoré stripujú headre.
Zmenené
- Sweep enrich limitovaný na 2 000 jobov za periodický beh (SCALE-01):
periodic_enrich_allpredtým zaraďoval enrich joby pre každý issue a MR naprieč všetkými aktívnymi projektami bez limitu. Pri 567 študentoch (~200-500 projektov × 15-30 entít) to mohlo zaplaviť frontu 5 000-15 000 jobmi naraz, vyčerpať kapacitu workerov a oneskoriť spracovanie webhook-ov. Nový configsweep_enrich_max_jobs_per_run(default 2 000) limituje celkový počet; zvyšné entity sa spracujú v ďalšom 24h cykle.
Opravené
- Mŕtvy kód odstránený v
sweep_stale_projects: duplikátnyreturn 0(nedosiahnuteľný kód za prvýmreturn) odstránený.
[2026-05-07]
Zmenené
- Compliance engine - audit-driven kalibrácia kontrol R02/R04/R05/R06/R07/R08/R10/R11/R12: komplexný logický audit 13-check systému odhalil sériu prípadov, kedy default semantika checkov nezodpovedala duchu zadania ZSI a buď nespravodlivo penalizovala disciplinovaných študentov, alebo naopak prepúšťala nezhody. Týmto release-om sa kalibrácia zarovnáva s textom "doing & communicating" (4-5 členné tímy, separátna feature branch per ticket, MR linkovaný na issue, dvaja reviewer-i, commit-ref-citing odpovede, Approve pred merge, MR + ticket sa zatvárajú spolu) a engine od teraz robí to, čo by skúsený učiteľ urobil pri ručnej kontrole.
- R02 (Branch naming) - fail-detail vysvetľuje aj protected-branch prípad (predtým len "doesn't follow naming convention"). Nový text: "Branch '
' is on a protected name or does not match the configured naming convention" - okamžite jasné, či ide o naming-pattern miss alebo o priame mergeovanie do master/main/develop. Práznin vzorbranch_patternuž nezhadzuje check (vetva sa proste preskočí). - R04 (MR linked to issue) - branch-name fallback + presnejší bare-
#Nregex. Workerenrich_mr.pyajmr_processor.pyextrahujelinked_issue_iidaj z názvu vetvy (issue-7-foo,7-add-login,feature/issue-12), ak popis MR neobsahujeCloses #N. Kombinuje sa s textovým parserom - preferuje sa explicitnéCloses #N, branch-IID je fallback. Bare-reference pattern#Nje sprísnený na word-boundary aj na konci ((?<![\w-])#(\d+)(?!\d)), takže nezachytív#10alebo#10x. FKMergeRequest.linked_issue_idsa zaresolvuje cezgitlab_iidlookup -> R11 vie spárovať MR s tiketom. - R05 (MR description quality) - ratio počítania slov ignoruje markdown štruktúru. Predtým mohol MR prejsť 10-word threshold s úplne prázdnym obsahom (sekcie
## Co,## Ako,## Prečozaberali ~9 slov bez toho, aby skutočne niečo opisovali). Helper_word_countteraz odstrihne markdown headers, list markers, link syntax[text](url)->text, italic/bold sigil-y a filtruje tokeny <2 znaky bez\wznaku. "Prázdne nadpisy bez obsahu" už neprejdú. - R06 (Review Received) - počíta len reviewer-ov s zmysluplným feedback-om. Predtým stačilo, aby reviewer napísal
"+1"alebo"ok"a R06 ho započítal. Engine teraz agreguje všetky komentáre per reviewer (notes_by_reviewer: dict[author_id, list[notes]]), spojí ich a prejde cezis_meaningful_comment(joined, min_words=cfg.min_word_count). Novýcfg.require_meaningful(default True) sa dá v UI vypnúť pre kurzy s lightweight review kultúrou. Detail uvádza počet reviewer-ov so "short comments only" zvlášť, takže teacher vidí, prečo R06 fail-ne aj pri 2 prítomných reviewer-och. - R07 (Code Review Given) - default min_words 30 -> 15 (model
course_settings.min_review_word_count, helperis_meaningful_comment, migrácia039). 30 slov bolo v praxi privysoké pre typické per-line review komentáre ("Tu by si mohol použiť dict comprehension namiesto for-loopu" má 9 slov a je to legitímna review). Zarovnáva sa s zvyškom kódu (kdemin_review_word_countbol fallback na 15) a s ZSI textom, ktorý žiadny kvantitatívny prah neuvádza. Migrácia upraví iba kurzy stále na default-e 30; učiteľské customizácie sa nedotkne. - R08 (Review Response) - počíta aj standalone reviewer notes + softer defaults. Predtým engine bral ako "review thread" iba inline diff diskusie (notes s
discussion_id); standalone reviewer komentáre na úrovni MR boli ignorované, takže študent mohol nikdy neodpovedať na"Tento PR vyzerá dobre, ale chcel by som vidieť testy."a R08 prešiel. Teraztotal_threads = inline_total + standalone_reviewer_notesaanswered = inline_answered + min(standalone_author_notes, standalone_reviewer_notes).cfg.require_commit_refzmenený True -> False default (ZSI commit-ref-citing odporúča, ale neuvádza ako must),cfg.pass_if_no_threadsFalse -> True (študent nemôže odpovedať na feedback, ktorý neexistuje). Keď commit-ref nie je vyžadovaný, partial scoring je čistáresponse_rate(nie 50/50 weighting). - R10 (Merged by author) - akceptuje aj merger-tímakolega. Predtým
allow_self_merge=Trueznamenalo "autor MUSÍ merge-núť", čo je sémanticky proti ZSI textu "assignment owner (or designated assignee) executed the merge". Default semantika je teraz permisívna: prejde, keď autor ALEBO ďalší resolved tímakolega (merged_by_id != None) merge-uje; fail-ne iba pri unknown-user merger-i (admin, bot, externý GitLab user). Nové explicitné cfg:require_self_merge(default False - autor MUSÍ kliknúť Merge) aforbid_self_merge(default False - reviewer-gates-merge model: niekto INÝ ako autor musí merge-núť). Detail strings: "Merged by author", "Merged by a team member after approval", "Merged by an unknown user (not a team member)". - R11 (MR + Issue closed) - strict pairing cez
linked_issue_iid. Predtým bol check decoupled: stačilo, aby existoval ľubovoľný merged MR + ľubovoľný closed issue, čo prešlo aj keď študent merge-ol niečo úplne iné než tiket #7, ktorý zostal otvorený. Engine teraz budujeissues_by_iid = {i.gitlab_iid: i for i in ctx.issues_assigned}, pre každý merged MR pozremr.linked_issue_iida check passne iba, ak spárovaný issue jeclosed. Fallback: keď žiadny merged MR nemálinked_issue_iid(študent zabudol napísaťCloses #Naj pomenovať vetvu), engine spadne späť na legacy any-issue-closed semantiku, aby unlinked-but-closed pair nebol prísnejšie penalizovaný než predtým. Detail strings: "Merged MR's linked issue is closed", "Merged MR references an issue that is still open", "MR merged and assigned issue closed (no explicit link)", "MR merged but no assigned issue is closed". - R12 (Pipeline Health) - širšia detekcia test job-ov. Substring
"test"zachytával len"test","pytest","junit"(junitobsahujetestpo zámene jednej slovo... nie, neobsahuje), takže pipeline s job-om"spec","verify","coverage","jest","mocha","rspec", alebo"phpunit"sa hlásil ako "nemá test job" a R12 fail-ol. Detektor vpipeline_processor.pyteraz prechádza tuple("test", "spec", "pytest", "junit", "jest", "mocha", "rspec", "phpunit", "verify", "coverage")protinameajstage, takže tipické naming conventions cross-language sú pokryté.
- R02 (Branch naming) - fail-detail vysvetľuje aj protected-branch prípad (predtým len "doesn't follow naming convention"). Nový text: "Branch '
Bezpečnosť
- Absolútny strop životnosti session-y 24 h (AUTH-06): doteraz mal session store iba sliding TTL - aktívny používateľ (alebo ukradnutý long-lived cookie) si mohol TTL refreshovať donekonečna. Pridaný
session_absolute_max_age_seconds(default 24 h); store stamp-ujecreated_atpricreate()a vload()odmieta session-y staršie než limit nezávisle od sliding TTL. Ohraničuje blast-radius ukradnutého cookie. - Webhook side-effecty po commit-e fail-best-effort (EVT-01): event processor-uje doteraz commitol DB transakciu a potom spúšťal cache-invalidation, immediate enrichment, metrics enqueue a SSE notify. Ak ktorýkoľvek z nich raisol, outer
exceptzavolal rollback - ale commit už bol persistovaný, takžeevent.processed=Truezostalo a side-effecty sa nikdy nezopakovali. Teraz každý side-effect ide cez_safe(coro, name)ktorý chytá výnimky, inkrementuje Prometheus counterwebhook_processed_total{status="sideeffect_failed:<name>"}a logujeWARNINGnamiesto bublania. - Redis vyžaduje heslo aj na internej Docker sieti (SEC-03/SEC-04): doteraz Redis počúval bez autentifikácie a
REDIS_URLmohlo byťredis://redis:6379/0bez hesla. Útočník s prístupom do Docker bridge-u (alebo so zlým rebind-om porto-mappingu) by si vedel prečítať session blob-y a queues. Validátor vapp.configteraz vAPP_ENV=productionodmieta naštartovať, akREDIS_URLneobsahuje password segment (redis://:PASSWORD@...). Compose template plnohodnotne zapína--requirepasskeď jeREDIS_PASSWORDset. Na produkcii vygenerované 40-char heslo, všetky 4 worker-y + scheduler + api re-pripojené. FEATURE_RBAC=falsev produkcii hard-faily (AUTH-04): predtým_check_required_roleslen logovaloWARNINGa požiadavku prepúšťalo bez kontroly rolí. Človek omylom vypnutím flagu by ticho otvoril všetky teacher-only endpointy. Validátor teraz v produkcii vyhodíValueErrorpri štartu, čím deployment fail-ne fail-fast namiesto fail-open behu.DEBUG=truev produkcii hard-faily (§7b): debug mód odhaľuje stack trace-y a môže auto-zakladať admin používateľov. Validátor odmieta beh.- Rate-limit fail-closed v produkcii (AUTH-05): keď bol Redis nedostupný,
dependencies.check_rate_limitskončilo vexcept Exceptiona povolilo request (graceful degradation). To znamenalo, že útočník dokáže obísť rate limit kompletným zhotenín Redisu (alebo brute-force-om kým Redis flapne). Produkcia teraz vraciaHTTP 503sRetry-After: 30a logomrate_limit_unavailable_blocking. Vývoj a testy zostávajú permissívne. SESSION_STRICT_UA_FINGERPRINTopt-in (AUTH-02): UA-fingerprint je k dispozícii ako defence-in-depth proti XSS / cookie-theft replay útokom z iného OS / browser-a, ale ako default zostávafalse. Pri prepínaní mobil <-> desktop alebo browser update-och nie je hash UA stabilný a flag default-true v praxi vyhadzoval reálnych používateľov 401-kou. Sady "prísnych" CSRF + IP-binding + absolútneho session ceiling-u (AUTH-04/05/06) poskytujú ekvivalent post-stolen-cookie ochrany bez tejto false-positive miery.
Pridané
- Healthcheck pre Caddy reverzný proxy (INFRA-02): Compose definícia teraz robí
caddy validate --config /etc/caddy/Caddyfile --adapter caddyfile(interval 30 s, retry 3, start_period 10 s). Keď preklep vCaddyfilezhodí konfiguráciu, kontajner sa označí unhealthy namiesto tichého servovania starej cache. - Json-file log rotation 20 MB × 5 (INFRA-04):
postgres,redis,api,worker,scheduler,caddymajú default-logging cezx-default-loggingYAML anchor. Predtým sa/var/lib/docker/containers/*/*.logmohol rozrásť na desiatky GB pri verbose worker-och a zhodiť disk. - Scheduler healthcheck (
/proc/1/cmdline): pôvodnýpgrep -ftesty zlyhávali, lebo slim worker image nemá procps. Použitýtr '\0' ' ' < /proc/1/cmdline | grep -q app.workers.scheduler- funguje v každom Linux kontajneri bez extra závislosti. - Auto-spustené integration-tests na feature branchoch (CI-05): predtým
when: manual + allow_failure: trueznamenalo, že integration regression sa zachytil iba pri otvorení MR alebo merge-i do main. Teraz beží automaticky pri každom push-i na feature branch.
Vylepšené
- API memory limit 768 MB -> 1024 MB (INFRA-03): PDF render pipeline + súčasné LLM streamy občas trafili OOM kill. Worker bumpnutý 512 -> 768 MB.
- Sweep cleanup robí batched delete-y (DB-04):
_cleanup_events_async,_cleanup_snapshots_asynca_cleanup_audit_asyncmazaliWHERE timestamp < cutoffjedným statement-om. Pri 1 M+ riadkoch to malo dlhú transakciu, blokovalo replikačné slot-y a vacuum mohlo zaostávať. Helper_delete_in_batchesmazaní vo farbenných 5 K-row dávkach s commit-om medzi nimi a hard cap 200 dávok / spustenie (~1 M riadkov / sweep). Subsekvenčné spustenia plynulo dorobia zvyšok. - SBOM generovanie nemá
allow_failure(CI-02): SBOM je supply-chain compliance artefakt. Tichý fail by znamenal, že release ide bez auditovateľnej depencency listingu. - Globálne
APP_ENV: "test"v.gitlab-ci.yml: unit-tests job nemal explicitnéAPP_ENV, takže s pridanými production validátormi bySettings()v testoch hádzaloValueError. Globálna premenná zaisťuje, že iba production-targeted joby behajú v production režime.
Opravené
- Globálny job-bar - ETA "2 min left" sa zasekol pri 5+ min reálne uplynulých:
_computeEtasa volalo iba pri novej progress-vzorke, takže medzi dávkami 1 Hz timer iba inkrementoval elapsed clock, ale štítoktime-leftzostal na poslednej vypočítanej hodnote. Teraz ETA kotvená na wall-clockexpectedFinishAt; tick re-rendruje[data-job-eta]cez_displayEta(job), ktoré odpočítava k 0 a po vypršaní pôvodnej predikcie spočíta novú zo cumulative rate (totalElapsed / pct * (100-pct)). Žiadne flickeringy, ETA monotónne klesá. - Toasty pre dokončenie sync-u sa nezobrazovali pri minimalizovanej karte:
sidebar.jszatváral dashboardový SSE privisibilitychange->hidden. Server pushe premember_sync_completeteda počas minimalizácie nedorazili -_queuedToastsnemal čo flush-núť pri návrate. Teraz SSE zostáva otvorený (browseri throttle-ujú, ale doručia), zastavujeme iba 60 s polling timer. - Course Analytics - load order legacy report controllera: report-form Alpine controller zil v
pages/course-analytics.js, ktory sa loadoval cez<script defer>vo vnutri HTMX-swapnuteho partial-u. HTMX vytvara nove<script>elementy sdefer, ale dynamicky inserted scripts nerespektujudefersemantiku - bezia async. Alpine medzitym presiel novy subtree a vyhodnotil controller skor, nez sa skript stiahol -> cascadestartDate / endDate / durationText / dateError is not defined. Controller bol potom inline-nuty akox-data="{...}"literal priamo na<form>- ziadna load-order zavislost. - Test
test_tampered_signature_returns_noneflaky: itsdangerousURLSafeSerializerpre SHA-1 emit-uje 27-char base64 podpis (162 bit-ov, z toho posledné 2 sú padding bits). Flipping len posledného char-u medzi"A"a"B"neménil dekódované HMAC byty (rozdiel iba v padding bit-och). Test teda v ~25% pípeline-ov reportoval, že tamper neporušil signature - pravdivo, ale to znamenalo, že test merá nesprávnu vec. Teraz mení interior char.
[2026-04-29]
Pridané
- Notifikácia personálu kurzu pri novom support tikete: doteraz dostával e-mail iba odosielateľ tiketu (potvrdenie). Učitelia/owneri kurzu sa o nových tiketoch dozvedeli iba tým, že manuálne otvorili dashboard. Nový template
notify_ticket_new_to_staff(subject[GitPulse] New ticket #{id} ({course_code}) - {title}) sa rozosiela všetkým aktívnymowner+teacherdaného kurzu (s vylúčením samotného odosielateľa) v oboch vetváchsubmit_support_ticket(dynamic-form aj fixed-column). Idempotency cezticket_new_staffkľúč, retry s exponential backoff, sweep každé 2 min ako fallback (api/telemetry.py,services/email_notifications.py)
Opravené
- Únik súkromia: interné poznámky lekli odosielateľovi tiketu:
notify_ticket_commentposielalo e-mail submitterovi aj keďis_internal=true(interná poznámka určená len pre personál - napr. "tento študent klame, ignoruj"). Pridaný explicitný guardnot payload.is_internalpred notifikáciou submitter-a. Internal poznámky teraz dostane výhradne pridelený teacher/staff - Avatary nezostávajú písmenkami po prebudení notebooku zo spánku: keď notebook zaspí alebo Wi-Fi krátko vypadne, prehliadač vyhodí
errorevent na každom rozpracovanom<img>aváteri. Predošlý handler okamžite skryl<img>a zobrazil písmenkový fallback - bez akejkoľvek logiky obnovy. Po jednom uspánkovaní teda VŠETKY avatary v aplikácii (header, dashboard greeting, profil študenta, support tikety, course teachers, search) tichto degradovali na písmenká až do hard-reloadu. Fix vcore.js: uložiť pôvodnýsrcpri prvej chybe; ak!navigator.onLine, odložiť rozhodnutie o fallbacku (markdata-avatar-pending="1") namiesto natvrdo zobrazenia písmena; nový retry-all listener naonline+pageshow(BFCache) +visibilitychange->visibles 250 ms defer (čas pre DNS/Wi-Fi po wake) a cache-busterom obnoví všetky pending/fallback avatary jediným re-fetchom. Centralizované - funguje na celej aplikácii, nie iba na jednej stránke - Reálny double-submit race v formulároch - niektoré akcie posielali 2 POST naraz: globálny intersepter formulárov v
core.jsbežal na capture fáze a volalpreventDefault() + fetch(), zatiaľ čo page-level handler na bubble fáze tiež volalpreventDefault() + fetch()na rovnakom formulári. Výsledok: dva HTTP POST za jeden klik. Postihnuté: dismiss LLM error (project detail), login, Alpine@submitformulár pridelenia učiteľa kurzu. Fix: rozšírený zoznam pravidiel preskočenia - globálny handler teraz nechá tak formuláre sdata-submit-action,@submit/@submit.prevent(Alpine),data-no-boundary="1"aj HTMX atribútmi.login.htmloznačenýdata-no-boundary="1" - Email scheduler zaseknutý 25+ hodín - koniec záhady "nedošlo žiadne email": scheduler kontajner po dlhom uptime prestal registrovať periodické joby; pri starte ukazoval iba "Scheduler registered 5 periodic jobs" namiesto plnej sady.
sweep_email_queuesa nezavolal nikdy ->email_logriadky zostávalipendingnavždy. Poredeploy.py(ktorý recreate-uje kontajnery) scheduler správne registruje všetky joby a smoke-test e-mail prešiel pipeline za 1.6 s
Vylepšené
- Caddy konfigurácia - vyčistené Caddy 2.x deprecation warnings:
basicauthdirektíva zmenená nabasic_authpre/grafana,/prometheus,/jaeger(×3); odstránené redundantnéheader_up X-Forwarded-Proto {scheme}(×2 - Caddy reverse_proxy ho posiela automaticky). Po prebuilde žiadne deprecation/style warnings vcaddylogu, basic_auth naďalej vynucuje 401 bez kreditov
[2026-04-28]
Vylepšené
- Profil študenta - MR a issue diskusie rendrujú markdown: komentariale review (
partials/student/_comments.html) sa predým zobrazovali len s linkifikovanými#/!/@referenciami, zvyšok bol surový text. Teraz prechádzajú cez filterrender_gl_description, ktorý bol rozšírený o fenced code blocks (```c ...```) - obsah je escapovaný, zabalený do<pre class="gl-desc-pre"><code class="language-X">...</code></pre>a má vlastný CSS štýl. Mark down ako## nadpis,**bold**,_italic_, zoznamy (*/-/1.), inline`code`a fenced bloky fungujú rovnako ako vo GitLab webe - Render markdown popis - žiadne veľké medzery medzi sekciami: newliny sa teraz strihajú okolo OPEN aj CLOSE block tag-ov (
<h6>...</h6>,<pre>,<ul>,<ol>), takže prázdny riadok medzi nadpisom a odsekom už neprodukuje viditeľný dvojitý<br>gap. Bezpečnostný cap: 3+ po sebe idúce<br>sa zberú na 2 - Note list (
components/lists.html) - markdown render: sekundárny note-list-item komponent (legacy cesta) používa rovnaký filter ako student detail, aby žiadna výpisová plocha s GitLab komentármi nezostala s holou escapovanou hodnotou - Globally unified course-sync banner format: päť rôznych miest produkovalo štyri rôzne formáty toho istého
Syncing...textu (SSE detail / SSE fallback / legacy poll /registerServerSyncs/_reconcileCourseJobs). Jeden helper_courseSyncMsg(name, running, queued, synced, total)vglobal-job-bar.jsprodukuje jednu formu vsade:"NAME: Syncing X/Y groups done (R active, Q queued)", X/Y a zátvorky odpadajú pri neznámych dátach. Helper je vystavený cezwindow._courseSyncMsg, dashboard a course-detail page-skripty volajú ten istý kód - koniec flickeringu medzi formátmi pri každom SSE ticku alebo htmx settle
[2026-04-27]
Opravené
- CI
dependency-scanjob - koniec falošného "Job failed": druhý behpip-audit(oproti celému inštalovanému prostrediu, nie lenrequirements-lock.txt) zachytával zraniteľnosti v CI nástrojoch -pipsamotný (CVE-2026-3219, fix zatiaľ nie je vydaný), prípadnecyclonedx-bom/pip-audittranzitívne závislosti - ktoré nie sú našou aplikačnou závislosťou. Pridaný|| truena informatívny scan + komentár;requirements-lock.txtaudit (skutočné runtime deps) zostáva striktný a generuje SBOM artefakt - Dashboard - falošný toast "Process timed out - check results manually" počas dlhého synku: dva navzájom sa zosilňujúce buggy. (1)
_jobMaxAgepre course-sync joby (UUID-like alebo numeric ID) bol 10 minút, reálny sync 8-skupinového kurzu beží 15-25 min -> staleness-guard hlásil timeout aj keď server stále aktívne synkoval. Zvýšené na 45 minút. (2) Predošlá oprava "passivedeferGlobalJobneprepisuje živú správu" early-return-ovala bezshowGlobalJob->_autoStartPollingsa nikdy nezavolal,lastUpdatezostávalo zamrznuté, staleness-guard po 10 min vypálil aj na zdravý job. Passive vetva teraz spúšťa polling, ak ešte žiadny nebeží (global-job-bar.js)
[2026-04-25]
Vylepšené
- Per-team Status pill na stránke kurzu - okamžite po kliknutí Sync All: optimistický update v
triggerSyncAll()zapíšeQUEUEDbadge docells[4]všetkých riadkov tímov a "Sync queued..." do Last Updated stĺpca pred odpoveďou servera._refreshCourseData()neprepíše SYNCING/QUEUED badge počas SSE race-u;updateTeamRow(team)rieši všetky stavové prechody (course-detail.js) /sync-allodpoveď do ~100 ms (predtým ~20 s): discovery tímov (volania/projects/:id/users) presunuté do background tasku_discover_course_teams_async- endpoint okamžite vráti queued, frontend nemusí čakať na rate-limit od GitLabu (api/sync.py)- Pilot Telemetry Service lint -
cast(date, ...)cleanup: zjednotenédatetimeimporty, premenované shadowing premenné v cykloch, ruff/mypy strict pass (services/pilot_telemetry.py) - Bez flickeringu progresu na dashboard kurzových kartách: stabilizované Last Updated / progress text počas SSE updates
[2026-04-24]
Opravené
- Compliance report PDF - žiadne orphanované nadpisy ani orezané riadky: odstránili sme
page-break-after: avoidna<h2>abreak-inside: avoidna veľkých naratívnych/attention blokoch v@media print. V A4 landscape to spôsobovalo, že WeasyPrint posúval nadpis sekcie na prázdnu stranu, ak sa obsah už nezmestil do aktuálnej. Ponechané je lenbreak-inside: avoidna úrovni riadkov tabuliek a titulkov - individuálne riadky sa už nerežú uprostred (src/app/workers/report_job.py) - Pilot Evaluation - reálne počty: namiesto surového počtu riadkov
MetricSnapshot(rástol s každým webhookom) sa teraz počítajú distinct trojice (team_id, student_id, week_bucket) joinnuté cezTeamMembers filtramiis_active+excluded_from_scoring=False- teacherov, peer-mentorov a vylúčených členov report už nezapočíta. Odstránili sme ajor-fallback, ktorý v prípade nulovýchrpt_course_countpoužil globálne číslo. Týždeň pokrytia má teraz fallback nalen(compliance_trends.weeks), aby graf a štatistika neukazovali0pri reálnych 5 týždňoch. Násobič klikov znížený na2×checks + 4×flags(src/app/services/evaluation_report.py)
Vylepšené
- Detail projektu - rovnaká veľkosť tlačidiel ako na skupine/kurze: akčné tlačidlá v hlavičke stránky projektu (
Open in GitLab,Rotate Secret,Unlink,Run Checks) už nepoužívajúsize='sm'- zarovnávajú sa s tlačidlamiLink Project / Sync / Run Checks / Export CSV / Export JSON / Retired Report / Deletena stránke skupiny. Vizuálna konzistencia naprieč úrovňami (Kurz -> Skupina -> Projekt) - @mention v popisoch MR na stránke študenta sa rendruje ako meno: filter
linkify_gl_refsprijíma voliteľnýusername_map(gitlab_username -> full_name) a pre mentiony spárované s členom tímu vypíše čitateľné meno (napr.Reviewers: Andrii BetsanamiestoReviewers: @sm361rw). Neznáme @mentiony sa zobrazujú ako plain handle. Dotknuté šablóny:partials/student/_merge_requests.html(opis MR),partials/student/_comments.html(MR notes) - Compliance report - prepis do štýlu diplomovej práce: číslované sekcie 1-9, titulky
Table 1..N, pätka so stranou, empty-state paragraphs pre každú sekciu, kompaktný "Group Overview" namiesto 4-card gridu, odstránená duplicita v exekutívnom zhrnutí a recommended-actions
[2026-04-23]
Pridané
- Per-kurz prepínač
skip_auto_archive(migrácia036) - nové boolean pole vcourse_settingschráni manuálne reaktivované kurzy pred opätovnou archiváciou pri ďalšom behu sweep-u.course_service.activate_course()ho automaticky nastaví naTrue, aby kurz reaktivovaný po skončení semestra nezmizol znova na ďalší deň. Učiteľ ho môže manuálne prepnúť v UI Settings -> sekcia "Dátumy semestra" - Presety integrované do modálok "Vytvoriť kurz" a "Klonovať kurz": selektor Rýchla predvoľba teraz jedným kliknutím vyplní
academic_year,semester(zimný/letný) aj dátumysemester_start_dateasemester_end_date- učiteľ už nemusí otvárať Settings po vytvorení kurzu, aby sa kurz archivoval automaticky. EndpointPOST /api/v1/courses/prijíma voliteľné poliasemester_start_date/semester_end_datepriamo pri vytváraní - Pole
semesterrozšírené vSemesterPreset: každý preset teraz nesie aj kanonickú hodnotuwinter/summer, čo odstránilo potrebu ručne synchronizovať preset sCourse.semestervýberom - Plný cyklus exportu/importu teraz prenáša aj
skip_auto_archivev JSON konfigurácii -config-import.jsvaliduje a vypisuje "Skip auto-archive: yes" do import summary - Automatické vypnutie automatizácie po skončení semestra: nový denný plánovaný job
sweep_auto_archive_ended_courses(queuelow, interval 24 h) prepnecourses.is_active=Falsepre kurzy, ktorýchsemester_end_date + semester_grace_daysuž uplynul. Pretože všetkých 23 existujúcich periodických sweep-ov už filtruje naCourse.is_active.is_(True), jediné preklopenie flagu okamžite zastaví:periodic_enrich_all,periodic_membership_sync,periodic_metrics_all,periodic_llm_analysis,periodic_telemetry_snapshot,periodic_verify_webhooks,periodic_docker_reverify,periodic_enrich_users,sweep_stale_projects,sweep_dead_projects,sweep_discover_new_projects,sweep_discover_new_teams, plus všetky cleanup sweepy. Výsledok: nulové GitLab API volania pre dokončené semestre (migrácia035_semester_end_date.py) - Nové pole
course_settings.semester_end_date(DATE NULL): explicitné "posledný deň výučby/skúšok". Pre kurzy bez vyplnenéhosemester_end_datesa odvodí zsemester_start_date + semester_default_length_weeks(default 14), čo chráni pred zabudnutými kurzami bežiacimi donekonečna - Rýchle predvoľby semestra pre TUKE FEI KPI - Informatika (všetky ročníky): nový modul
app.utils.semester_presetsa endpointGET /dashboard/semester-presetsponúka 4 preset-y: Zimný 2025/2026, Letný 2025/2026, Zimný 2026/2027, Letný 2026/2027. V UI kurzových nastavení dropdown "Rýchla predvoľba" jedným kliknutím vyplní oba dátumy (Monday of week 1 + posledný deň skúšok); učiteľ ich môže ďalej upraviť. Kalendár identický pre 1., 2., aj 3. ročník - TUKE FEI používa jeden akademický kalendár pre celý študijný program Informatika - Nové nastavenia v
app.config:semester_auto_archive_enabled(feature flag, defaultTrue),semester_grace_days(default14dní - buffer pre uzatvorenie známok, neskoré MR-ky, export záverečných reportov),semester_default_length_weeks(default14, fallback pre kurzy bezsemester_end_date) - Helper modul
app.utils.semester: dve čisté funkcie -get_effective_semester_end(cs, default_length_weeks)ais_semester_over(cs, grace_days, default_length_weeks, today=None). Explicitnésemester_end_datemá prednosť; fallbacksemester_start_date + N weeks. Open-ended kurzy (žiadenstartaniend) sa nikdy neoznačia ako skončené - archivujú sa len manuálne cez admin UI - Plný cyklus exportu/importu konfigurácie teraz prenáša aj
semester_end_datev JSON/settings/full-config(export + import vetva), aby sa presety dali prenášať medzi inštanciami a klonovanými kurzami - 14 nových unit testov v
tests/unit/test_semester.pypokrývajúcich: prázdne settings, open-ended kurz, within-grace, past-grace, fallback-to-start+N-weeks, preset uniqueness, bilingual labels, JSON shape - SK preklady:
Dátum konca semestra,Koniec semestra,Dátumy semestra,Rýchla predvoľba,- Vyberte predvoľbu -,Končí,Posledný deň výučby / skúšok...,TUKE FEI - Zimný/Letný semester 2025/2026 a 2026/2027 (Informatika, všetky ročníky)a ďalšie
Opravené
- Týždenný graf skóre a Weekly Breakdown - falošné W1-W7 riadky pre tímy aktívne od polovice semestra: reťaz piatich prepojených chýb, ktorá spôsobila, že Score Trend ukazoval falošnú čiaru W1=100 % -> W7=0 % -> W8+ reálne, Skill Profile používal zastaralý radar z W7 (0 %) a Weekly Breakdown mal sedem prázdnych červených riadkov vyvolávajúcich paniku študenta a učiteľa:
- (a)
pilot_telemetry.get_student_compliance_historyprimárna vetva (keď existovaliStudentComplianceSnapshotriadky) nikdy nevracala zozbierané dáta -return filledchýbalo - a kód padol do fallback MetricSnapshot vetvy, ktorá videla len najnovšiecomputed_at(W10). Fix: pridanéreturn filled(commitbd189ee8) - (b)
compliance.engine.backfill_compliance_historyfabrikovalStudentComplianceSnapshotriadky pre týždne 1..N aj pre tímy, ktoré GitLab projekt ešte nemali (-> W1=100 % "default ok" + W2..W7=0 %). Fix: detekcia prvého aktívneho týždňa zMIN(Commit.committed_at), preskočenie predchádzajúcich (commit3e6fe1b1) - © heterogénna n-tica
for col, model in ((Commit.committed_at, Commit), (MergeRequest.created_at, MergeRequest), ...)zlyhala na CI strict-mypy kvôli union-type inference. Fix: rozdelené na tri explicitnéselect(func.min(...))dotazy (commit52611892) - (d)
Result[Any].rowcountnie je v SQLAlchemy async stuboch -> CI mypyattr-defined. Fix:getattr(deleted, "rowcount", 0) or 0(commitc289c5b1) - (e) skrytý root cause: GitLab pri vytvorení projektu automaticky vytvorí počiatočný README commit s
committed_at ≈ čas vytvorenia projektu, takžeMIN(Commit.committed_at)vrátil W1 pre každý tím, a celá anti-fabrikačná logika z (b) zostala no-op. Fix:first_activitysa teraz určuje zMIN(MergeRequest.created_at)aMIN(Issue.created_at)(skutočné úmyselné akcie študenta); commity sa berú iba ako fallback a len tie, ktorýchauthor_idzodpovedáTeamMember.student_id(ignoruje bootstrap bot/system commity) (commit56a9387f) - (f) oprava post-deploy auditu: aj po DELETE pre-activity
StudentComplianceSnapshotriadky API stále syntetizovalo W1..(first_activity-1) akonullstub riadky kvôlifor wk in range(1, max_week+1)- Weekly Breakdown ich renderoval ako prázdne em-dash riadky. Fix: rozsah začína odmin(populated_weeks), takže chart/heatmap/tabuľka zobrazujú len reálne týždne - žiadne fabrikované dáta, žiadne zavádzajúce prázdne riadky
- (a)
- Dôsledok: pre tím, ktorý zahájil prácu v W8 a má aktuálnu aktivitu W10, UI teraz pravdivo zobrazuje iba W8, W9, W10 - bez zavádzajúcich W1=100 % (falošné zelené) ani W2-W7=0 % (falošné červené)
[2026-04-22]
Pridané
- Job bar - stav "Dokončuje sa...": globálna lišta postupu už nezamrzá na "0 beží, 0 v rade" počas 15-sekundového post-batch grace okna na serveri. Keď klient vidí
running==0 && queued==0ale server ešte hlásihas_active_sync=true, lišta prepne do stavufinishingso správout('Finishing...')mésto ínak šrtnutého počítadla. Týka sa SSE aj legacy poll vetvy vglobal-job-bar.js - Preklad - pokryté stavy kariet a job bar fallbacky: všetky hardcoded English fallbacky v
global-job-bar.js('Analyzing...','Generating report...','Running compliance checks...','Importing roster...','Exporting data...','Processing...') zabalené dot(...)a pridané zodpovedajúce klúče dosk.json. Audit skriptscripts/find_missing_translations.pyteraz hlási 0 chýbajúcich klúčov
Pridané
- Issues to Address -> interaktívny graf: statický zoznam porušených kontrol nahradený horizontálnym stĺpcovým grafom (Chart.js) - os X je % zasiahnutej skupiny, stĺpce sú farebne odlíšené podľa závažnosti (červená High / oranžová Medium / modrá Low), animované entrance (900 ms, staggered). Hover tooltip zobrazuje count/weight/severity, klik na stĺpec rozbalí detail-panel so zoznamom zasiahnutých študentov v grid-e kariet s click-throughom do riadku tabuľky členov. Zachovaný IntersectionObserver scroll-reveal pattern a
<noscript>fallback. Chart.js sa načíta iba na project-detail stránke cezextra_head - Detail-panel Issues to Address: nová kartička s farebným ľavým okrajom podľa severity, uppercase severity-pill, close-tlačidlo (×), tabular-nums štatistiky (affected/total · share · weight) a zoznam študentov ako hover-highlighted karty v responzívnom grid-e. Legenda ako pill-chips (namiesto kurzívy) pre konzistentnosť s ostatnými komponentmi
- Quick Access - informatívne položky: každá položka v bočnom paneli teraz zobrazuje traffic-light bodku poslednej compliance metriky, skóre v % a počet členov z
TeamMetricSnapshotnamiesto iba názvu (sidebar je teraz informatívny, nie dekoratívny) - Slovenský preklad UI - kompletné pokrytie: doplnených 99 chýbajúcich prekladov do
sk.json(chybové hlášky synchronizácie, dialógy potvrdení, toast správy, editor rubriky, stránka admin-users, user-info modal, reaktivácia projektu, CI scenáre). Nový audit skriptscripts/find_missing_translations.pyskenuje všetkyt(...)volania v JS a šablónach a hlási chýbajúce kľúče - zaradený do CI checklistu - Vlastné výnimky pre GitLab klienta: nová trieda
GitLabPaginationTruncatedError(podtriedaGitLabAPIError) - pagination-truncate už nevracia čiastočné dáta ticho, ale vyvolá výnimku, takže per-projecttry/exceptoznačí len tento jeden projekt ako zlyhaný a sweep ho neskôr zopakuje
Opravené
- Mobilná responzívnosť - tabuľky a profilová karta: (1) profile header na úzčku
.profile-identitynemalmin-width:0a odkaz "Zobraziť na GitLabe" pretáčal cez okraj karty na mobile - pridanéflex:1+min-width:0,overflow-wrap:anywhereaalign-self:flex-start+nowrapna link. (2) Tabuľka členov projektu mala na mene<td class="text-nowrap">, sticky koľonka sa preto roztáhla a prekrývala R01-R13 check-bunky - na mobile satext-nowrapprepíše nawhite-space:normal+max-width:14rem+ wrap badges. (3) Teams tabuľka kurzu (7 stĺpcov) skrýva tree-toggle a Last Updated stĺpec na mobile, aby Avg Score / Status / Actions boli viditeľné bez horizontálneho skrolu. (4) Check-bunky.check-pass/.check-fail/.check-naprepnuté navertical-align:middle- ikony už neleznia navrchu viacriadkovej bunky s menom - Klik na meno študenta v Issues to Address už neposkúva stránku na vrch:
scrollIntoViewskroloval aj externe ch-containery (viewport) prečo sa fixný topbar vizuálne presunúl. Teraz skrol cieli výhradne na.gl-page-contenta dopočítascrollTop + boundingRectposun, takže cieľový riadok presne centruje v scrolľovateľnej zone a okolité elementy (topbar, breadcrumb, sidebar) zostanú nehybné -
Týždenný compliance heatmap - historické týždne už nie sú prázdne: dve previazané chyby mazali minulé týždne pri synku. (a)
compliance.enginevbackfill_compliance_historyignoroval parameteras_of_weeka vždy písal aktuálne číslo týždňa doStudentComplianceSnapshot.week_number. (b)pilot_telemetry.capture_team_snapshotsposielal ON CONFLICT DO UPDATE so zbavenýmraw_metrics(bezchecks_detail), čím prepísal engine'om naplných 13 checkov na prázdne. Fix: engine rešpektujeas_of_week, telemetry sweep teraz odvodí kategorické skóre z_derive_category_scores(checks_detail)a do raw_metrics píše superset. 170 unit testov prehľto -
Issues to Address - kohorta priamych členov projektu: bola zoradená podľa
latest_computeds limitom 20, ale tých 20 riadkov boli tie isté tímy, čo už boli v karte Groups (team:project je ~1:1), takže po Python dedupe ostalo 0 projektov a karta vždy ukazovala prázdny stav. Teraz sateam_id NOT INtlačí do SQLWHERE, takže 5-row limit sa minie na tímy, ktoré NIE SÚ už v Groups; ak Groups pokrýva všetky tímy (≤5), fallback ukáže top-5 projektov bez ohľadu na duplicity - Course Analytics - automatické skrolovanie stránky pri načítaní: prvotné
selectWeek(currentWeek)volalopill.scrollIntoView({block:'nearest'}), čo prehliadače interpretovali ako vertikálne skrolovanie celého dokumentu (keď cieľ bol pod prvou obrazovkou). Teraz initial select preskakuje scroll (scrollPill:false), a user-driven klik používaweekPills.scrollBy({left, behavior:'smooth'})scoped iba na horizontálny pásik pill-ov - LLM modal - guard proti volaniu endpointov bez API kľúča: všetky LLM modály teraz kontrolujú feature flag aj prítomnosť API kľúča pred zobrazením a vracajú priateľskú chybu namiesto 500 z upstream volania
- GitLab 429 (rate limit) - tichá strata dát: po vyčerpaní retry-ov klient vracal
None, čo volajúci kód interpretoval ako "žiadne dáta" (404) - sync job sa označil akocompleteds chýbajúcimi issue/MR/pipeline záznamami, dashboard zobrazoval nesprávne metriky. Teraz vyvoláGitLabAPIError(429)sRetry-Afterv správe - GitLab pagination (10 000+ položiek) - tichá strata dát: pri dosiahnutí stropu
max_pages=100s plnou poslednou stránkou (čo znamená, že GitLab má viac dát) klient vracal čiastočný zoznam a len zalogoval warning. Dashboard po synchronizácii zobrazoval "completed" s podhodnotenými číslami. Teraz vyvoláGitLabPaginationTruncatedErrorso štruktúrovanými poliami (path,max_pages,items_fetched) pre Grafana alert - Webhook rate-limit IP spoofing (DoS): orphan-webhook rate limiter čítal
X-Forwarded-Forpriamo z hlavičiek a obchádzal trust-boundaryProxyHeadersMiddleware- útočník mohol rotovať spoofed IP pre obídenie limitu 10/min a zaplavenieorphan_webhook_events. Teraz sa používarequest.client.host, ktorý middleware už validoval vočitrusted_hosts - Webhook backpressure - tiché zlyhanie kontroly:
except: enqueue anywayticho skrývalo poruchy backpressure modulu / Redis outage. Fallback je zachovaný (best-effort enqueue), ale teraz sa logujelogger.warningsexc_info- operátori vidia degradovaný režim namiesto falošnej istoty - Globálny job bar - únik intervalu pri zatvorení karty:
_syncWatchdogId(5-sekundový polling/sync/active) sa nečistil vbeforeunloadhandleri - interval žil až do garbage collection po zatvorení karty alebo odhlásení. TerazclearIntervalspolu s_elapsedTimerId
[2026-04-21]
Zmenené
- Sync UI - jeden zdroj pravdy: odstránený redundantný inline info-card "Sync in progress" z overview, roster aj teachers záložiek - perzistentný globálny progress bar je teraz jediný indikátor synku, čím sa odstránili duplicitné UI flash-e a double-animation počas prechodov medzi stránkami (-312 riadkov mŕtveho UI kódu vrátane komponentu
SyncStatusBannera jeho pollerov) - Sync freshness guard (up-to-date kontrola):
POST /api/v1/courses/{id}/sync-allaPOST /api/v1/teams/{id}/syncteraz preskočia tímy, ktorých posledný úspešný sync skončil v 5-minútovom okne - odpoveď obsahujealready_fresh: N, single-team vraciastatus: "skipped_fresh";?force=trueobídete guard. Zabraňuje zahlteniu GitLab API pri opakovanom kliknutí na Sync All alebo pri paralelnom sledovaní kurzu viacerými učiteľmi. Frontend ponúkne force re-sync, ak sú všetky tímy čerstvé, namiesto tichého no-op-u
Opravené
- Globálny progress bar - objavenie aktívnych synkov na všetkých stránkach: nový endpoint
GET /api/v1/sync/activevráti prebiehajúce kurzové synky, ktoré globálny bar volá prirestoreGlobalJobBar()- bar sa teraz zobrazí aj na Admin -> Users / System / Dashboard, keď sync beží v inom tabe, zariadení alebo bol spustený plánovačom - Globálny progress bar - race conditions: odstránený tichý removal bar-u počas 2-sekundového restore okna, keď
/sync-statusdočasne vrátilhas_active_sync=falsepočas prechodu stavu; job má teraz flagserverConfirmedRunning, a silent-remove guard sa spúšťa len pre skutočné redirect-flash prípady - Issues to Address - kohorta priamych členov projektu: karta iterovala cez celý tímový zoznam (napr. 37/37) namiesto len priamych členov GitLab projektu (napr. 5/5) - live-data endpoint teraz volá
get_project_members(include_inherited=False)rovnako ako full-page render - Issues to Address - dynamická aktualizácia: karta sa teraz prerendrovuje pri každej zmene (vylúčenie, zmena roly, nový check run) cez server-side Jinja partial
- Issues to Address - syntetickí/zdedení členovia: učitelia, mentori, zdedení a syntetickí GitLab-only členovia sú vylúčení zo scorer kohorty
- CSS bleed systémové riešenie: globálne
details summary::beforepravidlá presunuté pod opt-in triedu.details-accordion; odstránená duplikátna unicode šípka ▶ zpages/course.css
[2026-04-20]
Pridané
- Comprehensive mobile responsiveness overhaul
- GitHub-style zebra tables + changelog sidebar widget
- Kompletný changelog zo všetkých 1347 commitov od vytvorenia repozitára
Opravené
- Auth resilience - login page for new users, next-URL preservation, crash protection
- Redesign OG image - clean centered layout for Google previews
- Prevent skeleton flash + lighten heavy table skeletons
- Rebuild bundles + ruff format auth.py (fix CI lint)
- Prevent zebra-stripe flash when toggling member filters
- Clean empty CSS ruleset + add restripeTable to no-paginator filter path
- Fully suppress transition on clickable rows during restripe
- Zebra tabuľky bez animácií - odstránenie transition na riadkoch, okamžitý hover (GitHub štýl)
- Propagate zebra/hover backgrounds to
<td>for overflow:hidden tables - Use solid opaque colors for table zebra stripes
- Remove opacity from row-page-enter animation to prevent color mixing during filter/pagination
Zmenené
- GitLab-style skeleton loaders - lighter, mixed with spinners
Infraštruktúra
- Code quality audit - var->let/const, dead code removal, cache fixes
[2026-04-13 - 2026-04-17]
Pridané
- Periodic team discovery sweep + lint fixes
- Email-based teacher/mentor detection + early sync progress
- Improve OG image + add skeleton loader to User Management
- Add peer mentor detection and filter
- Production-grade email notification system with retry queue
Opravené
- Email enrichment propagates to User + filter inherited teachers from contributors
- Whitelist contributor filter - show only team student commits
- Whitelist contributor counts on course/team dashboard too
- Remove deprecated code, fix labels, inherited members modal, subtle flash
- Resolve mypy arg-type errors in _stats.py narrowing
- Lower coverage threshold to 30, fix arena email caching and timeouts
- Replace asyncio.TimeoutError with builtin TimeoutError (ruff UP041)
- Add arena email fallback to single-user enrich, suppress global bar flash on redirect
- Auto-create User records for inherited members, remove teacher/mentor opacity
- Batch enrich Arena fallback, course count from groups, inherited member import
- Inherited member import, toast visibility, course cards in modal
- Course display with code/year/semester for membership-derived courses, add academic_year+semester to membership API, fix ruff-format
- Arena enrichment for User records during import, role badge for derived courses, elevate Arena logs to warning
- Mypy User.gitlab_username type + strip course name from card sync badge
- Stale sync after redeploy + smooth global bar entrance
- Create User records during member sync (not only on initial import)
- Ensure User record for existing active members during sync
- Limit User creation during sync to teachers only
- Enrich User emails from Student records and Arena during sync
- Sync_all discovers new teams + Arena enrichment shared httpx client
- Arena enrichment 30s per-request timeout, concurrency 2
- Update scheduler test counts for job #23 + cross-team project dup guard
- Pass course_id to sync worker for early progress toasts
- Add toasts to enrich button + welcome-back toast after login
- Reduce lazy skeleton reveal delay from 400ms to 150ms
- Rewrite admin users skeleton to match page structure + ruff format
- Remove corrupted duplicate in sk_admin_users skeleton
- Defer admin-users paginator/filter init for lazy-shell loading
- Skeleton pagination to match 3-column layout (info | buttons | per-page)
- Update all skeleton pagination to 3-column layout (info|buttons|per-page)
- Skeleton search width, pagination inside card-body, mobile dropdown clamping
- Dropdown portal right-aligned, support tickets skeleton structure
- Dropdown portal conflict with global handler - use data-gl-portal marker
- Keep per-page dropdown visible when pageSize=all so user can switch back
- Skeleton card structure, pagination DRY, pageSize localStorage cache
- Add per-page dropdown to admin/system Job History pagination
- Mobile responsiveness, optimize scheduler & telemetry
- Stop spinner reset and button color flash on mobile
- Pull-to-refresh false trigger on table scroll + toast reliability + lint
- Completion toast suppressed when global bar visible
- Ruff E501 in scheduler.py (line too long)
- Member table, enrichment gate, contributor exclusion
- Global bar dedup, contributor exclusion in project detail
- Complete mentor support across all views and scoring paths
- Exclude mentors from all student count queries
- Preserve is_mentor and excluded_from_scoring on team reassignment
- Increase worker heartbeat freshness window to match RQ TTL (420s)
- Enrich PRIVATE emails during sync and periodic sweep
- Member table bugs - filter empty state, badge count, sorting, inherited visibility, commit-based email enrichment
- Arena email enrichment, mentor badge, blue focus, progress bar course name, student count labels
- Dashboard Students stat now counts User accounts (matches admin breakdown)
- Deduplicate role badges, global bar flash, blue row selection
- Prevent global bar flash during skeleton loader phase
- Ruff-check unused import + ruff-format (fixes CI pipeline)
- Dashboard JS created duplicate at-risk badge using old class names
- Show more description text in course card (3-line clamp, no Jinja truncate)
- Global job bar hidden on team page when course sync is running
- Sorting/filter conflict + welcome email on first login
- Rebuild JS bundle for sorting/filter changes
- Correct CTA links in welcome emails (404 paths)
- Remove all emoji characters from email notifications
- Replace deforming loader icon with smooth circle spinner
- Show text status badges instead of dots in group activity table
- Prevent page-size dropdown from being clipped by pagination container
- Replace custom page-size dropdown with native select
- Restore custom page-size dropdown with fixed positioning
- Portal page-size dropdown to document.body to escape overflow
- Smart dropdown direction - open downward when space allows
- Remove unused Request import (ruff F401)
- Tabs overflow, footer theme, remove icons, accuracy fixes
- Tabs scroll + footer light theme with explicit colors
- Shorten tab names, remove tab icons, light footer, full-width tabs
- Footer light mode with !important to override Material theme
- Footer text/link colors visible in light mode
- Stronger no-store cache headers to prevent stale proxy/browser cache
- Job history table responsive headers + zebra striping on filter/sort
- Replace broken Sync Status modal with toast notifications
- Update tests for queue-based email system + fix ruff lint
Zmenené
- Replace var with const/Set/Map in JS, use begin_nested savepoints instead of rollback, add logger.debug for inherited member fetches, consolidate imports, fix line lengths
- Reuse ClientPaginator for admin Job History (server-side mode)
- Revert: remove commit-based email enrichment - Arena API already handles this
- Privacy: comprehensive GitLab-quality privacy statement with TOC, tables, GDPR rights, retention schedule, cookie details, supervisory authority
Bezpečnosť
- Fix header issues from security scan
- Add privacy policy page, CSP upgrade-insecure-requests, sitemap update
UI / UX
- Redesign: course card - clean layout like top companies
Infraštruktúra
- Config: pass EXCLUDED_CONTRIBUTOR_NAMES through docker-compose
- Config: remove unused ARENA_EMAIL_API_TOKEN from compose (endpoint is public)
Dokumentácia
- Comprehensive audit - fix counts, intervals, add 19 missing models
- Full documentation audit and actualization
- Move legal pages to docs-site, add student guide, open docs access
[2026-04-09 - 2026-04-12]
Pridané
- Smart stale data notifications with webhook activity detection
- Webhook attention items + fix activity feed showing team actions
- Premium Week Analytics with interactive Chart.js charts
- I18n: add 17 missing Slovak translations for Week Analytics
- Auto-expand current week in Week Analytics on page load
- I18n: add 87 missing Slovak translations
- Add Week Analytics skeleton loader to analytics page
- Redesign report generation form with component-based UI
- Simplify sub-project rows to links only, remove per-project metrics
- Detect template repos, unify team page contributor count
- Stale data warning banner for course and team pages
- Comprehensive i18n, job history improvements, LLM config diagnostics
- Expose Grafana/Prometheus/Jaeger via Caddy with basic auth
- Enrich Configuration Preview with detailed settings, LLM status, course metadata
- Install OpenTelemetry packages in Docker image and init tracing in workers
- GitLab-style course sub-navigation + update course configs
Opravené
- Enrich activity feed with background_jobs + fix audit commit in sync endpoints
- Ruff lint + format errors (line length, unused import, alias)
- Remove broken effective-start detection, replace weekly summary with week navigator
- Analytics & activity quality audit - responsive, empty states, data consistency
- Show empty state message in week bar chart when activity is 0
- Pill focus outline follows rounded shape
- Fully suppress rectangular focus outline on week pills
- Remove focus ring from week pills entirely
- Remove blue glow shadow from active week pill
- Ruff-format compliance + suppress stale-data toast on report generation
- Widen GitLab ID column, add webhook setup info to Event Pipeline page
- Smart webhook detection on events page, rebuild CSS bundle
- Use toast instead of alert banner for webhook warning on events page
- Code quality improvements across admin module
- CI pipeline failures - lint script, admin early-return in _session_caller
- Mobile responsiveness - activity tables scroll, instructors layout, danger zone overlap
- Redesign instructors mobile layout - CSS Grid 2-row compact (GitHub/GitLab style)
- Mobile responsive - students table scroll, sidebar overflow, compact action buttons
- Sidebar panel overflow:hidden, action buttons 32px matching btn base height
- Distinct icons for team actions - code for JSON, bar-chart-2 for Report
- Stretch action buttons evenly across full width on mobile
- Uniform 36px square buttons in mobile action toolbar
- Quick Access projects tab overflow + skeleton loader matches action toolbar
- Quick Access ellipsis - move overflow:hidden to list level, not item
- Quick Access ellipsis - remove negative margins, add overflow:hidden to .gl-qa-text
- Truncate long project paths server-side (45 chars) + display:block on qa spans
- Quick Access: filter empty/template teams, fix CSS text-overflow
- Use student_id instead of id in TeamMember count
- Add display:block + flex:1 for CSS text-overflow ellipsis in Quick Access
- Use width:0+flex-grow:1 for reliable text-overflow ellipsis, cap sidebar on mobile
- Commits table + heatmap mobile responsive, badge inline positioning
- Pin trivy to 0.62.1 (latest tag removed from Docker Hub), guard publish upload
- Team contributors count uses distinct commit authors for consistency with sub-projects
- Live-data and SSE endpoints also use distinct commit authors for contributor counts
- Show dash instead of 0% for projects with no resolved authors
- Resolve ruff lint errors - unused import and per-file-ignores for utility scripts
- Sub-projects inherit team avg score and traffic light when no commit authors resolved
- Hide stale-data banner when sync is already in progress
- Template detection now also checks author_gitlab_id against team students
- Exclude teachers from contributor counts + robust compliance chart loading
- Contributor count excludes teacher by name + compliance data_attrs as dict
- Mypy types, dedup teacher imports, improve group messages, quick access, compliance visuals
- Mypy list[Any] type, never-synced count uses sync status not metrics
- MR empty state msg, improve semester settings, remove review requirements card
- Align course configs with assignment requirements + fix sk.json broken quote
- Remove C01/C02 custom checks, fix weights to sum 1.00
- Resolve mypy and ruff lint errors in LLM status endpoint
- Monitoring proxy + code quality cleanup
- Rebuild CSS bundle (config-preview-details styles were missing)
- Config preview sub-items layout (flex-basis + baseline align)
- Hide AI Analysis Configuration card when LLM feature is disabled
- Support form dropdown clipped by overflow:hidden on .gh-category-fields
- Full monitoring stack - Grafana Failed to fetch, Jaeger DS, enhanced dashboard
- Remove orphaned duplicate alerts in alerts.yml
- Add basic_auth for Grafana metrics scraping by Prometheus
- Correct rq_failed_jobs metric name in dashboard and alerts
- Align DevOps config with ZSI, remove sergej.chodarev from teachers
- Rebuild CSS bundle from sources + fix ZSI description
- Update DevOps description with test (10b) + team project (10b)
- Align course descriptions with official kurzy.kpi pages
- Unify Refresh buttons across all course pages
- Unify dashboard header buttons - remove size='sm' to match course pages
- Break SSE read loop on done event to prevent spurious network error toast
- Remove extra closing brace that broke JS bundle parsing
- Break outer while loop in readImportSSEStream after done event
- Concurrent email enrichment + activity feed labels/dedup
- Remove commit sync date filter + fix CI lint + show 0 for empty sub-projects
- R08 and R13 no longer auto-pass with zero student activity
- Update R13 test to expect fail with zero commits
- Progress timer ticks every 1s + threshold labels positioned at actual percentages
- Send SSE done event before sync-enqueue to prevent network error toast
- Default member filter shows Direct + Inherited to match team contributor count
- Exclude inherited members from team student count on course overview
Zmenené
- Deduplicate components, consolidate JS utils, update docs
- Consolidate _lock alias into GP destructuring across 14 page JS files
- Deduplicate code patterns, validate thresholds, clean translations
- Unify contributor counts via shared _stats helper, remove fake per-project score fallback
- Lift tab nav to shell pages - instant tabs, ARIA a11y, keyboard nav, body-only skeletons
UI / UX
- Fix ruff-format for teams.py and reset_db_remote.py
Testy
- Force-show all 3 stale data scenarios for visual review
[2026-03-30 - 2026-04-04]
Pridané
- Search panel - mobile close btn, GitLab avatars, user->admin nav with auto-search
- PWA support + rewrite login animations (no conflicts)
- SSR-direct page entrance animation - staggered contentEnter for pages without skeleton loaders
- Edge-to-edge mobile cards + pull-to-refresh
- Comprehensive SEO - Google Search Console, OG, sitemap, robots.txt
- Comprehensive email notifications + refactor to shared template
- Non-anonymous tickets + auth-only submission + SMTP setup
- Add proper error handling for 401/session expired
- Wire support form skeleton + sys audit cleanup
- Add 346 missing Slovak translations for support, fix form overflow CSS, improve skeleton
- Support ticket system with comments, filters, and management\n\n- Add migration 031: ticket lifecycle columns (status, priority, category,\n assigned_to, resolved_at, updated_at) + support_comments table\n- Add SupportComment model with author, content, is_internal fields\n- Add ticket management API: PUT ticket, GET/POST comments\n- Add filtering by status/priority/category/search in ticket list\n- Rewrite support_tickets.html: filter bar, expandable detail rows,\n inline status/priority/category management, comments section\n- Replace all Unicode arrows with SVG icon components\n- Replace emojis with icon() macro calls throughout\n- Rename FEATURE_FEEDBACK_FORMS to FEATURE_SUPPORT_FORMS in docs\n- Update architecture doc: feedback.css -> support.css\n- Add btn_link_icon for back navigation and pagination controls\n- All linters pass (ruff, mypy), 2382 tests pass"
- GitHub-style support system redesign
- SSE real-time updates, email notifications, GitHub-identical UI
- Redesign support filters with animated selects + category-specific form fields
- Add alternating row backgrounds for visual consistency
- Ticket detail - component-based layout, assignee user search
- Dashboard integration - attention items, activity feed, sidebar badges, error page links
- Pass SMTP env vars through docker-compose to containers
- Component-based Subgroups & Projects table + Groups child rows
- Auto-enrich user profiles from GitLab after config import
- Persistent feedback links with CRUD, form picker, expiry, and link management
- Move Feedback Links to Feedback Forms page + gl-dropdown form picker + context default forms
- Add expand/collapse arrows to groups table with member preview
- Expandable tree view for team projects + UI fixes
- Arena email API fallback + filter bots from instructor lists
- Security hardening - secret rotation, per-user tokens, retired heuristic detectors, CSRF UA binding
Opravené
- Add PNG favicon for Google Search + shorten meta description
- Redirect /favicon.ico to PNG instead of SVG
- Slovak translations (podpora), mobile responsive improvements, email cleanup
- Login page mobile - keep desktop look (background, centered card)
- Ruff format + remove deploy job from CI pipeline
- Login language switcher 404 - use /dashboard/login path
- Login mobile - keep card contained like Keycloak (remove max-width:100%)
- Login mobile - full-screen card like Keycloak (edge-to-edge white, no dark bg)
- Login mobile - center content, visible lang selector on white bg
- SW CORS error on OAuth redirect - skip navigate requests
- Remove /dashboard/ from SW pre-cache - redirects to OAuth when unauthenticated
- Remove SSR entrance guard - caused blank page on slow connections
- Prevent skeleton flash on fast HTMX loads
- Mobile card styling + PTR indicator hidden by default
- Rewrite PTR to match GitLab blue circle design
- Rewrite PTR and mobile card styling (manual)
- Clean PTR rewrite - fix cancelable touchmove + Material spinner
- Instant mobile logout + suppress native PTR on login page
- Regenerate OG image with proper GitPulse branding
- Clean OG image rewrite - minimalist pixel-perfect layout
- Render login page for search-engine crawlers instead of OAuth redirect
- Detect Lighthouse/PageSpeed bot in crawler regex
- Ruff lint + accessibility (main landmark, color contrast)
- Allow HEAD method on SEO routes (robots.txt, sitemap.xml, verification)
- Restructure robots.txt - unblock /dashboard/login for Google
- Simplify robots.txt - remove dashboard disallow entirely
- Support HEAD on /dashboard/login + detect Google-InspectionTool
- CI mypy errors, remove sidebar badge, fix login lang auto-login
- Wire comprehensive email enrichment with GitLab API + Arena fallback
- Support form double toast, markdown preview, asterisk notice, email notification
- Proper double-toast fix (data-no-boundary), XSS prevention in markdown, hide info-card on success
- Rebuild JS bundle, fix mypy dict type in gitlab_group_import
- Remove temp SMTP scripts causing ruff lint failures
- Add Arena API token auth + Arena fallback in student enrichment
- Improve student enrichment with username search fallback
- Replace anonymous message with logged-in user info on support form
- Rebuild JS bundle and use proper 401 SVG from GitLab design
- Rewrite renderMarkdown() in support-form & ticket-detail
- Ticket comments 500, emails, comment permissions
- Duplicate comments, missing icons, email avatar, notifications, responsiveness
- Admin-system crash, duplicate emails, 401 UA mismatch
- SSE real-time timeline update, touch updated_at on comment, skeleton loaders
- Perfect 1:1 skeleton loaders for support pages, update email v4 with arena/SMTP/SSE changes
- Restrict textarea.form-input to vertical resize only
- Render info_card HTML correctly in support form (use call block)
- Complete feedback->support rename, fix .env config bug and data.feedback attribute bug
- CI lint failures + SSE security + dashboard auth guards + docs
- Support page layout to match standard dashboard structure
- Remove sidebar duplication, drop support/manage page, fix filter styling
- Full-width form, move info card, expand category-specific fields
- Improve support form - reorder notices, add padding, expand category fields
- Dropdown z-index/transparency bug - replace opacity transition with class-based enter/leave
- Add id=description to textarea and for=description to label (a11y)
- Correct RateLimitDep usage and add empty-string UUID validator for SupportCreate
- Tickets table matching admin pattern + dropdown transparency
- Rewrite support tickets page with proper table/filter components
- Cast UUID to string for tojson serialization
- Improve toolbar dropdown hover with button-like bg highlight
- Move filters to card header with search (User Management pattern)
- Use subtle rgba hover for data-table rows across all pages
- Ticket detail - proper two-column layout, fix sidebar overflow, self-contained assignee dropdown
- Alpine expression error, form corners, sidebar heading colors, assignee reload, responsive
- RenderMarkdown via vanilla JS init instead of Alpine expressions - prevents quote escaping errors
- Correct SSE endpoint URL - remove stale /sse/ prefix
- Enable assignee unassign + form accessibility (id/label)
- Change timeline labels to spans (no associated form field)
- Deep-link URLs, email notifications, assigned-by info, 403 page
- Harden teacher membership sync - upgrade student memberships, elevate User.role, enrich avatars
- Resolve ruff lint/format failures in teacher membership sync
- Course Teachers count includes admins, filter-pill descender clipping, config preview spacing
- Create User records for teacher_usernames during config import
- Ruff lint errors in reset_prod_db.py, tighter config preview spacing
- Section count toast mismatch + dashboard config preview spacing
- Add error handlers for unexpected scenarios + fix mismatches
- Active column width, unify config-import component
- Remove stale _fullConfig ref, add comprehensive config validations
- Pass disabledFeatures to config-import in course-settings
- Prevent SSE task cancellation after import commit + add keepalive pings
- Filter bot users from teacher discovery + clear config on import success
- Fast config import, modal close, admin-teacher filter
- Correct cell indices in course-detail.js (group names overwritten by member count)
- Student privacy - hide metrics, restrict profile access, fix tree layout
- Student profiles, LLM error display, table layout, global job bar coverage
- Clean LLM error display, role-appropriate suggestions, proper icon
- Error card dynamic injection + CI test fix
- Skip job history for zero-work scheduled jobs + fix mypy
- Groups child-row dashes, member name overflow, LLM error card bugs
- Restore Groups Status column + LLM error card delayed swap
- Build LLM error card client-side, show project last_synced_at, fix worker MissingGreenlet
- Per-project contributors, inline SVG icons, toast-delayed error card, dismiss empty state
- Error card delay 6s, per-project avg score, remove Active badge, single-MR retry
- Real per-project avg score, error card without toast, better error classification
- Role-based error messages + classify MissingGreenlet as transient
- MissingGreenlet root cause + role-based messages + MR links in analysis
- LLM error classifier order, global progress bar deferral, per-project status badges
- Replace en dash with hyphen in llm_job comment (ruff RUF003)
- Use forceCloseModal after successful import to avoid spurious Discard confirm
- Lint errors (ruff/mypy) + UI consistency for feedback links
- Cast UUID to text in feedback-links join to fix 503 error
- Add for attribute to form picker label (a11y)
- Fix Form picker dropdown not opening
- Align tokens and modals 1:1 with GitLab Pajamas
- Weekly deadlines table uses full width, no wasted space
- Align table th, toggle token, pagination padding to GitLab Pajamas
- Pixel-perfect GitLab Pajamas 1:1 alignment (round 5)
- Align backgrounds and borders with GitLab dark theme
- Remove max-width cap on main-container - content fills full page width
- Pixel-perfect GitLab Pajamas component alignment
- Align status dots, pagination radius, table padding, card/modal footer to GitLab
- Project links to internal pages, arena JSON API with identities
- Even column distribution across all tables (colgroups + table-layout:fixed)
- Ruff lint/format errors in arena_email (UP037, E501, N806)
- Show empty-state message when filter pills yield 0 results
- Hide pagination when filter yields 0 rows, clean empty-state styling
- Add !important to .d-none utility to override .pagination-controls display:flex
- Prevent scrollbar flash on table pages by deferring page-initialised with double-rAF and hiding pagination-controls pre-init
- Suppress row animation and lock container height during filter/sort to prevent scrollbar flash
- Add missing column width classes for compliance checks table and fix weekly deadlines layout
- Improve weekly deadlines table layout and prevent modal scrollbar flash
- Unify scrollbar styling across modals, drawers, tables to match main content
- Switch checksTable to auto layout on mobile to prevent column overflow
- Hide Active/Code columns on small mobile screens, constrain Actions column width
- Wire per-user token auth, fix ruff format, enable event pipeline
- Resolve ruff lint/format failures, rename remaining instructor refs in i18n, fixtures and docs
- Move Resurrect button right, fix duplicate toasts, let pagination stretch
- Move Resurrect Selected to card header top-right, footer only pagination
- Move pagination inside card body, hide in empty state
- Add table-empty-row class to all empty/loading/error rows, hide pagination in empty state
- Use table-empty-state with icon for empty DLQ, matching courses/users pages
- Map event.replay/resurrect/processed/failed in activity feed with icons, labels, details, URLs
- Align Configuration Preview icon, expose currentUsername to Alpine, fix modal close animation
- Configuration Preview spacing, add fg855ni to ZSI config, fix DLQ Type column wrapping
- Sync teacher_usernames from config import to CourseMembership
Zmenené
- Unified premium animation system - staggered entrance, no conflicts
- Zero-lag PTR - all passive listeners + rAF batching
- Audit fixes - deduplicate afterSwap handler, fix deploy script PS5.1 compat
- Comprehensive best-practice audit
- Audit: full system refactor - security, a11y, i18n, dedup, dead code
- Deep rename feedback->support across entire codebase
- Redesign: pixel-perfect GitHub Support UI with markdown editor, thread view, expanded categories
- GitHub-identical support UI - reply on top, reverse chronological comments, remove thread connectors
- Unify table styles and replace inline styles with CSS classes
- Ticket detail page - use page_header, remove custom action bar
- Simplify forms, fix dropdown, sortable table
- Rename Feedback subsystem to Support/Ticketing system
- Revert: undo UI changes
- Revert: restore to d03fd4f (align tokens and modals 1:1 with GitLab Pajamas)
- Unify role system (instructor->teacher), drop instructor_usernames column, R13 push enqueue
- Eliminate all 'instructor' terminology - rename to 'teacher' everywhere
UI / UX
- Align UI system to GitLab Pajamas design tokens
- Align remaining components to GitLab Pajamas
- Revert: restore main-container max-width layout
- Pixel-perfect GitLab Pajamas alignment - focus ring 1px/3px, form padding 8px/12px, line-height 1rem, triple-ring focus, card radius 8px, modal radius 12px, table cell 12px/16px
Infraštruktúra
- Remove test support script
- Remove temp verify_fix script
- Remove junk files and harden .gitignore
- Remove debug scripts
- Remove utility scripts with hardcoded credentials
Dokumentácia
- Comprehensive update - R13, 30 migrations, 2382 tests, CourseMembership
Testy
- Add unit tests for email notifications, api utils, constants, and type modules
[2026-03-23 - 2026-03-29]
Pridané
- Clickable member rows + context-aware back navigation
- Group members table navigates to project context
- Role separation - force logout on change, hide docs from students, fix attention items
- Suggest full sync after course settings save
- Redesign instructors page (GitLab-style invite bar + member rows)
- Real GitLab avatars + wider layout
- Clickable instructor rows with User Info modal, Owner badge
- GitLab-style Source & Role columns in member tables
- GitLab reference linkification + reduce member-api-note spacing
- Role-based sidebar + thesis feedback card
- Add R13 Commit Quality check - web editor detection
- Simplify: remove intervention list, risk groups, all groups; disable event pipeline/roster; add instructors lazy loading
- Redesign dashboard cards, header, timeline grid, profile menu
- Quick Access sidebar, health for teacher, scheduler feature-flag gating
- Single-user enrich button in User Info modal
- Comprehensive UX improvements from teacher review
- Add 295 missing Slovak translations
- Overhaul global search - students scope, role badges, direct links, docs
- Drastically reduce GitLab API polling - webhook-first approach
- Extend activity-window filter to ALL remaining GitLab polling jobs
- Webhook edge-case hardening - orphan projects, backpressure, immediate enrichment, delivery health
- System-wide resilience - sweep retry, pagination limit, Prometheus enrichment metrics
- Gate GitLab-polling sweep jobs through the scheduled-jobs master switch
Opravené
- Member profile - dynamic role title, no-activity guard, table scroll
- Member profile UX - back nav to group, instructor-aware empty states
- Prevent infinite login loop when allowlist user changes role
- Dashboard: fix status dots, reporter role warning, pipeline health overflow
- Fix CI lint + Groups 0: match Student by gitlab_user_id
- Fix OAuth: GitLabUser.id not gitlab_user_id
- Elevate dashboard role for course owners/instructors, remove redundant stat tooltip
- Rewrite modal CSS to match GitLab Pajamas exactly
- Silence editCheck console warning and aria-hidden focus conflict
- Quick Access shows real teams, System health enriched
- Quick Access Groups/Subgroups tabs, interactive timeline weeks, skeleton blue bar fix
- Lint errors (ruff/mypy), timeline semester_weeks order, project name display
- Sidebar layout, project names, timeline nav, telemetry gating
- Round avatars, attention link to course, instructor layout
- Avatar backgrounds hardcoded, groups sort by RED, instructor panels stretch
- Revert email, muted avatar colors 24px, restore email docs
- Language switch revert, new analytics favicon, DTA refs cleanup
- Cache-bust extra.js/css/favicon, reduce nginx cache, remove dead locale persistence
- Fix language revert, favicon flash, and canonical URLs
- Restore missing