{"id":"c1403","filename":"c1403_s1_liveness_gate_spaljivanje.dok.json","weise3_id":"","tip":"implementacija","naziv":"S1_liveness_gate_spaljivanje","kreator":"genesis","datum":"2026-06-15","snippet":"services/liveness_gate.py — Redis challenge/response (db=5, TTL=300s, jednokatran) · create_challenge(user_id) generira UUID token + 6-znamenkasti kod · verify_and_consume() — atomarna provjera + brisanje (one-time use)","status":"","prev_weise3":"","bunker_l":"#00d4ff","full":{"tip":"implementacija","naziv":"S1_liveness_gate_spaljivanje","chain":"c1403","prev":"c1401","datum":"2026-06-15","sustav":"fenix-v4","server":"MAR + EU","commit":"fca861c","sto_je_napravljeno":["services/liveness_gate.py — Redis challenge/response (db=5, TTL=300s, jednokatran)","create_challenge(user_id) generira UUID token + 6-znamenkasti kod","verify_and_consume() — atomarna provjera + brisanje (one-time use)","POST /api/v4/archive/liveness-izazov — endpoint bez tijela, samo auth","zahtjev-spaljivanja: liveness_token REQUIRED (422 ako nije poslan)","zahtjev-spaljivanja: krivi/istekli token -> 403 + Kapetan ALARM","zahtjev-spaljivanja: fix user.company_id bug -> _verify_member","suglasnost-spaljivanja: liveness_token opcionalan + fix company_id","list.html Korak 0: modal s prikazom 6-digit koda + gumb 'Potvrdim'","JS: _spaliLivenessLoad(), spaliLivenessPotvrdim(), 4-tockice dots"],"testovi":{"T_L1_liveness_izazov":"200 token+code PASS","T_L2_bez_tokena":"422 required PASS","T_L3_krivi_token":"403 S1 fail PASS","T_L4_ispravni_token":"200 zahtjev OK PASS","T_L5_one_time_use":"403 vec potroseno PASS","T_L6_redis_direktno":"key+TTL+user_id match PASS","smoke_9_od_9":"PASS"},"zakon":{"S1":"ZATVORENO — liveness gate aktivan na zahtjev-spaljivanja","ZAKON_41":"Nema tudjeg SDK — Redis + UUID, bez trece strane","Kapetan":"LIVENESS_MISS okidac: prijavi_liveness_miss + refleks ALARM"}}}