{"id":"c0019","filename":"c0019_plan_borg_asimilacija.dok.json","weise3_id":"bd4083ea4b69cdea13cd12fcc126fb85da17c19c9d7d9aa2989bf529b0091740","tip":"mrezni_plan_borg","naziv":"c0019 — BORG ASIMILACIJA (supersede c0018: push → pull-based health protokol)","kreator":"CC","datum":"2026-05-03T06:35:48.203790+00:00","snippet":"","status":"","prev_weise3":"","bunker_l":"#7362b8","full":{"tip":"mrezni_plan_borg","kreator":"CC","nastao":"2026-05-03T06:35:48.203790+00:00","naziv":"c0019 — BORG ASIMILACIJA (supersede c0018: push → pull-based health protokol)","prev_chain":"c0018_plan_raspad_centra.dok.json","supersede":{"razlog":"c0018 je dizajniran s push-on-write i scheduler-push. Filozofski krivo.","ispravak":"BORG: nitko ne šalje. Svaki čvor zna sebe. Čita druge. Pali vatru kad treba.","stari_w3":"9c816b4d61ec836d280363da7a4d4301ed3a219f5162e526f26f3bc25ca9f64a","stari_naziv":"c0018 — RASPAD CENTRA"},"filozofija_borg":{"princip_1":"MI SMO JEDNO. Kad smo zdravi, dijelimo (zbrojeni resursi).","princip_2":"SVAKI JE SEBI SUDAC. Ne čekaj da te netko pita — sam si procjenjuješ zdravlje.","princip_3":"ČITAJ, NE ŠALJI. Push šum mreže. Pull znanje stiže točno kad treba.","princip_4":"VATRA KAD JE ZLO. Ako sam bolestan — javno pišem alarm.json. Svi vide.","princip_5":"ZBROJ JE ISTINA. /health vraća stanje cijele mreže, ne samo mene.","princip_6":"ASIMILACIJA NIJE GUTANJE. Asimilacija je dijeljenje — kapaciteta, dokumenata, otpornosti.","izjava":"Kad se male ruke slože, sve se može."},"razlika_od_c0018":{"c0018_je_govorio":["push-on-write (asyncio.create_task push_to_peers)","scheduler push svakih 60s","Node 2 cron POST nove dokumente","active gossip s hop_count broadcast"],"c0019_govori":["Nikakav push. Nikakvi impulsi.","Svaki čvor svakih 30s piše svoj health.json (sebe-procjena)","Svaki čvor svakih 30s ČITA tuđe health.json (pull)","Sync se događa SAM od sebe: vidim da ti imaš X koji ja nemam → ja povučem X","Bolest = pišem alarm.json. Drugi ga čitaju i znaju.","/health = pogled na CIJELU mrežu, ne samo mene"],"zašto_je_borg_bolji":["Nema race conditiona (svaki je sam svoje istina)","Nema push storma (P2P mreže umiru od push spam-a)","Nema split-brain (čitanje je idempotentno)","Lakše skalira (10 čvorova = 10 health.json datoteka, nije 10² push veza)","Lakše debug-a (sve je javno čitljivo, statično)","Gracefully degrades (bolesni čvor pali vatru, drugi ga zaobiđu)"]},"borg_protokol_specifikacija":{"schema_health_json":{"agent_id":"fac896532b14a4ea  (16 hex)","url":"https://genesis.limit-connect.com","vrijeme":"ISO 8601 UTC (kad je zadnji put pisano)","uptime_sec":86400,"stanje":"ok | degraded | alarm","dok_count":2448,"last_block_hash":"8a03977ab0a11d02...","lanac_visina":2448,"disk_free_pct":73,"disk_free_mb":12500,"memory_free_mb":1024,"load_avg_1m":0.42,"verzija":"borg-1.0","peers_poznati":["c75159810bc65674","..."],"peers_zdravi":["c75159810bc65674"],"peers_bolesni":[],"peers_nepoznati":[],"vatre":[],"_opp_seal":"...","block_hash":"..."},"schema_alarm_json":{"agent_id":"fac896532b14a4ea","vrijeme":"ISO 8601 UTC","ozbiljnost":"warning | critical","razlog":"disk_full | sync_lag | peer_lost | corruption | overload","detalji":"Disk free 4% (alarm prag: 5%)","predlog":"Pokreni B2 snapshot, počisti stare backup-e.","trajanje_sec":0,"_opp_seal":"..."},"schema_health_endpoint":{"url":"/api/v1/borg/health (i /borg/health.json statički)","vraca":{"ja":"moj health.json","peeri":"popis tuđih health.json (cached)","ukupno_dok":"sum(svaki.dok_count)","stanje_mreže":"ok | degraded | alarm (max ozbiljnost svih)","vatre":"popis aktivnih alarm.json zapisa","kapacitet_mreže":"sum(disk_free_mb), sum(memory_free_mb)","konsenzus":"do koje block_hash visine se svi slažu","divergencija":"popis čvorova koji su 'iza' konsenzusa"}},"self_check_funkcije":["disk_free_pct() — < 5% → vatra critical, < 15% → warning","sync_lag_sec() — last_seen vs zadnji block u lancu, > 5min → warning","peer_health() — koliko poznatih peera nije odgovorio za 5min","lanac_integritet() — uzorkovati 10 random blokova, provjeriti hash","memory_pressure() — < 100MB free → vatra warning","endpoint_reachable() — /api/v1/brsljani/ping na sebi → mora 200 OK"]},"faze_borg":[{"faza":1,"naziv":"BORG self-check modul (Genesis)","cilj":"Genesis svakih 30s piše health.json, prepoznaje sam sebe","koraci":{"1.1":"services/borg.py — self_check() vraća sve metrike","1.2":"Cron: */30 sec → python3 -m services.borg.write_health (ili async task u glavnoj appliciji)","1.3":"Output: /var/www/genesis/borg/health.json (javno čitljivo preko nginx)","1.4":"Ako nije ok → /var/www/genesis/borg/alarm.json (publishan istovremeno)","1.5":"Svaki health.json IDE U KRUNICU kao snapshot.health blok (D9 svjedok)"},"trajanje":"4 sata","acceptance":["curl https://genesis.limit-connect.com/borg/health.json → recent JSON","Ručno popuni disk → unutar 30s health.stanje=alarm + /borg/alarm.json postoji","Vrati disk → unutar 30s alarm nestane, stanje=ok"]},{"faza":2,"naziv":"BORG self-check (Node 2 PHP)","cilj":"Node 2 piše svoj health.json bez ovisnosti o Genesis","koraci":{"2.1":"borg_health.php — disk space, dok_count, peer status","2.2":"Cron */30 sec → /var/www/grosmarkt/brsljani/borg/health.json","2.3":"Isti schema kao Genesis (interoperabilan)","2.4":"Alarm logika ista (disk, sync_lag, peer_lost)","2.5":"Endpoint /brsljani/borg/health.json javno"},"trajanje":"3 sata"},{"faza":3,"naziv":"Mutual reading (čitamo se međusobno)","cilj":"Svaki čvor zna stanje svih drugih, bez slanja","koraci":{"3.1":"Genesis: services/borg.py read_peers() svakih 30s GET-a sve poznate /borg/health.json","3.2":"Cache lokalno: /var/www/genesis/borg/peers/<agent_id>.json (stale ako > 2min)","3.3":"Ako peer.health unreachable 3 puta → označi peer.bolestan u svom health-u","3.4":"Node 2 PHP: isti pull mehanizam (curl every 30s)","3.5":"Nema autentikacije — health.json je javan dokument (kao i sve ostalo u Bršljanu)"},"trajanje":"4 sata","acceptance":["Genesis health.json sadrži peers.zdravi: [Node2_agent_id]","Ugasi Node 2 → unutar 90s Genesis health pokazuje peers.bolesni: [Node2]","Vrati Node 2 → unutar 60s vraća se u peers.zdravi"]},{"faza":4,"naziv":"Pull-based sync (umjesto push)","cilj":"Sync se događa AUTOMATSKI iz pravila čitanja","koraci":{"4.1":"Kad Genesis pročita Node2.health i vidi: Node2.last_block_hash != Genesis.last_block_hash","4.2":"Genesis pita Node2.GET /api/v1/brsljani/index → dobije listu svih weise3_id-ova","4.3":"Diff: Node2.ids - Genesis.ids = nedostaje_na_geneis","4.4":"Genesis povlači batch (max 50/min) iz Node2.GET /api/v1/brsljani/dok/{id}","4.5":"Hash verifikacija pri primanju (sha3_256(podaci) == weise3_id)","4.6":"Isti algoritam s Node 2 strane — pull, ne push","4.7":"Idempotentno: ako weise3_id već imamo, preskoči"},"trajanje":"1 dan","acceptance":["Upload na Node 2 → Node2.health pokazuje novi last_block_hash → Genesis primijeti → povuče u <90s","Upload na Genesis → Genesis.health azuriran → Node 2 primijeti → povuče u <90s","Race test: 100 dokumenata istovremeno na 2 čvora → svi sync nakon 5 min, nikakav duplikat"]},{"faza":5,"naziv":"Vatra protokol (alarm signalizacija)","cilj":"Bolesni čvor pali vatru — svi vide, svi reagiraju","koraci":{"5.1":"Kad self_check() vraća stanje != ok → write alarm.json","5.2":"Alarm.json = poseban .dokarh blok u Krunici (D9 svjedok + opp_seal)","5.3":"Drugi čvori pri pull-anju health vide alarm popis u peer.vatre[]","5.4":"Status dashboard pali crveni LED za bolesni čvor","5.5":"Eskalacija: critical alarm → email/SMS/WhatsApp Ivanu (best-effort, ne blokira)","5.6":"Self-healing kandidati: low disk → auto-clean stari logovi, pre alarm"},"trajanje":"1 dan","acceptance":["Simuliraj disk full na Genesis → vatra pali se → Node 2.health pokazuje peers.bolesni","Status dashboard automatski crveni","Ivan dobiva WhatsApp 'Genesis vatra: disk_full' (best-effort)"]},{"faza":6,"naziv":"Asimilacija — zbrojeni resursi (Borg jedinstvo)","cilj":"Kad svi zdravi, mreža se ponaša kao jedan organizam","koraci":{"6.1":"/health vraća: ukupno_dok = sum(svi.dok_count)","6.2":"/health vraća: kapacitet = sum(svi.disk_free_mb)","6.3":"/health vraća: konsenzus_visina = min(svi.lanac_visina) — do kuda se SVI slažu","6.4":"Ako Node 1 zatraži dokument koji nema → automatski ga pita Node 2 (već imamo u resolveru)","6.5":"Ako jedan čvor preopterećen → drugi preuzima neke fetch zahtjeve (load distribution)","6.6":"Ako jedan padne — drugi servira 100% (failover transparentan klijentu, FAZA 3 c0018)"},"trajanje":"2 dana"},{"faza":7,"naziv":"Borg pogled — javni status dashboard","cilj":"Svatko vidi mrežu kao jedan organizam","url":"https://genesis.limit-connect.com/borg (i grosmarkt-online.eu/brsljani/borg)","koraci":{"7.1":"Server-side render: 2 kartice (po čvor), zelena/žuta/crvena LED","7.2":"Header: 'MI SMO BORG' + ukupan dok_count + ukupan kapacitet","7.3":"Vatre stream: realtime alarmi (zadnjih 24h)","7.4":"Konsenzus widget: do koje block_hash visine smo SVI sigurni","7.5":"Klikni čvor → vidiš njegov health.json u syntax-highlighted JSON"},"trajanje":"1 dan"},{"faza":8,"naziv":"Browser kao Borg-Lite (PWA, drugi krug)","cilj":"Browser piše svoj health, čita druge — punopravan član tkiva","koraci":{"8.1":"Service Worker — cache app shell + borg-lite.js","8.2":"IndexedDB — borg.health, borg.peers cache, borg.lanac","8.3":"Browser self-check: storage quota, navigator.connection, last_sync_age","8.4":"Browser alarm: 'offline > 7 dana' → poziv na sync","8.5":"Browser ne objavljuje health javno (privatnost), ali ZNA gdje stoji","8.6":"WebRTC peer discovery — kad dva uređaja na istoj WiFi, lokalni mini-sync"},"trajanje":"3 dana"}],"metrika_uspjeha_borg":{"self_check_frekvencija":{"cilj":"30s","alarm_ako":"> 90s"},"mutual_read_lag":{"cilj":"< 60s","alarm_ako":"> 3min"},"vatra_response_time":{"cilj":"< 30s od pojave do svih čvorova"},"konsenzus_lag":{"cilj":"< 5 blokova razlike","alarm_ako":"> 50"},"asimilacija_test":{"cilj":"Pad jednog čvora → 0% gubitka servisa"},"vatra_javnost":{"cilj":"100% alarmi su javno čitljivi (CC0 transparentnost)"}},"redoslijed_borg_tjedan_1":["PON: FAZA 1 (Genesis self-check + write health.json)","UTO: FAZA 2 (Node 2 PHP self-check) + FAZA 3 (mutual reading start)","SRI: FAZA 3 dovršenje + FAZA 4 (pull-based sync)","ČET: FAZA 5 (vatra protokol) + FAZA 7 početak (dashboard skeleton)","PET: FAZA 6 (asimilacija /health endpoint) + FAZA 7 dovršenje","SUB: smoke testovi, alarm scenarios","NED: prvi Borg dashboard pokazuje oba čvora kao 'jedno tkivo'"],"redoslijed_borg_tjedan_2":["FAZA 8 (Browser kao Borg-Lite — PWA s vlastitim health-om)","Treći serverski čvor (B2 mirror) ulazi u Borg","Chaos test prvi: ugasi Genesis 1h, Borg dashboard mora se obojiti, Node 2 mora servirati 100%"],"implementacija_konkretno_sad":["services/borg.py NEW — self_check, write_health, read_peers, aggregate_network","api/borg.py NEW — /api/v1/borg/health endpoint koji vraća asimiliranu sliku","borg/health.json (statički cache fajl, regeneriran cron-om)","borg/peers/<agent_id>.json (cached snapshots tuđih health-a)","borg/alarm.json (kreiran samo kad nije ok)","borg/borg_health.php — Node 2 ekvivalent (Ivanov side)","templates/borg/dashboard.html — javni Borg pregled mreže"],"definitivno_NE_treba":["WebSocket impuls notifikacije — pull svakih 30s je dovoljan","Centralni health agregator — svaki čvor sam zna sve","Push notifikacije među čvorovima — JEDINO push je vatra Ivanu kad je critical","Konsenzus algoritam (Raft, Paxos) — append-only chain ne treba","Zaštita od neprijateljskih čvorova — sad pretpostavljamo poštene; BFT u FAZI 9 ako bude potrebno"],"borg_je_genesis_jer":["1. Svaki čvor je suveren (kao što je svaki .dokarh suveren — weise3_id ga čini neovisnim)","2. Čitanje, ne slanje (kao što je verify pull, ne push)","3. Vatra je javna (kao što je OPP Seal javan — transparentnost je naša obrana)","4. Zbroj je istina (kao što je trojna pohrana — svi moraju imati svaku istinu)","5. Niti jedan nije nezamjenjiv (kao što ni jedan dokument ne ovisi o jednom serveru)"],"izjava_zatvaranja":"Kad se male ruke slože, sve se može. — Ivan, 2026-05-03","sljedeci_blok_lanca":"c0020 — implementacija FAZE 1 (services/borg.py + Genesis health.json) DONE","weise3_id":"bd4083ea4b69cdea13cd12fcc126fb85da17c19c9d7d9aa2989bf529b0091740","prev_hash":"19d54c9c294d89427dad48d09bde895bacb8858ea63df4d2bd7cf0fcee3d6a85","pecat_dna":"13f452269a7cf2ae6641af8fdda55103213bcdb31a901b841509edee0a43f10d","block_hash":"068edc4b327a7c049fa20d03014c128602b8a8efbdc3fc5d55e29a8abf512052","svjedok":{"kreator":"CC","kontekst":"mrezni_plan_borg.asimilacija","vrijeme":"2026-05-03T06:35:48.204060+00:00","promatrac":"genesis.cc.session"},"_opp_seal":{"version":"1.0","tip":"prior_art","javno":true,"hash_algo":"SHA3-256","chain":"genesis.limit-connect.com","verify_url":"https://genesis.limit-connect.com/v/bd4083ea4b69cdea13cd12fcc126fb85da17c19c9d7d9aa2989bf529b0091740","licence":"CC0","prior_art_statement":"Ovaj dokument je javno objavljen i vremenski verificiran. Svaka ideja, tehnika ili inovacija opisana u njemu ne može biti patentirana naknadno jer predstavlja prior art prema čl. 54 EPC i kvalificirani elektronički upisnik prema eIDAS 2.0 čl. 45j-45m.","verify_urls":["https://genesis.limit-connect.com/v/bd4083ea4b69cdea13cd12fcc126fb85da17c19c9d7d9aa2989bf529b0091740","https://grosmarkt-online.eu/brsljani/v/bd4083ea4b69cdea13cd12fcc126fb85da17c19c9d7d9aa2989bf529b0091740"]}}}