{"id":"c1325","filename":"c1325_korak2_identitet_unifikacija.dok.json","weise3_id":"","tip":"dnk_unifikacija","naziv":"KORAK 2 — Identitet unifikacija: jedan kanon, auto-rpId prekidač, offline build-flag","kreator":"genesis","datum":"2026-06-12","snippet":"","status":"DONE","prev_weise3":"","bunker_l":"#00d4ff","full":{"tip":"dnk_unifikacija","naziv":"KORAK 2 — Identitet unifikacija: jedan kanon, auto-rpId prekidač, offline build-flag","status":"DONE","datum":"2026-06-12","master_plan":"MASTER_PLAN_dnk_cjelina (Korak 2 od 5)","dijagnoza_2_osi":{"os1_offline":"static/sucelje imaju offline (verifyEd25519Offline+vault), sdk/genesislogin/fenix nemaju","os2_webauthn_mod":"DIREKTNI (same-domain: static/sucelje/fenix) vs RELAY-popup (cross-domain: sdk/genesislogin) — biom-relay.html jer WebAuthn vezan za rpId","nijedan_fajl_nadskup":"static ima offline+direktni ali NE relay → 'kanon=static' bi slomio cross-domain biometriju"},"ispravak_pretpostavki":["Nalog rekao kanon=sdk → POGRESNO (sdk je podskup, fali 6 offline funkcija)","Faza A preporuka kanon=static → NEPOTPUNO (static nema relay)","Istina: kanon = UNIJA (static.offline + sdk.relay), prekidač bira mod"],"odluka_ivan":"Opcija B — samootkrivajući rpId iz server options-odgovora. Sef (.env GENESIS_RP_ID) OSTAJE ZATVOREN. Server=izvor istine, ne hardcode.","izvedeno":{"kanon":"static/genesis-auth.js = UNIJA (full: prekidač + offline)","prekidac":"registerDevice + device.login: _rpId iz options-odgovora (register→opcije.rp.id, auth→opcije.rpId), location.hostname===rpId || endsWith('.'+rpId) ? direktni() : relay()","grane_bajt_iste":"direktni()=static verbatim, relay()=sdk verbatim — ekstrakcija slice-ova, ne pretipkavanje","offline":"build-flag @profile:offline (2 trailing IIFE), online profil = kanon bez njega","generator":"scripts/build_genesis_auth.sh (forward), build_genesis_auth_MIGRATION.py (arhiva)"},"dokaz_faza_c":{"a_grane_bajt_iste":"4/4 (registerDevice+login × direktni+relay) == zivi static/sdk","b_prekidac_reproducira_mod":"genesis→direktni, fenix/limit-connect→direktni, genesislogin/tuda→relay (svaki = trenutni mod, 0 promjene ponasanja)","c_load_smoke":"full+online parse OK, core API 5/5, struktura exporta identicna zivom static","d_offline_kripto_netaknut":"verifyEd25519Offline+vault bajt-isti (150 linija) — kripto NE diran","rpId_data_level":"probe cita rpId tocno gdje server vraca — potvrdeno u webauthn_auth.py","zivi_server_servira":"curl /static/genesis-auth.js + /static/sdk/ → _direktni prisutan"},"deploy":{"full_402e1979":["static","sucelje"],"online_967afa72":["sdk","genesislogin","fenix-v3"],"netaknuti_namjenski":["tahograf (vlastiti Ed25519 device-flow)","memio (bezkriptni thin client)"],"konvergencija":"7 razlicitih md5 → 2 profila iz 1 kanona + 2 namjenski lite","backup":"*.bak_20260612 (svih 5)","dozvole":"www-data:www-data"},"rezidual_posten":"Zivi browser login test po proizvodu = preostala ljudska provjera (Chrome MCP nije spojen). Staticki dokaz (grane bajt-iste + prekidac reproducira mod) zamjenjuje ga po dogovoru Ivan. Rollback: *.bak_20260612.","sljedece":"KORAK 3 — Mesh ozivljavanje (genesis-mesh.js P2P, telefon↔telefon bez sidra)","zakon":"ZAKON 32 | ZAKON 40 (GenesisLogin jedini IdP) | crvena linija: zivi login nigdje slomljen"}}