code wiki / (root) / nx_id_ledger_claim_audit_t219.nx

nx_id_ledger_claim_audit_t219.nx source

↩ module page · 146 lines · 7028 B

1// nx_id_ledger_claim_audit_t219.nx -- Verifies and splits claim evidence from legacy rows into hexadecimal and file path components. 2import "nx_apistack_idempotency.nx" 3import "nx_toolcall_idem_lib.nx" 4import "nx_fsops_lib.nx" 5import "nx_sha256.nx" 6// Metadata only: no journal keys, result bodies, paths from rows or credentials. 7func la_len(p:*u8)->i64{var n:i64=0;while p[n]!=0 as u8{n=n+1};return n} 8func la_prefix(p:*u8,n:i64,s:*u8)->i64{ 9 let sn:i64=la_len(s);if n<sn{return 0};var i:i64=0 10 while i<sn{if p[i]!=s[i]{return 0};i=i+1};return 1 11} 12func la_hash(p:*u8,n:i64)->i64{ 13 let digest:*u8=sys_mmap_try(SHA256_DIGEST_BYTES) 14 if (digest as i64)<=0{fsx_puts("null");return ID_RESOURCE} 15 let rc:i64=sha256_digest_checked_native(p,n,digest) 16 if rc!=0{sys_munmap_direct(digest,SHA256_DIGEST_BYTES);fsx_puts("null");return rc} 17 let hex:*u8="0123456789abcdef";var i:i64=0;fsx_puts("\"") 18 while i<SHA256_DIGEST_BYTES{let v:i64=digest[i] as i64;sys_write(1,hex+(v>>4),1);sys_write(1,hex+(v&15),1);i=i+1} 19 fsx_puts("\"");sys_munmap_direct(digest,SHA256_DIGEST_BYTES);return 0 20} 21func la_kind(p:*u8,n:i64)->i64{ 22 if la_prefix(p,n,"rc=0 verb=")==1{return 1} 23 if la_prefix(p,n,"lane=")==1{return 2} 24 if la_prefix(p,n,"rc=0 request_v=1 ")==1{return 3} 25 return 0 26} 27func la_jobs(p:*u8,n:i64)->i64{ 28 fsx_puts("[");var i:i64=0;var count:i64=0 29 while i<n{ 30 if la_prefix(p+i,n-i," job=")==1{ 31 var j:i64=i+5;var value:i64=0;var digits:i64=0;var overflow:i64=0 32 while j<n{ 33 let ch:i64=p[j] as i64;if ch<48||ch>57{break} 34 let d:i64=ch-48 35 if value>(ID_SIGNED_MAX-d)/10{overflow=1}else{value=value*10+d} 36 digits=digits+1;j=j+1 37 } 38 if digits>0&&overflow==0{if count>0{fsx_puts(",")};fsx_putn(value);count=count+1} 39 i=j 40 }else{i=i+1} 41 } 42 fsx_puts("]");return count 43} 44 45func la_claim_exists(key:*u8,n:i64,hex:*u8,path:*u8,stat:*u8)->i64{ 46 if ti_key_ok(key,n)==0{return FIO_EINVAL} 47 ti_key_hex(key,n,hex) 48 ti_claim_path("../_jobs",hex,path) 49 let fd:i64=__syscall(257,AT_FDCWD,path,ID_O_RDONLY|ID_O_NONBLOCK|ID_O_NOFOLLOW|ID_O_CLOEXEC,0,0,0) 50 if fd<0{return fd} 51 let rc:i64=sys_fstat_fd(fd,stat);let cl:i64=sys_close(fd) 52 if rc!=0{return rc};if cl!=0{return cl} 53 let mode:i64=*((stat+NX_STAT_X64_MODE_OFFSET) as *i64) 54 if (mode&NX_STAT_TYPE_MASK)!=NX_STAT_REGULAR_FILE{return FIO_EINVAL} 55 return 1 56} 57func la_occ(p:*u8,n:i64,s:*u8)->i64{ 58 var count:i64=0;var i:i64=0 59 while i<n{if la_prefix(p+i,n-i,s)==1{count=count+1};i=i+1};return count 60} 61func la_split_evidence(source:*u8,row:*NxIdLegacyRow)->i64{ 62 let hex1:*u8=sys_mmap_try(TI_HEX_CH+1);let hex2:*u8=sys_mmap_try(TI_HEX_CH+1) 63 let pathbytes:i64=la_len("../_jobs")+la_len("/idem_")+TI_HEX_CH+la_len(".claim")+1 64 let path:*u8=sys_mmap_try(pathbytes);let stat:*u8=sys_mmap_try(NX_STAT_X64_BYTES) 65 if (hex1 as i64)<=0||(hex2 as i64)<=0||(path as i64)<=0||(stat as i64)<=0{return ID_RESOURCE} 66 var count:i64=0;var probes:i64=0;var errors:i64=0 67 fsx_puts(",\"claimSplitCandidates\":[") 68 if row.tabs==2{ 69 let k:i64=row.legacy_key_bytes 70 var split:i64=1;var stop:i64=k 71 if row.second_tab>row.first_tab+1{split=k;stop=k+1} 72 while split<stop{ 73 let p1:*u8=source+row.start;var p2:*u8=source+row.start+split 74 var n2:i64=k-split 75 if split==k{p2=source+row.first_tab+1;n2=row.second_tab-row.first_tab-1} 76 probes=probes+1 77 let a:i64=la_claim_exists(p1,split,hex1,path,stat) 78 if a!=1&&a!=0-2&&a!=FIO_EINVAL{errors=errors+1} 79 if a==1{ 80 probes=probes+1 81 let b:i64=la_claim_exists(p2,n2,hex2,path,stat) 82 if b!=1&&b!=0-2&&b!=FIO_EINVAL{errors=errors+1} 83 if b==1{ 84 if count>0{fsx_puts(",")};count=count+1 85 fsx_puts("{\"firstKeyBytes\":");fsx_putn(split);fsx_puts(",\"secondKeyBytes\":");fsx_putn(n2) 86 fsx_puts(",\"firstKeySha256\":");la_hash(p1,split) 87 fsx_puts(",\"secondKeySha256\":");la_hash(p2,n2) 88 fsx_puts(",\"firstClaimDigest\":\"");sys_write(1,hex1,TI_HEX_CH);fsx_puts("\"") 89 fsx_puts(",\"secondClaimDigest\":\"");sys_write(1,hex2,TI_HEX_CH);fsx_puts("\"") 90 fsx_puts(",\"firstDigestOccurrencesInRow\":");fsx_putn(la_occ(source+row.start,row.end-row.start,hex1)) 91 fsx_puts(",\"secondDigestOccurrencesInRow\":");fsx_putn(la_occ(source+row.start,row.end-row.start,hex2)) 92 fsx_puts("}") 93 } 94 } 95 split=split+1 96 } 97 } 98 fsx_puts("],\"claimProbes\":");fsx_putn(probes);fsx_puts(",\"claimProbeErrors\":");fsx_putn(errors) 99 fsx_puts(",\"legacyWriterResultMarkers\":");fsx_putn(la_occ(source+row.start,row.end-row.start,"rc=0 verb=")) 100 fsx_puts(",\"legacyToolcallResultMarkers\":");fsx_putn(la_occ(source+row.start,row.end-row.start,"lane=")) 101 sys_munmap_direct(hex1,TI_HEX_CH+1);sys_munmap_direct(hex2,TI_HEX_CH+1) 102 sys_munmap_direct(path,pathbytes);sys_munmap_direct(stat,NX_STAT_X64_BYTES) 103 return 0 104} 105 106func main(argc:i64,argv:*i64)->i64{ 107 if argc!=2{return 2} 108 let ev:*NxIdEvidence=sys_mmap_try(__size_of(NxIdEvidence)) as *NxIdEvidence 109 let row:*NxIdLegacyRow=sys_mmap_try(__size_of(NxIdLegacyRow)) as *NxIdLegacyRow 110 if (ev as i64)<=0||(row as i64)<=0{return 3} 111 let key:*u8="nishi-legacy-structural-observation-t219" 112 let state:i64=id_read_evidence(argv[1] as *u8,key,la_len(key),ev) 113 if state!=ID_EVIDENCE_ERROR||ev.system_code!=FIO_EBADMSG{ 114 fsx_puts("{\"observed\":false,\"reason\":\"requires-unmodified-malformed-snapshot\",\"state\":");fsx_putn(state);fsx_puts("}\n") 115 id_evidence_close(ev);sys_munmap_direct(ev as *u8,__size_of(NxIdEvidence));sys_munmap_direct(row as *u8,__size_of(NxIdLegacyRow));return 4 116 } 117 fsx_puts("{\"observed\":true,\"snapshotOnly\":true,\"bytes\":");fsx_putn(ev.bytes) 118 fsx_puts(",\"sha256\":");la_hash(ev.buffer,ev.bytes);fsx_puts(",\"anomalies\":[") 119 var start:i64=0;var count:i64=0 120 while start<ev.bytes{ 121 let rc:i64=id_legacy_row_next(ev.buffer,ev.bytes,start,row) 122 if rc!=1{return 5} 123 if (row.flags&(ID_ROW_EMPTY|ID_ROW_COMMENT))==0{ 124 if row.flags!=0{ 125 if count>0{fsx_puts(",")};count=count+1 126 fsx_puts("{\"offset\":");fsx_putn(row.start);fsx_puts(",\"end\":");fsx_putn(row.end) 127 fsx_puts(",\"flags\":");fsx_putn(row.flags);fsx_puts(",\"tabs\":");fsx_putn(row.tabs) 128 fsx_puts(",\"rowSha256\":");la_hash(ev.buffer+row.start,row.end-row.start) 129 fsx_puts(",\"legacyKeySha256\":");la_hash(ev.buffer+row.legacy_key_start,row.legacy_key_bytes) 130 fsx_puts(",\"segments\":[");var seg:i64=row.start;var sc:i64=0 131 while seg<=row.end{ 132 var end:i64=seg;while end<row.end{if ev.buffer[end]==9 as u8{break};end=end+1} 133 if sc>0{fsx_puts(",")};sc=sc+1 134 fsx_puts("{\"offset\":");fsx_putn(seg);fsx_puts(",\"bytes\":");fsx_putn(end-seg) 135 fsx_puts(",\"grammarKind\":");fsx_putn(la_kind(ev.buffer+seg,end-seg));fsx_puts("}") 136 if end==row.end{break};seg=end+1 137 } 138 fsx_puts("],\"jobRefs\":");la_jobs(ev.buffer+row.start,row.end-row.start);la_split_evidence(ev.buffer,row);fsx_puts("}") 139 } 140 } 141 start=row.next 142 } 143 fsx_puts("],\"anomalyCount\":");fsx_putn(count);fsx_puts(",\"mutationPerformed\":false}\n") 144 id_evidence_close(ev);sys_munmap_direct(ev as *u8,__size_of(NxIdEvidence));sys_munmap_direct(row as *u8,__size_of(NxIdLegacyRow)) 145 return 0 146}