{"id":"c1330","filename":"c1330_brsljani_webrtc_p2p_k3.dok.json","weise3_id":"","tip":"zadatak","naziv":"K3 Sprint 4 — WebRTC P2P browser-to-browser gossip + LAN/WiFi Direct mode","kreator":"genesis","datum":"2026-06-13","snippet":"","status":"DONE","prev_weise3":"","bunker_l":"#00d4ff","full":{"tip":"zadatak","naziv":"K3 Sprint 4 — WebRTC P2P browser-to-browser gossip + LAN/WiFi Direct mode","sto_treba":"Implementirati Tier-0 P2P sloj za Bršljan mrežu. Browser čvorovi komuniciraju direktno bez servera nakon WebRTC handshakea. LAN/WiFi Direct mode: iceServers=[] (samo host kandidati, bez STUN) — radi na istoj WiFi mreži bez cloud-a.","faze":["F1: signaling endpoint (POST/GET /api/v4/kanal/p2p/signal) — Redis ephemeral TTL=120s","F2: brsljani-p2p.js u fenix-v4 static — LAN mode + STUN fallback, ZAKON 17 PULL-ONLY gossip","F3: brsljani-node.js v4.0.0 — _initP2P(), gossipAtom(), fetchAtomP2P()","F4: deploy MAR + smoke test"],"zakon":["ZAKON_17","ZAKON_41","ZAKON_43","ZAKON_27"],"arhitektura":{"LAN_mode":"RTCPeerConnection({iceServers:[]}) — samo host ICE kandidati, radi na istoj WiFi mreži bez STUN-a","STUN_fallback":"RTCPeerConnection({iceServers:[stun:stun.l.google.com:19302]}) — cross-network","signaling":"Redis HASH genesis:rtc:signal:{target_wid}, TTL=120s, poll svakih 2s","gossip":"ATOM_OFFER → ATOM_WANT → ATOM_PUSH (deduplicirano, Krunica verify lokalno)","zakon_17":"Browser NIKAD ne pushuje između browser-čvorova — signal server je jedino što prima POST","wifi_direct":"Na istoj LAN mreži: WebRTC ICE host candidates = lokalne IP adrese = direktna veza bez cloud-a"},"status":"DONE","chain":"c1330","datum":"2026-06-13","commit":"7bb7a00","dokaz":{"POST /api/v4/kanal/p2p/signal":"{\"ok\":true,\"queued\":true}","GET /api/v4/kanal/p2p/signal?target=X":"{\"signals\":[{...}],\"count\":1}","drugi_poll":"{\"signals\":[],\"count\":0}  # atomarno brisanje OK","brsljani-p2p.js":"417 linija — v1.0.0","brsljani-node.js":"460 linija — v4.0.0","brsljani-sw.js":"HTTP 200 + Service-Worker-Allowed: /"}}}