code wiki / _hdl_build / nx_estate_inventory_gate.nx
nx_estate_inventory_gate.nx source
↩ module page · 103 lines · 8319 B
1// nx_estate_inventory_gate.nx -- proves the estate inventory's CONFLICT-REDUCING storage properties by driving
2// the REAL /tmp/nx_estate_inventory.sov.elf over a fresh store:
3// NEVER-LOSE : put 3 assets -> get each back faithfully (the beneficiary survives a round-trip)
4// SINGLE TRUTH : update an asset -> get returns the NEW value, not the old (one authoritative current state)
5// AUDIT TRAIL : history shows BOTH the old AND new versions (immutable; old never destroyed) -> the
6// executor + heirs see the complete, tamper-evident change record = less to dispute
7// FULL INVENTORY : list enumerates EVERY asset (the whole will), each at its CURRENT state, DEDUPED (an
8// asset edited twice appears once) -> the executor sees the complete estate at a glance
9// GREEN iff 10/10. Durable knowledge/status/estate_inventory_gate.log. license_tier: ORIGINAL
10import "nx_syscalls.nx"
11
12func e_puts(s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} sys_write(1,s,n); return 0 }
13func e_num(v: i64) -> i64 { let bb: *u8=sys_mmap(28); var m: i64=v; if m<0{m=0-m;sys_write(1,"-" as *u8,1)}; let t: *u8=sys_mmap(28); var k: i64=0; if m==0{t[0]=(48 as u8);k=1}; while m>0{t[k]=((48+(m%10)) as u8);m=m/10;k=k+1}; var i: i64=0; while i<k{bb[i]=t[k-1-i];i=i+1}; sys_write(1,bb,k); return 0 }
14func e_w(fd: i64, s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} sys_write(fd,s,n); return 0 }
15func e_wn(fd: i64, v: i64) -> i64 { let bb: *u8=sys_mmap(28); var m: i64=v; if m<0{m=0-m}; let t: *u8=sys_mmap(28); var k: i64=0; if m==0{t[0]=(48 as u8);k=1}; while m>0{t[k]=((48+(m%10)) as u8);m=m/10;k=k+1}; var i: i64=0; while i<k{bb[i]=t[k-1-i];i=i+1}; sys_write(fd,bb,k); return 0 }
16func e_strlen(s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} return n }
17func e_read_small(path: *u8, buf: *u8, cap: i64) -> i64 {
18 let fd: i64=sys_openat_rd(path); if fd<0 { return 0 }
19 var total: i64=0; var nrd: i64=sys_read(fd, buf, cap)
20 while nrd>0 { total=total+nrd; if total>=cap { nrd=0 } else { nrd=sys_read(fd, ((buf as i64)+total) as *u8, cap-total) } }
21 sys_close(fd); return total
22}
23func e_contains(hay: *u8, n: i64, needle: *u8) -> i64 {
24 let nl: i64=e_strlen(needle); if nl==0 { return 0 }
25 var i: i64=0
26 while i+nl<=n { var j: i64=0; var hit: i64=1; while j<nl { if hay[i+j]!=needle[j] { hit=0; j=nl } else { j=j+1 } } if hit==1 { return 1 } i=i+1 }
27 return 0
28}
29// fork the real estate tool with args[0..nargs); stdout -> out_path; return exit code
30func e_run(args: *i64, nargs: i64, out_path: *u8) -> i64 {
31 let pid: i64=sys_fork()
32 if pid==0 {
33 let o: i64=sys_openat_wr(out_path, 0x1a4); if o>=0 { sys_dup3(o,1,0) }
34 let argv: *i64=sys_mmap(8*16) as *i64
35 argv[0]="/tmp/nx_estate_inventory.sov.elf" as *u8 as i64
36 var i: i64=0; while i<nargs { argv[1+i]=args[i]; i=i+1 } argv[1+nargs]=0
37 let envp: *i64=sys_mmap(16) as *i64; envp[0]="PATH=/usr/bin:/bin" as *u8 as i64; envp[1]=0
38 sys_execve("/tmp/nx_estate_inventory.sov.elf" as *u8, argv, envp); sys_exit(127)
39 }
40 let st: *i64=sys_mmap(16) as *i64; sys_wait4(pid, st, 0); return (st[0]>>8)&0xff
41}
42
43func main() -> i64 {
44 e_puts("=== ESTATE INVENTORY GATE (never-lose + single-truth + immutable audit trail) ===\n" as *u8)
45 let P: *u8="/tmp/estate_gate-" as *u8
46 let outp: *u8="/tmp/estate_gate_out.txt" as *u8
47 let obuf: *u8=sys_mmap(65536)
48 let a: *i64=sys_mmap(8*8) as *i64
49
50 // --- put 3 assets ---
51 a[0]="put" as *u8 as i64; a[1]=P as i64; a[2]="house" as *u8 as i64; a[3]="Family home 123 Main St Salt Lake" as *u8 as i64; a[4]="350000" as *u8 as i64; a[5]="Alice" as *u8 as i64
52 e_run(a, 6, outp)
53 a[2]="car" as *u8 as i64; a[3]="2019 Subaru Outback" as *u8 as i64; a[4]="22000" as *u8 as i64; a[5]="Bob" as *u8 as i64
54 e_run(a, 6, outp)
55 a[2]="savings" as *u8 as i64; a[3]="Credit union savings account" as *u8 as i64; a[4]="80000" as *u8 as i64; a[5]="Carol" as *u8 as i64
56 e_run(a, 6, outp)
57
58 var pass: i64=0
59 let rows: i64=10
60
61 // R1-R3 NEVER-LOSE: get each asset back, beneficiary survives
62 a[0]="get" as *u8 as i64; a[1]=P as i64; a[2]="house" as *u8 as i64
63 e_run(a, 3, outp); var n1: i64=e_read_small(outp, obuf, 65536)
64 e_puts(" R1 get house has 'Alice'? " as *u8); if e_contains(obuf,n1,"Alice" as *u8)==1 { pass=pass+1; e_puts("YES PASS\n" as *u8) } else { e_puts("NO FAIL\n" as *u8) }
65 a[2]="car" as *u8 as i64
66 e_run(a, 3, outp); var n2: i64=e_read_small(outp, obuf, 65536)
67 e_puts(" R2 get car has 'Bob'? " as *u8); if e_contains(obuf,n2,"Bob" as *u8)==1 { pass=pass+1; e_puts("YES PASS\n" as *u8) } else { e_puts("NO FAIL\n" as *u8) }
68 a[2]="savings" as *u8 as i64
69 e_run(a, 3, outp); var n3: i64=e_read_small(outp, obuf, 65536)
70 e_puts(" R3 get savings has 'Carol'? " as *u8); if e_contains(obuf,n3,"Carol" as *u8)==1 { pass=pass+1; e_puts("YES PASS\n" as *u8) } else { e_puts("NO FAIL\n" as *u8) }
71
72 // --- UPDATE house (beneficiary change Alice -> Dave; a new immutable version) ---
73 a[0]="put" as *u8 as i64; a[1]=P as i64; a[2]="house" as *u8 as i64; a[3]="Family home 123 Main St Salt Lake" as *u8 as i64; a[4]="360000" as *u8 as i64; a[5]="Dave" as *u8 as i64
74 e_run(a, 6, outp)
75
76 // R4-R5 SINGLE TRUTH: get house now returns Dave (latest), not Alice (superseded)
77 a[0]="get" as *u8 as i64; a[1]=P as i64; a[2]="house" as *u8 as i64
78 e_run(a, 3, outp); var n4: i64=e_read_small(outp, obuf, 65536)
79 e_puts(" R4 get house now has 'Dave' (latest)? " as *u8); if e_contains(obuf,n4,"Dave" as *u8)==1 { pass=pass+1; e_puts("YES PASS\n" as *u8) } else { e_puts("NO FAIL\n" as *u8) }
80 e_puts(" R5 get house no longer shows 'Alice' (single current truth)? " as *u8); if e_contains(obuf,n4,"Alice" as *u8)==0 { pass=pass+1; e_puts("YES PASS\n" as *u8) } else { e_puts("NO FAIL\n" as *u8) }
81
82 // R6-R7 AUDIT TRAIL: history shows BOTH the new (Dave) and the OLD (Alice) -- nothing destroyed
83 a[0]="history" as *u8 as i64; a[1]=P as i64; a[2]="house" as *u8 as i64
84 e_run(a, 3, outp); var n5: i64=e_read_small(outp, obuf, 65536)
85 e_puts(" R6 history house has 'Dave' (newest)? " as *u8); if e_contains(obuf,n5,"Dave" as *u8)==1 { pass=pass+1; e_puts("YES PASS\n" as *u8) } else { e_puts("NO FAIL\n" as *u8) }
86 e_puts(" R7 history house STILL has 'Alice' (old version NEVER destroyed = audit trail)? " as *u8); if e_contains(obuf,n5,"Alice" as *u8)==1 { pass=pass+1; e_puts("YES PASS\n" as *u8) } else { e_puts("NO FAIL\n" as *u8) }
87
88 // --- FULL INVENTORY: list the whole will (every asset, current state, deduped) ---
89 a[0]="list" as *u8 as i64; a[1]=P as i64
90 e_run(a, 2, outp); var n6: i64=e_read_small(outp, obuf, 65536)
91 e_puts(" R8 list enumerates ALL assets (house+car+savings)? " as *u8)
92 if e_contains(obuf,n6,"house" as *u8)==1 { if e_contains(obuf,n6,"car" as *u8)==1 { if e_contains(obuf,n6,"savings" as *u8)==1 { pass=pass+1; e_puts("YES PASS\n" as *u8) } else { e_puts("NO FAIL\n" as *u8) } } else { e_puts("NO FAIL\n" as *u8) } } else { e_puts("NO FAIL\n" as *u8) }
93 e_puts(" R9 list shows CURRENT state ('Dave' present, 'Alice' gone)? " as *u8)
94 if e_contains(obuf,n6,"Dave" as *u8)==1 { if e_contains(obuf,n6,"Alice" as *u8)==0 { pass=pass+1; e_puts("YES PASS\n" as *u8) } else { e_puts("NO FAIL\n" as *u8) } } else { e_puts("NO FAIL\n" as *u8) }
95 e_puts(" R10 list is DEDUPED/idempotent (assets=3 though house was put twice)? " as *u8)
96 if e_contains(obuf,n6,"assets=3" as *u8)==1 { pass=pass+1; e_puts("YES PASS\n" as *u8) } else { e_puts("NO FAIL\n" as *u8) }
97
98 e_puts("----\nESTATE-INVENTORY rows=" as *u8); e_num(rows); e_puts(" pass=" as *u8); e_num(pass); e_puts("\n" as *u8)
99 let lg: i64=sys_openat_append("knowledge/status/estate_inventory_gate.log" as *u8, 0x1a4)
100 if lg>=0 { e_w(lg, "ESTATE-INVENTORY rows=" as *u8); e_wn(lg, rows); e_w(lg, " pass=" as *u8); e_wn(lg, pass); if pass==rows { e_w(lg, " verdict=GREEN\n" as *u8) } else { e_w(lg, " verdict=RED\n" as *u8) } sys_close(lg) }
101 if pass==rows { e_puts("ESTATE-INVENTORY GREEN (never-lose + single-truth + immutable audit trail = executor-conflict-reducing)\n" as *u8); sys_exit(0); return 0 }
102 e_puts("ESTATE-INVENTORY RED\n" as *u8); sys_exit(1); return 1
103}