{"id":"c1137","filename":"c1137_krunica_chain_witness_hook.dok.json","weise3_id":"c1137_krunica_chain_witness_hook","tip":"implementacija","naziv":"Krunica chain prima TimeWitness — korak 3 iz c1135","kreator":"genesis","datum":"2026-05-24","snippet":"","status":"","prev_weise3":"","bunker_l":"#00d4ff","full":{"tip":"implementacija","naziv":"Krunica chain prima TimeWitness — korak 3 iz c1135","weise3_id":"c1137_krunica_chain_witness_hook","datum":"2026-05-24","nadovezuje_se_na":["c1135_time_witness_implementacija","c1136_dvorac_witness_integracija"],"sto_treba":"Krunica chain blokovi (ChainBlockORM) sada nose witness_hash + konsenzus + 3 timestamps u svom meta JSONB polju. Backward kompatibilno — pozivi bez witness_extension rade kao prije.","zasto":"C1135 implementirao TimeWitness (3 izvora). C1136 dodao .witness.json fajl uz svaku ciglu. Ali Krunica chain (DB-side append-only lanac) još nije nosio witness — kratki spoj između proof-on-disk i proof-in-chain. C1137 zatvara ovaj krug: svaki novi Krunica blok može imati witness u meta polju, nepromjenjivo kroz lanac.","implementacija":{"patch_lokacija":"/var/www/genesis/services/krunica_dvorac_sync.py","dodana_helper_funkcija":"_witness_meta(witness_extension) -> dict","izmijenjene_funkcije":["upisi_u_krunicu(...) → dodaje param witness_extension=None i upisuje meta u ChainBlockORM + podaci.witness u EntityORM","TrojnaPohrana.pohrani_async(...) → dodaje param witness_extension=None i forwardira u upisi_u_krunicu"],"meta_polja_u_chain_bloku":["witness_hash","witness_consensus (POUZDANO|SUMNJIVO|KRITICNO)","witness_max_delta (sekunde)","witness_countersigned (bool)","witness_t_local (ISO timestamp)","witness_t_ntp (ISO timestamp)","witness_t_tsa (ISO timestamp)","witness_schema (dvorac-witness-v1)"],"db_migracija_potrebna":false,"db_migracija_razlog":"ChainBlockORM.meta vec postoji kao JSONB default=dict — koristimo postojece polje"},"tehnicke_odluke":{"zasto_meta_a_ne_novi_table":"ChainBlockORM.meta je vec dizajniran kao opcijski indexable kontejner — dodavanje novog tablice (chain_witness) bi razdvojilo proof od bloka i dvostruko vise upita za read","zasto_samo_3_polja_a_ne_cijeli_extension":"Pun .witness.json (s DER bytes, RSA potpisima) ostaje na disku kao primarni dokaz. ChainBlockORM nosi samo izvuceno za brzu SQL pretragu (npr. WHERE meta->>'witness_consensus' = 'KRITICNO')","zasto_backward_kompatibilno":"Postojeci pozivi upisi_u_krunicu i pohrani_async ne moraju biti izmijenjeni — witness_extension je opcijski parametar. Zero blast radius za migraciju.","zasto_samo_prvi_uspjesan_ntp_tsa":"Lista NTP/TSA izvora moze biti dugacka, JSONB indeks bi rastao — uzimamo samo prvi success=True timestamp kao reprezentanta tog tier-a"},"testovi":{"fajl":"/var/www/genesis/tests/test_krunica_witness_hook.py","rezultat":"17/17 PASSED","pokrivenost":["1.1-1.7: _witness_meta() ekstrakcija (cista funkcija, bez DB)","2.1-2.3: skip neuspjesnih NTP/TSA izvora","3.1-3.5: end-to-end Krunica chain entry s witness — stvarna baza","4.1-4.2: backward kompatibilnost — pozivi bez witness_extension rade i meta ostaje prazan"]},"sljedeci_koraci":{"korak_4_wire_up_genesis_login":{"fajl":"/var/www/genesis/api/genesis_login.py","opis":"Genesis login endpoint trenutno zove pohrani_async bez witness_extension — treba dodati enrich_cigla_with_witness poziv prije i forwardirati ext","rizik":"Mijenja produkcijski auth flow — treba kontrolirani staged rollout (najprije za novi /v2 endpoint, pa migracija)","ulagac_odluke":"Ivan (kada zelimo aktivirati witness za login — sad infrastruktura spremna)"},"korak_5_key_registry":{"opis":"Napad 8 iz c1135 testiranja: sender_pub moze biti bilo ciji — treba trusted registry (weise3_id -> public_key) da verifier zna da je alice_pub stvarno Alicin","veza_s_brsljanom":"Registry je P2P gossipan kroz Brsljan mrezu — svaki cvor ima isti pogled na pub_key registar","veza_s_genesis_loginom":"Genesis login je vec identity provider — moze biti pravi izvor istine za weise3_id <-> public_key par"},"korak_6_automatska_enrichment_hook":{"fajl":"ZivaCigla.kreiraj() u dvorac.py (v40 production)","opis":"Opcijski parametar `with_witness=True` na kreaciji cigle koji automatski poziva enrich_cigla_with_witness + save_witness_json","trenutno":"Trenutno enrichment je rucan — explicit poziv u api endpointu nakon kreacije cigle"}},"kratki_kod_primjer":{"stari_poziv":"block_hash = await upisi_u_krunicu(db, w3id, sadrzaj, kreator, tip, prev_hash, kljuc)","novi_poziv_s_witness":"ext = enrich_cigla_with_witness(cigla, sender_priv=..., sender_pub=...)\nblock_hash = await upisi_u_krunicu(db, w3id, sadrzaj, kreator, tip, prev_hash, kljuc, witness_extension=ext)","sql_provjera_chain_bloka":"SELECT meta->>'witness_consensus' AS konsenzus, meta->>'witness_hash' AS hash, meta->>'witness_t_tsa' AS tsa_ts FROM chain_blocks WHERE weise3_id = '...'"},"zakon":"ZAKON 17 (Bršljan PULL only) + ZAKON 26 (schema contract — meta polja imenovana eksplicitno) + ZAKON 32 (svaki fix ima chain entry)","promatraci":["Ivan Brtan (vlasnik, dao naredbu 'ne mozemo graditi digitalnu arhivu na lazima')","Opus (analiza propusta — krunica chain nije nosio witness)","CC Sonnet (implementacija c1135 -> c1136 -> c1137 lanac)"],"citacija":"Trojna pohrana sad je zaista trojna: Krunica zna kad i tko, Dvorac zna sto i kako, Brsljani znaju gdje. Witness je sad u svakom od tri sloja, kao Krunica koja je svugdje (ZAKON 43)."}}