nx_id_ledger_audit_t190.nx source
↩ module page · 77 lines · 3360 B
1// nx_id_ledger_audit_t190.nx -- Analyzes ledger metadata to count rows with formatting issues and validate schema compliance.
2import "nx_apistack_idempotency.nx"
3import "nx_fsops_lib.nx"
4// Read-only compatibility observation; never emits row keys, outcomes or credentials.
5func ia_shape(r:*NxIdEvidence)->i64{
6 if (r.buffer as i64)<=0||r.bytes<=0{return 0}
7 var lines:i64=0;var extra:i64=0;var absent:i64=0;var empty:i64=0;var control:i64=0
8 var first:i64=0-1;var i:i64=0
9 while i<r.bytes{
10 let start:i64=i;var tabs:i64=0;var firsttab:i64=0-1;var badcontrol:i64=0
11 while i<r.bytes{
12 let value:u8=r.buffer[i]
13 if value==10 as u8{break}
14 if value==9 as u8{tabs=tabs+1;if firsttab<0{firsttab=i}}
15 if value==0 as u8||value==13 as u8{badcontrol=badcontrol+1}
16 i=i+1
17 }
18 if i>start{
19 if r.buffer[start]!=35 as u8{
20 lines=lines+1;var bad:i64=0
21 if tabs>1{extra=extra+1;bad=1}
22 if tabs==0{absent=absent+1;bad=1}
23 if firsttab==start{empty=empty+1;bad=1}
24 if badcontrol>0{control=control+1;bad=1}
25 if bad==1{if first<0{first=start}}
26 }
27 };i=i+1
28 }
29 fsx_puts(",\"shapeRows\":");fsx_putn(lines)
30 fsx_puts(",\"rowsWithExtraTabs\":");fsx_putn(extra)
31 fsx_puts(",\"rowsWithoutTab\":");fsx_putn(absent)
32 fsx_puts(",\"rowsWithEmptyKey\":");fsx_putn(empty)
33 fsx_puts(",\"rowsWithCRorNUL\":");fsx_putn(control)
34 fsx_puts(",\"firstInvalidRowOffset\":");fsx_putn(first)
35 fsx_puts(",\"finalNewline\":");if r.buffer[r.bytes-1]==10 as u8{fsx_puts("true")}else{fsx_puts("false")}
36 return 0
37}
38func main(argc:i64,argv:*i64)->i64{
39 if argc!=2{fsx_puts("usage: ledger-path (metadata only)\n");return 2}
40 let r:*NxIdEvidence=sys_mmap_try(__size_of(NxIdEvidence)) as *NxIdEvidence
41 if (r as i64)<=0{return 3}
42 let key:*u8="nishi-metadata-audit-t190"
43 var kn:i64=0;while key[kn]!=0 as u8{kn=kn+1}
44 let state:i64=id_read_evidence(argv[1] as *u8,key,kn,r)
45 fsx_puts("{\"action\":\"IDEMPOTENCY-LEDGER-AUDIT\",\"state\":");fsx_putn(state)
46 fsx_puts(",\"nativeError\":");fsx_putn(r.system_code)
47 fsx_puts(",\"bytes\":");fsx_putn(r.bytes)
48 var rows:i64=0;var bound:i64=0;var comments:i64=0
49 if state>=0||state==ID_NOT_FOUND{
50 var i:i64=0;let prefix:*u8="rc=0 request_v=1 request_sha256="
51 var pn:i64=0;while prefix[pn]!=0 as u8{pn=pn+1}
52 while i<r.bytes{
53 let start:i64=i
54 while i<r.bytes{if r.buffer[i]==10 as u8{break};if state>=0{if r.buffer+i==r.result+r.result_bytes{break}};i=i+1}
55 let end:i64=i
56 if end>start{
57 if r.buffer[start]==35 as u8{comments=comments+1}else{
58 rows=rows+1;var tab:i64=start;while tab<end{if r.buffer[tab]==9 as u8{break};tab=tab+1}
59 let pos:i64=tab+1
60 if end-pos>pn+64{
61 var same:i64=1;var j:i64=0;while j<pn{if r.buffer[pos+j]!=prefix[j]{same=0};j=j+1}
62 if r.buffer[pos+pn+64]!=32 as u8{same=0}
63 if same==1{bound=bound+1}
64 }
65 }
66 };i=i+1
67 }
68 fsx_puts(",\"schemaValid\":true,\"rows\":");fsx_putn(rows)
69 fsx_puts(",\"v1PrefixRows\":");fsx_putn(bound)
70 fsx_puts(",\"unboundOrOtherRows\":");fsx_putn(rows-bound)
71 fsx_puts(",\"commentRows\":");fsx_putn(comments)
72 }else{fsx_puts(",\"schemaValid\":false,\"rows\":null,\"v1PrefixRows\":null,\"unboundOrOtherRows\":null")}
73 ia_shape(r)
74 fsx_puts(",\"mutationPerformed\":false,\"snapshotOnly\":true}\n")
75 id_evidence_close(r);sys_munmap_direct(r as *u8,__size_of(NxIdEvidence))
76 if state>=0||state==ID_NOT_FOUND{return 0};return 3
77}