01
Per-event, לא batch
כל פעולה (wrap · open · burn · message · file upload · copy-block · device-approval · ועוד ~50 סוגים) יוצרת שורה אחת ב-nd_operator_receipts עם event_hash, חתימת Ed25519, prev_receipt_id ו-chain_index משלה. ה-Merkle seal השעתי לא מאחד אירועים — רק את ה-hashes שלהם.
מקור: lib/operator/types.ts · OperatorEventType
02
Hash chain ניתן לאימות
כל receipt מצביעה על קודמתה דרך prev_receipt_id + chain_index. שינוי שורה אחת שובר את כל הסדרה אחריה. אותו pattern של Certificate Transparency, רק עם semantics של פעולות על מידע.
מקור: migration 057 · nd_operator_receipts schema
03
עוגן חיצוני ב-Bitcoin
כל שעה, כל ה-event_hashes באותו חלון מתאחדים ל-Merkle tree (ממוין · אין דלף סדר), השורש נחתם ב-Ed25519 ונשלח ל-OpenTimestamps שעוגן אותו בבלוק Bitcoin. אחרי אישור — שכתוב היסטוריה מצריך reorg ל-Bitcoin.
מקור: migration 148 · nd_epoch_seals · ots_status
04
המפתח של הלקוח (Sovereign tier)
ב-Sovereign tier הלקוח מייצר Ed25519 keypair בתוך ה-vault הלוקאלי שלו (SQLCipher · Argon2id passphrase). כל heartbeat · metrics · entry/exit מ-Border Control חתום במפתח שלו. השרת מאמת בכל קליטה. NoData פיזית לא יכולה לזייף — היא לא מחזיקה את המפתח.
מקור: apps/desktop/src-tauri/src/border.rs + license.rs
05
Crypto-shred על burn
כשמבצעים burn, אנחנו לא מסמנים שורה כ-deleted. אנחנו מוחקים את ה-content_key. גם backup מלא של ה-DB לא יכול לשחזר את הקובץ. זה soft-delete של הרבה vendors, אצלנו זה מתמטית בלתי-שחזיר.
מקור: OperatorEventType *_burned · content_key destruction