{"id":"c1217","filename":"c1217_eho_node_spec_folija_sjetva.dok.json","weise3_id":"","tip":"implementacija","naziv":"eho-node spec — Kompajliranje, Bunker, Folija Sjetva 3, Implementacijski kickoff","kreator":"Ivan Brtan (Opus + CC)","datum":"2026-05-31","snippet":"","status":"","prev_weise3":"","bunker_l":"#00d4ff","full":{"tip":"implementacija","naziv":"eho-node spec — Kompajliranje, Bunker, Folija Sjetva 3, Implementacijski kickoff","redni":"c1217","datum":"2026-05-31","autor":"Ivan Brtan (Opus + CC)","sesija":"files21 + files23 — KOMPAJLIRANJE_I_BUNKER.md + SJETVA_3_FOLIJA_SPEC.md + IMPLEMENTACIJSKI_KICKOFF.md","kompajliranje_i_bunker":{"pravilo":"KOMPAJLIRAMO MOTOR, ne ISTINU. Motor smije biti brz i zakljucan; istina mora ostati provjerljiva.","tri_kategorije":{"hot_path_kompajliraj":"kripto primitivi (hash, Ed25519), serijalizacija FraktalTokena → Rust, 10-50x brze, timing-safe","trust_critical_kompajliraj_potpisi":"provjeritelj lanca, kripto jezgra → potpisani binary zatvara zamjenu (Pukotina 2)","auditable_ne_kompajliraj":"Krunica-podatak, EHO semantika, poslovna logika → mora se moci citati i osporiti"},"zatvaranje_pukotine2":{"princip":"Trojstvo: kompajlirano + potpisano + reproducibilno","napad_odbijen":"Lazni provjeritelj (uvijek ok:true) → POTPIS NE DRZI, fail-closed","napad_odbijen2":"Izmjena sadrzaja, zadrzavanje starog potpisa → hash se mijenja, potpis ne drzi","dokaz":"bunker_potpis.js + test_bunker.js: 13/13"},"env_istina":{"zabluda":"Kompajliranjem kod skrivam tajne (.env, kljuceve)","istina":"Tajna ugradena u binary je izvuciva — strings binary izvuce za sekundu. DOKAZANO.","prava_zastita":"Tajna NIJE u kodu. Env sifriran u mirovanju, kljuc za desifriranje IZVAN servera (vault/HSM)."}},"folija_sjetva3":{"sto_je":"Trust layer — mehanizam kojim cvorovi mogu dokazati jedan drugom da rade autentican firmware, da nisu kompromitirani.","tri_porta":{"Folija_Python":"Server-side (Krunica, seed serveri) — postojeca","Folija_JS":"Vanilla JS, Service Worker u browseru — nova","Folija_Rust":"Rust no_std, ESP32 firmware — nova"},"manifest_format":{"header":"16B manifest_id + 4B version + 4B issued + 4B expiry + 32B prev_hash","implementations":"2B count + N×80B implementation_entry","revoked":"2B count + N×32B hash","signature_threshold":"1B (KRITIČNO: PRIJE broja signera)","signers":"1B count + N×(16B weise3_id + 64B signature)"},"multi_sig":"2-of-3 default. Napadac mora probiti 2 neovisna potpisa.","fail_closed":"Cvor pokrece SAMO artefakt ciji identitet drzi. Sve drugo odbija."},"eho_node_implementacijski_kickoff":{"status":"GREEN LIGHT — CC kuca, Opus pise paralelno","tri_korekcije_recenzenta":{"K1":"Performance ciljevi podijeljeni po platformi: Server (Python) vs ESP32-S3 (Rust)","K2":"Replay protection: LRU cache (1000 nonce-a, 60s window) — ne puna memorija","K3":"Emergency mode kroz OPERATION_MODE u .env — ne systemd argument (neispravna sintaksa)"},"faze":{"F1_kostur":"config.py, eho/opcodes.py, eho/protocol.py, eho/replay.py","F2_crypto":"keys/keystore.py, folija/signer.py, folija/manifest.py, folija/verifier.py","F3_mesh":"mesh/trust.py, mesh/node.py, mesh/ws_server.py, mesh/ws_client.py, audit/","F4_api":"FastAPI endpointi + frontend (mesh-viz, folija-debug, manifest-explorer, audit-stream)","F5_deploy":"Deploy na 5 servera s per-server .env (NODE_ID se razlikuje)","F6_testovi":"L1-L5 testovi + akademski rad sekcija po sekcija"},"performance_ciljevi":{"server_python":{"Ed25519_sign_ms":5,"ML_DSA65_sign_ms":50,"throughput_pkt_s":1000},"ESP32_S3_rust":{"Ed25519_sign_ms":15,"ML_DSA65_sign_ms":150,"throughput_pkt_s":50}},"replay_protection":{"window_s":60,"max_cache":1000,"memorija_KB":50,"razlog":"LRU eviction sprjecava neogranicen rast memorije"},"lokacija_planirana":"/var/www/eho-node/"},"zakoni":["ZAKON 17 (BORG)","ZAKON 29 (Sigurnost je default)","ZAKON 41 (Nema tudjih alata)","ZAKON 43 (Krunica omniprisustvo)"]}}