{"id":"c1145","filename":"c1145_ark_jezgra_pii_filter_ed25519.dok.json","weise3_id":"","tip":"arhitekturalna_odluka","naziv":"ARK jezgra: PII filtriranje + Ed25519 potpis za Bršljan gossip","kreator":"CC + Ivan Brtan","datum":"2026-05-27","snippet":"","status":"","prev_weise3":"","bunker_l":"#00d4ff","full":{"tip":"arhitekturalna_odluka","naziv":"ARK jezgra: PII filtriranje + Ed25519 potpis za Bršljan gossip","verzija":"1.0","datum":"2026-05-27","autor":"CC + Ivan Brtan","kontekst":"ARK (Autonomous Routing Kernel) — distribuirani identitet svake transakcije na svim čvorovima Bršljan mreže (EU/MAR/DE/ES/NEW/SHR). Problem: pusi_dokument slao cijeli .dok.json u gossip stream, uključujući OIB, ime klijenta, ZKI/JIR, resonance_proof, lat/lon. To je GDPR kršenje i sigurnosni propust.","odluke":{"§4_PII_opcija3":{"status":"IMPLEMENTIRANO","opis":"PII polja NIKAD ne napuštaju matični čvor kroz Bršljan gossip. Whitelist pristup — samo JEZGRA polja ulaze u distributed truth. Sve ostalo ostaje lokalno.","implementacija":"services/ark_pii_filter.py — filtriraj_bytes(tip, podaci_bytes)","wire":"brsljani.py pusi_dokument(weise3_id, podaci, tip='') — filtrira PRIJE gossipa","strippano_archive_doc":["company_id","uploaded_by","ocr_text","ai_extracted","resonance_proof","filename","file_size","content_type","layer1_sha256","layer2_phash","layer3_digest","status"],"strippano_invoice":["client_name","client_address","client_city","client_oib","client_email","client_vat_id","zki","jir","fiscal_time","fiscal_device_id","fiscal_operator_id","company_id","partner_id","profile_id","iban","internal_note"],"strippano_kanal_poruka":["sadrzaj","intent","procitano","procitano_at","meta","lat","lon","prilog_naziv"]},"§1_Ed25519_ark_potpis":{"status":"IMPLEMENTIRANO","opis":"Svaki ARK atom nosi pravi Ed25519 potpis (FenixVaultSeal). Potpis je matematički dokaz da je ovaj čvor vidio ova JEZGRA polja u ovom trenutku. Verifikacija offline bez mrežnog poziva (ZAKON 43).","algoritam":"Ed25519+SHA3-256 via services/fenix_vault.py potpisati_sadrzaj()","sto_se_potpisuje":"Canonical JSON JEZGRA polja (sort_keys=True, bez ark_potpis) — reproducibilan hash na svim čvorovima","javni_kljuc":"U svakom FenixVaultSeal.javni_kljuc — prima čvor može verificirati bez kontaktiranja matičnog čvora","backward_compat":"Ako tip='' (legacy pozivi), podaci prolaze nefiltriran. Nije BLOKER za deploy."}},"tipovi":{"archive_doc":{"jezgra":["weise3_id","bunker_seal_id","krunica_hash","created_at","cross_hash","category","doc_number","doc_date","doc_amount"],"ephemeral":[],"node_specific":["company_id","uploaded_by"],"adapter":["filename","file_size","content_type","ocr_text","ai_extracted","resonance_proof","layer1_sha256","layer2_phash","layer3_digest","status"]},"kanal_poruka":{"jezgra":["weise3_id","bunker_seal_id","krunica_hash","created_at","kontekst","ref_id","posiljatelj_w3","primatelj_w3","tip_poruke","atom_adresiran","prilog_w3","tip_uzbune"],"ephemeral":["atom_payload","expires_at"],"node_specific":[],"adapter":["sadrzaj","intent","procitano","procitano_at","meta","prilog_naziv","lat","lon"]},"invoice":{"jezgra":["weise3_id","bunker_seal_id","krunica_hash","created_at","number","doctype","country","total","subtotal","tax_amount","currency","date_issued","status"],"ephemeral":[],"node_specific":["client_oib","client_vat_id","zki","jir","fiscal_time","fiscal_device_id","fiscal_operator_id","company_id","partner_id"],"adapter":["client_name","client_address","client_city","client_email","iban","note","internal_note","view_count"]},"flf_session":{"jezgra":["weise3_id","bunker_seal_id","krunica_hash","created_at","session_id","title","ended_at","atom_count_a","atom_count_b","atom_count_c","atom_count_f"],"adapter":["creator","meta_json"]},"flf_atom":{"jezgra":["weise3_id","krunica_hash","created_at","t_ms","track"],"adapter_ne_replicirati":["data"]}},"otvoreno":{"gps_kanal":"lat/lon → nova tablica KanalGPSPing (TTL=15min), ne replicira se. TODO: migracija KanalPoruka.lat/lon → null + nova tablica.","p5_endpoint_spec":"GET /api/v1/brsljani/index mora vratiti krunica_hash u svakom indexu. Pull endpoint mora razlikovati jezgru u payload-u. Sprint zasebno.","pii_jurisdikcija":"Opcija 3 implementirana (PII nikad ne napušta čvor). Ako budemo trebali 'EU čvor svjedok HR fakture' → opcija 1 (country field routing). Za sada nije potrebno."},"fajlovi":{"novi":["/var/www/genesis/services/ark_pii_filter.py"],"patchirani":["/var/www/genesis/services/brsljani.py — pusi_dokument() + tip parametar"],"deploy":["EU","MAR","DE"]},"zakoni":["ZAKON_ARK_§4","ZAKON_ARK_§1","ZAKON_17","ZAKON_26","ZAKON_43"],"verifikacija":"ssh genesis-eu && cd /var/www/genesis && .venv/bin/python3 -c \"from services.ark_pii_filter import filtriraj_i_potpisi; r=filtriraj_i_potpisi('archive_doc', {'weise3_id': 'a'*64, 'krunica_hash': 'K', 'client_oib': 'PII', 'cross_hash': 'C'}); assert 'client_oib' not in r; assert 'ark_potpis' in r; print('OK')\""}}