code wiki / _hdl_build / nx_craft_journal_index_gate_t21.nx
nx_craft_journal_index_gate_t21.nx source
↩ module page · 125 lines · 9417 B
1// Actual estate engine over a private arena; no filesystem/network operations.
2import "nx_wasm_craft_journal_index_t21.nx"
3import "nx_gate_verdict.nx"
4func jg_copy(dst: *u8,src: *u8,n: i64) -> i64 { var i: i64=0;while i<n { dst[i]=src[i];i=i+1 };return n }
5func jg_equal(a: *u8,b: *u8,n: i64) -> i64 { var i: i64=0;while i<n { if a[i]!=b[i] { return 0 };i=i+1 };return 1 }
6func jg_clear(base: i64) -> i64 { let e: *i64=ejp(base);var i: i64=0;while i<EJRN_SLOTS { e[i]=0;i=i+1 };return 0 }
7func jg_count(base: i64) -> i64 { let e: *i64=ejp(base);var i: i64=0;var n: i64=0;while i<EJRN_SLOTS { if e[i]!=0 { n=n+1 };i=i+1 };return n }
8func jg_refused(base: i64,copy: *u8,x: i64,y: i64,z: i64,b: i64) -> i64 {
9 jg_copy(copy,(base+O_EJRN) as *u8,EJRN_BYTES)
10 let rc: i64=ej_put(base,x,y,z,b)
11 return rc==(0-2)&&jg_equal(copy,(base+O_EJRN) as *u8,EJRN_BYTES)==1
12}
13func jg_reference_put(base: i64, ax: i64, ay: i64, az: i64, b: i64) -> i64 {
14 if ej_key_representable(ax,ay,az) == 0 { return 0-2 }
15 if b < 0 || b > 255 { return 0-2 }
16 let e: *i64 = ejp(base)
17 let k: i64 = ej_key(ax, ay, az)
18 let kv: i64 = ((k + 1) << 8) | b
19 var i: i64 = (k * EJRN_HASH_MUL) & (EJRN_SLOTS - 1)
20 var n: i64 = 0
21 var empty: i64 = 0-1
22 var matched: i64 = 0
23 // Old writers could duplicate a key because of signed comparison. Retain every slot,
24 // updating matching duplicates together so the existing ascending overlay stays coherent.
25 while n < EJRN_SLOTS {
26 let cur: i64 = e[i]
27 if cur == 0 { if empty < 0 { empty=i } }
28 if ej_tag_matches(cur,k) == 1 { e[i]=kv;matched=1 }
29 i = (i + 1) & (EJRN_SLOTS - 1)
30 n = n + 1
31 }
32 if matched == 1 { return 1 }
33 if empty < 0 { return 0-1 }
34 e[empty]=kv
35 return 1
36}
37func main() -> i64 {
38 let arena: *u8=sys_mmap(CRAFT_EXT_TOTAL);let copy: *u8=sys_mmap(EJRN_BYTES);let save: *u8=sys_mmap(SAVE_LEN)
39 if (arena as i64)<=0||(copy as i64)<=0||(save as i64)<=0 { return 3 }
40 let base: i64=arena as i64;let e: *i64=ejp(base);let ctr: *i64=gv_ctr()
41 gv_head("EDIT JOURNAL / packed tag, retained duplicate and wire bounds" as *u8)
42 init_impl_v(base,2,123)
43 var coord: i64=0-1
44 while coord<=1 {
45 jg_clear(base)
46 gv_check("negative/zero/positive coordinates roundtrip" as *u8,ej_put(base,coord,24,coord,6)==1&&ej_get(base,coord,24,coord)==6,ctr)
47 gv_check("repeated update reuses slot and supports air" as *u8,ej_put(base,coord,24,coord,0)==1&&ej_get(base,coord,24,coord)==0&&jg_count(base)==1,ctr)
48 coord=coord+1
49 }
50 jg_clear(base)
51 gv_check("minimum coordinate wire roundtrip" as *u8,ej_put(base,0-WATER_MAGIC_16777216,0,0-WATER_MAGIC_16777216,0)==1&&ej_get(base,0-WATER_MAGIC_16777216,0,0-WATER_MAGIC_16777216)==0,ctr)
52 gv_check("upper representable key retains signed packed tag and air" as *u8,ej_put(base,WATER_MAGIC_16777216-1,62,WATER_MAGIC_16777216-1,255)==1&&ej_get(base,WATER_MAGIC_16777216-1,62,WATER_MAGIC_16777216-1)==255&&ej_put(base,WATER_MAGIC_16777216-1,62,WATER_MAGIC_16777216-1,0)==1&&ej_get(base,WATER_MAGIC_16777216-1,62,WATER_MAGIC_16777216-1)==0,ctr)
53 gv_check("all-ones coordinate key cannot alias empty sentinel" as *u8,jg_refused(base,copy,WATER_MAGIC_16777216-1,63,WATER_MAGIC_16777216-1,0)&&jg_refused(base,copy,WATER_MAGIC_16777216-1,63,WATER_MAGIC_16777216-1,6),ctr)
54 gv_check("x outside packed range refused without mutation" as *u8,jg_refused(base,copy,0-WATER_MAGIC_16777216-1,0,0,6)&&jg_refused(base,copy,WATER_MAGIC_16777216,0,0,6),ctr)
55 gv_check("z outside packed range refused without mutation" as *u8,jg_refused(base,copy,0,0,0-WATER_MAGIC_16777216-1,6)&&jg_refused(base,copy,0,0,WATER_MAGIC_16777216,6),ctr)
56 gv_check("y outside six-bit range refused without mutation" as *u8,jg_refused(base,copy,0,0-1,0,6)&&jg_refused(base,copy,0,64,0,6),ctr)
57 gv_check("block outside byte range refused without mutation" as *u8,jg_refused(base,copy,0,0,0,0-1)&&jg_refused(base,copy,0,0,0,256),ctr)
58 jg_clear(base);jg_copy(copy,(base+O_EJRN) as *u8,EJRN_BYTES)
59 gv_check("off-window player edit cannot journal an unapplied voxel" as *u8,wc_edit(base,WX,0,0,6)==0&&jg_equal(copy,(base+O_EJRN) as *u8,EJRN_BYTES)==1,ctr)
60 let key: i64=ej_key(48,43,101)
61 let bucket: i64=(key*EJRN_HASH_MUL)&(EJRN_SLOTS-1)
62 gv_check("fixture really hashes to wrapping bucket8189" as *u8,bucket==EJRN_SLOTS-3,ctr)
63 e[EJRN_SLOTS-3]=((key+1)<<8)|6
64 e[EJRN_SLOTS-2]=((key+1)<<8)|7
65 e[EJRN_SLOTS-1]=((key+1)<<8)|9
66 e[0]=((key+1)<<8)|3
67 let unrelated: i64=((ej_key(12,24,12)+1)<<8)|5
68 e[17]=unrelated
69 vset(base,48,43,101,0);ej_overlay(base,0,WX,0,WZ)
70 gv_check("legacy wrapped duplicates preserve highest-slot overlay winner" as *u8,ej_get(base,48,43,101)==9&&vget(base,48,43,101)==9,ctr)
71 gv_check("update touches all retained duplicate slots and no unrelated row" as *u8,ej_put(base,48,43,101,11)==1&&jg_count(base)==5&&e[17]==unrelated&&(e[0]&255)==11&&(e[EJRN_SLOTS-3]&255)==11&&(e[EJRN_SLOTS-2]&255)==11&&(e[EJRN_SLOTS-1]&255)==11,ctr)
72 vset(base,48,43,101,0);ej_overlay(base,0,WX,0,WZ)
73 gv_check("lookup and overlay agree after duplicate update" as *u8,ej_get(base,48,43,101)==11&&vget(base,48,43,101)==11,ctr)
74 let n: i64=wc_save_build(base);jg_copy(save,(base+O_SAVE) as *u8,n);jg_copy(copy,(base+O_EJRN) as *u8,EJRN_BYTES)
75 init_impl_v(base,2,123);jg_copy((base+O_SAVE) as *u8,save,n)
76 gv_check("authentic reload retains every legacy slot and resolved lookup" as *u8,wc_save_apply(base)==0&&jg_equal(copy,(base+O_EJRN) as *u8,EJRN_BYTES)==1&&ej_get(base,48,43,101)==11,ctr)
77 vset(base,48,43,101,0);ej_overlay(base,0,WX,0,WZ)
78 gv_check("post-reload overlay retains newest duplicate value" as *u8,vget(base,48,43,101)==11,ctr)
79 gv_check("air edit updates retained duplicate slots without deletion" as *u8,ej_put(base,48,43,101,0)==1&&jg_count(base)==5&&ej_get(base,48,43,101)==0,ctr)
80 vset(base,48,43,101,6);ej_overlay(base,0,WX,0,WZ)
81 gv_check("air overlay removes voxel while keeping journal evidence" as *u8,vget(base,48,43,101)==0&&jg_count(base)==5,ctr)
82 var i: i64=0;while i<EJRN_SLOTS { e[i]=((ej_key(i,0,0)+1)<<8)|6;i=i+1 }
83 jg_copy(copy,(base+O_EJRN) as *u8,EJRN_BYTES)
84 gv_check("full unrelated journal refuses insertion atomically" as *u8,ej_put(base,0-1,24,1,6)==(0-1)&&jg_equal(copy,(base+O_EJRN) as *u8,EJRN_BYTES)==1,ctr)
85 gv_check("existing key remains updateable in full journal" as *u8,ej_put(base,1,0,0,3)==1&&ej_get(base,1,0,0)==3&&jg_count(base)==EJRN_SLOTS,ctr)
86
87 let guard_left: *i64 = (base+O_EJ_INDEX-8) as *i64
88 let guard_right: *i64 = (base+CRAFT_TOTAL) as *i64
89 guard_left[0]=173;guard_right[0]=173
90 jg_copy(copy,(base+O_EJRN) as *u8,EJRN_BYTES)
91 gv_check("index reservation fits below static and leaves animation offsets" as *u8,CRAFT_TOTAL<=CRAFT_STATIC_BASE&&O_NXA==CRAFT_STATIC_LIMIT&&CRAFT_TOTAL-O_EJ_INDEX==(EJ_INDEX_BUCKETS+EJRN_SLOTS)*8,ctr)
92 gv_check("insufficient scratch capacity refuses before any write" as *u8,(ej_batch_begin(base,CRAFT_TOTAL-1) as i64)==0&&guard_left[0]==173&&guard_right[0]==173&&jg_equal(copy,(base+O_EJRN) as *u8,EJRN_BYTES)==1,ctr)
93 let context: *i64=ej_batch_begin(base,CRAFT_EXT_TOTAL)
94 gv_check("index build preserves persisted slots and both boundary guards" as *u8,(context as i64)>0&&jg_equal(copy,(base+O_EJRN) as *u8,EJRN_BYTES)==1&&guard_left[0]==173&&guard_right[0]==173,ctr)
95 gv_check("full-store indexed update and refusal preserve lookup" as *u8,ej_index_put(base,context,1,0,0,7)==1&&ej_index_get(base,context,1,0,0)==7&&ej_index_put(base,context,0-1,24,1,6)==(0-1),ctr)
96 jg_clear(base)
97 let collision: *i64=ej_batch_begin(base,CRAFT_EXT_TOTAL)
98 gv_check("negative and high-X fixture really collide in transient index" as *u8,ej_index_bucket((ej_key(0-1,24,1)+1)<<8)==ej_index_bucket((ej_key(4163,24,1)+1)<<8),ctr)
99 gv_check("colliding new inserts remain distinct across repeated updates" as *u8,ej_index_put(base,collision,0-1,24,1,6)==1&&ej_index_put(base,collision,4163,24,1,7)==1&&ej_index_put(base,collision,0-1,24,1,0)==1&&ej_index_get(base,collision,0-1,24,1)==0&&ej_index_get(base,collision,4163,24,1)==7&&jg_count(base)==2,ctr)
100 let reference: *u8=sys_mmap(CRAFT_EXT_TOTAL)
101 if (reference as i64)<=0 { return 3 }
102 let rb: i64=reference as i64
103 jg_clear(base);jg_clear(rb)
104 e[0]=((ej_key(48,43,101)+1)<<8)|3
105 e[EJRN_SLOTS-1]=((ej_key(48,43,101)+1)<<8)|9
106 jg_copy((rb+O_EJRN) as *u8,(base+O_EJRN) as *u8,EJRN_BYTES)
107 let batch: *i64=ej_batch_begin(base,CRAFT_EXT_TOTAL)
108 var agrees: i64=1
109 var step: i64=0
110 while step<512 {
111 let x: i64=(step*37)%129-64
112 let y: i64=step%48
113 let z: i64=(step*19)%127-63
114 let b: i64=step%17
115 if ej_index_put(base,batch,x,y,z,b)!=jg_reference_put(rb,x,y,z,b) { agrees=0 }
116 if ej_index_put(base,batch,48,43,101,b)!=jg_reference_put(rb,48,43,101,b) { agrees=0 }
117 if jg_equal((rb+O_EJRN) as *u8,(base+O_EJRN) as *u8,EJRN_BYTES)!=1 { agrees=0 }
118 step=step+1
119 }
120 gv_check("1024 indexed mutations equal full-scan reference byte for byte after every operation pair" as *u8,agrees==1,ctr)
121 gv_values_head();gv_kv("index_bytes" as *u8,CRAFT_TOTAL-O_EJ_INDEX);gv_kv("craft_total" as *u8,CRAFT_TOTAL);gv_kv("static_base" as *u8,CRAFT_STATIC_BASE);gv_kv("remaining_arena_slack" as *u8,CRAFT_STATIC_BASE-CRAFT_TOTAL)
122 sys_munmap(reference,CRAFT_EXT_TOTAL)
123 sys_munmap(arena,CRAFT_EXT_TOTAL);sys_munmap(copy,EJRN_BYTES);sys_munmap(save,SAVE_LEN)
124 return gv_verdict("EDIT-JOURNAL" as *u8,ctr,"persisted format unchanged; bounded batch index; actual WASM workload and layout qualification required" as *u8)
125}