{"id":"c0959","filename":"c0959_arhiva_top3_popravka.dok.json","weise3_id":"","tip":"fix","naziv":"Arhiva globalni modul — top 3 hitne popravke","kreator":"CC + Ivan","datum":"2026-05-18","snippet":"","status":"","prev_weise3":"","bunker_l":"#00d4ff","full":{"tip":"fix","naziv":"Arhiva globalni modul — top 3 hitne popravke","sustav":"fenix-v3","datum":"2026-05-18","git_commit":"d51d8ad","autor":"CC + Ivan","zakon":["ZAKON_3","ZAKON_29","ZAKON_28"],"sto_treba":"Tri kritična buga identificirana analizom arhiva modula moraju biti popravljena i deployirana na produkciju (MAR server).","faze":[{"id":1,"naziv":"Fix 1 — Trojna pohrana za TempArhivaEntry","fajl":"arhiva/tasks.py","linija":579,"status":"DONE","opis":"temp_arhiva_ocr_task je koristio direktni pohrani_u_genesis() — samo Noga 1 (Genesis ChainBlock). Zamijenjen s pohrani_trojka() koji aktivira sve 3 noge: Noga1=Genesis, Noga2=.dokarh bundle, Noga3=Brsljani gossip. trojka_ok i trojka_status se sada persistiraju na TempArhivaEntry modelu.","zakon":"ZAKON_3","stari_kod":"pohrani_u_genesis(_raw, entry.file_name, kreator, 'ostalo')","novi_kod":"pohrani_trojka(entry, _raw_trojka)"},{"id":2,"naziv":"Fix 2 — BgRemoveView rate limit (ZAKON 29)","fajl":"arhiva/views_pwa_beta.py","linija":237,"status":"DONE","opis":"BgRemoveView je bio javni endpoint bez rate limitinga — vektor CPU/bandwidth abusa. Dodan _check_rate_limit(): 10 zahtjeva po IP-u na 60 sekundi via Django cache (Redis). X-Forwarded-For podrška za pravi IP iza nginx-a. Prekoračenje vraća HTTP 429.","zakon":"ZAKON_29","parametri":{"RATE_LIMIT":10,"RATE_WINDOW_SEC":60,"cache_key_format":"bgrm_rl:{ip}","http_status_over_limit":429}},{"id":3,"naziv":"Fix 3 — _BetaUploadAdapter.layer1_sha256 SHA-256 izračun","fajl":"arhiva/services/trojna_pohrana.py","linija":183,"status":"DONE","opis":"_BetaUploadAdapter.layer1_sha256 je uvijek vraćao prazan string — BetaUploadEntry bio bez fingerprinta u trojnoj pohrani. Sada property: (1) čita iz entry.layer1_sha256 ako postoji, (2) izračuna hashlib.sha256() iz original_file, (3) persistira na model via update_fields za buduće pozive.","zakon":"ZAKON_3","detalj":"Lazy compute + persist pattern — idempotentno, bez duplikata"}],"deploy":{"eu_server":"izmjena lokalna (EU = dev mirror)","mar_server":"rsync + systemctl restart gunicorn-fenix-v3.service → active","syntax_check":"python3 -m py_compile — sve 3 datoteke OK prije deploya"},"analiza_kontekst":"Popravke su rezultat sustavne analize arhiva modula po 8 kategorija (prosjek 7.7/10). Top 3 hitna prijetnja: nepotpuna trojka pohrana za PWA korisnike, javni CPU endpoint bez zaštite, missing SHA-256 fingerprint u dokarh bundle.","regresija":"Nema — sve 3 izmjene su additive/replacement s graceful degradation. Gunicorn restart bez downtime-a (< 2s).","sljedeci_korak":"Pokrenuti ZAKON.py provjeru Zakon 10+11 na MAR-u. Dodati test za trojka pohrana TempArhivaEntry flow."}}