{"id":"c1139","filename":"c1139_genesis_kanal_arhitektura.dok.json","weise3_id":"c1139","tip":"ARHITEKTURA_PLAN","naziv":"GenesisKanal — Poslovni chat sam sebi dovoljan","kreator":"CC + Ivan","datum":"2026-05-24","snippet":"","status":"PLAN — prije realizacije","prev_weise3":"","bunker_l":"#00d4ff","full":{"tip":"ARHITEKTURA_PLAN","naziv":"GenesisKanal — Poslovni chat sam sebi dovoljan","datum":"2026-05-24","autor":"CC + Ivan","status":"PLAN — prije realizacije","kontekst":"atom_adresiran.py je spreman (post-kvantna grupna enkripcija, BELA princip). Sada gradimo GenesisKanal — sloj koji veže sobe + poruke + atome + Brsljani sync. Nema Slacka, Teamsa, ni jednog tudeg alata.","nacel a":["ZAKON 41 — samo nasi resursi (kyber-py = open-source koji hostamo, WebCrypto = W3C native)","ZAKON 17 — WebSocket je klijent-server (OK), Brsljani je server-server pull (OK, ne krsi ZAKON 17)","ZAKON 2 — svaki dogadjaj u lancu (soba kreirana, poruka poslana = dokaz u chainu)","ZAKON 3 — trojna pohrana: krunica + dvorac + brsljani","BELA princip — neovlasteni vidi matematicku sjenku, ne gresku"],"arhitektura_cvorovi":{"backend":"genesis FastAPI (EU server, :8010) — sobe, poruke, kyber profili","realtime":"WebSocket na genesis — delivery za online clanove","persistence":"Brsljani P2P pull svakih 30s — offline clanovi, multi-node replikacija","kljucevi_javni":"genesis PostgreSQL — samo kyber_pk (javni kljuc)","kljucevi_privatni":"iskljucivo na klijentu — IndexedDB + WebCrypto AES-GCM enkriptiran"},"modeli":{"KanalSoba":{"soba_id":"WeisE3 hash (content-adresa od naziv+kreator+ts)","naziv":"ime sobe (max 120 znakova)","tip":"firma | tim | bilateralni | javni_kanal","kreator_wid":"weise3_id kreatora","clanovi":"JSON lista {clan_id, kyber_pk_hex, dodan_ts}","genesis_pecat":"ML-DSA potpis kreatora — dokaz postojanja","created_at":"auto","weise3_id":"ZAKON 27","bunker_seal_id":"ZAKON 27"},"KanalPoruka":{"poruka_id":"WeisE3 hash","soba_id":"FK na KanalSoba","posiljatelj_wid":"weise3_id posiljatelja","atom_json":"serializirani AdresiraniAtom (sifrat + omotnice + pecat)","tip":"tekst | prilog | dokument | racun | sistem","vel_bajta":"velicina sadrzaja (za UI preview)","pecat":"genesis_pecat: tko, kada, u lancu (dokazivo)","created_at":"auto","weise3_id":"ZAKON 27","bunker_seal_id":"ZAKON 27"},"KyberProfil":{"vlasnik_wid":"weise3_id vlasnika (FK na genesis profil)","kyber_pk_hex":"ML-KEM-768 javni kljuc (dijeli se slobodno)","uredaj_id":"fingerprint uredaja (multi-device podrska)","aktivan":"bool","created_at":"auto"}},"api_endpointi":{"POST /api/v1/kanal/soba/":"kreiraj sobu, dodaj kreatora kao prvog clana","GET /api/v1/kanal/soba/{soba_id}/":"detalji sobe (clanovi s kyber pk-evima)","POST /api/v1/kanal/soba/{soba_id}/clanovi/":"dodaj clana (treba njegov kyber_pk)","POST /api/v1/kanal/poruka/":"posalji poruku (body: AdresiraniAtom JSON)","GET /api/v1/kanal/soba/{soba_id}/poruke/":"povuci poruke (paginacija, pull za Brsljani)","GET /api/v1/kanal/profil/{wid}/kyber/":"dohvati javni kyber kljuc korisnika","POST /api/v1/kanal/profil/kyber/":"registriraj kyber_pk (klijent salje svoj javni kljuc)","WS /ws/kanal/{soba_id}":"WebSocket — real-time delivery za online clanove"},"websocket_tok":["klijent -> WS /ws/kanal/{soba_id}?genesis_token=... -> autentikacija","genesis -> pamti online clanove u Redis (genesis:kanal:online:{soba_id})","posiljatelj -> POST /api/v1/kanal/poruka/ -> server pohrani u DB","server -> broadcast atom_json svim online clanovima sobe via WS","offline klijent -> Brsljani pull ili direktni GET poruka na /api/v1/kanal/soba/{id}/poruke/"],"kljuc_management":{"generiranje":"browser WebCrypto ili kyber-py WASM — pri prvoj genesis prijavi","pohrana_sk":"IndexedDB klijenta, AES-GCM enkriptiran genesis passphrase-om","pohrana_pk":"genesis baza (javan, dijeli se slobodno za omotnice)","multi_device":"svaki uredaj = novi keypair, soba ih sve cuva u clanovi[]","gubitak_kljuca":"bez SK nema dekripcije — BELA. Moznost: key backup u genesis Vault (optional, opt-in)"},"brsljani_sync":{"sto_se_sinkronizira":"KanalSoba + KanalPoruka (atom_json je vec sifiran, sigurno za replikaciju)","interval":"pull svakih 30s (postojeci brsljani cron)","endpoint":"GET /api/v1/kanal/soba/{id}/poruke/?after_ts=... (standardna paginacija)","napomena":"poruka je sifirana — i na MAR, ES, DE cvorovima pohranjene su samo sifrirane omotnice. Ni cvor-operator ne moze citati sadrzaj."},"faze_realizacije":[{"naziv":"P0 — KyberProfil i kljucevi","zadaci":["model KyberProfil u genesis/models/","POST /api/v1/kanal/profil/kyber/ — klijent salje pk","GET /api/v1/kanal/profil/{wid}/kyber/ — dohvat pk-a za adresiraj()","browser: WebCrypto keygen ili kyber-py (WASM build)"],"napomena":"Bez ovoga nema omotnica. P0 je temelj svega."},{"naziv":"P1 — KanalSoba CRUD","zadaci":["model KanalSoba (soba_id WeisE3, tip, clanovi JSON, pecat)","API: kreiraj sobu, dodaj clana, detalji sobe","genesis_pecat pri kreiranju (ML-DSA potpis kreatora)","chain entry cNNNN_kanal_soba_{id}.dok.json"]},{"naziv":"P2 — KanalPoruka + atom_adresiran deploy","zadaci":["kopirati atom_adresiran.py u genesis/services/","model KanalPoruka (atom_json, pecat, tip)","POST /api/v1/kanal/poruka/ — prima atom ili sirov tekst (server adresiraj() za tekst)","GET paginiran"],"napomena":"atom_adresiran.py treba kyber-py. Provjerit da je u requirements."},{"naziv":"P3 — WebSocket real-time","zadaci":["FastAPI WebSocket handler na /ws/kanal/{soba_id}","Redis Set: genesis:kanal:online:{soba_id} — tko je spojen","broadcast na save poruke","heartbeat + graceful disconnect"]},{"naziv":"P4 — Frontend (fenix-v4, Alpine.js)","zadaci":["template: templates/kanal/soba.html — chat UI","Alpine.js: WebSocket konekcija, lista poruka, slanje","otkljucaj() na klijentu (kyber-py WASM ili pure JS port)","key generation flow pri prvoj prijavi","dark/light theme (ZAKON memory — obavezno)"]},{"naziv":"P5 — Brsljani sync + chain","zadaci":["pusi_dokument() za svaku novu sobu i vaznu poruku","Brsljani index endpoint za KanalPoruka","Folija watch na kanal module fajlove"]}],"sto_ne_gradimo":["end-to-end read receipts (kompleksno, V2)","video/voice pozivi (WASM WebRTC — posebna sesija)","public key infrastructure (koristimo genesis profil kao PKI)","push notifikacije (WebSocket je dovoljno za sada)"],"kyber_py_napomena":"kyber-py je referentna Python implementacija ML-KEM-768 (NIST FIPS 203). Za internu produkcijsku upotrebu prihvatljivo. Za third-party audit: zamijeniti s liboqs (OpenQuantumSafe) koji je certificiran. Planirati za V2.","zakoni":["ZAKON 2","ZAKON 3","ZAKON 17","ZAKON 27","ZAKON 37","ZAKON 41","ZAKON 43"],"prethodni_entry":"c1138_security_audit_p0_p1_p2_p3.dok.json","weise3_id":"c1139","created_at":"2026-05-24T15:20:00Z"}}