code wiki / _hdl_build / nx_vsroll_lib.nx
nx_vsroll_lib.nx source
↩ module page · 172 lines · 6936 B
1// nx_vsroll_lib.nx -- roll per-SCOPE comparative claims into a DOMAIN verdict by MIN.
2//
3// Everything here works on BUFFERS, not files, so the gate can feed it the ugly cases directly:
4// an empty roster, a roster whose domain has no rows, a claim for the RIGHT scope under the WRONG
5// domain, an unknown earns= label. A ruler that has only ever seen well-formed input is not a
6// ruler -- that lesson cost this lane a 14/14 gate sitting on a lib that fabricated retirements.
7//
8// ★★★★★MIN OVER A HAND-PICKED SUBSET IS A MAX. The roster is declared independently of the claims
9// so a missing axis reads UNMEASURED (refuses) rather than absent (rounds up).
10// license_tier: ORIGINAL No hw writes (Rule 26).
11import "nx_vsbest_lib.nx"
12
13const VR_SCOPE_CAP: i64 = 128
14const VR_OK: i64 = 0
15const VR_NO_ROSTER: i64 = 0 - 1
16const VR_INCOMPLETE: i64 = 0 - 2
17
18// out slots for vr_roll_buf
19const VRO_NREQ: i64 = 0
20const VRO_NHAVE: i64 = 1
21const VRO_MINLV: i64 = 2
22
23func vr_line_end(buf: *u8, p: i64, n: i64) -> i64 {
24 var e: i64 = p
25 var go: i64 = 1
26 while go == 1 { if e >= n { go = 0 } else { if (buf[e] as i64) == 10 { go = 0 } else { e = e + 1 } } }
27 return e
28}
29
30// Copy field `n` (0-based, '|'-separated) of line [p,e) into out. Returns length.
31func vr_field(buf: *u8, p: i64, e: i64, n: i64, out: *u8, cap: i64) -> i64 {
32 var f: i64 = 0
33 var i: i64 = p
34 var o: i64 = 0
35 while i < e {
36 let c: i64 = buf[i] as i64
37 if c == 124 { f = f + 1; if f > n { out[o] = 0 as u8; return o } } else {
38 if f == n { if o < cap - 1 { out[o] = buf[i]; o = o + 1 } }
39 }
40 i = i + 1
41 }
42 out[o] = 0 as u8
43 return o
44}
45
46// earns=<LABEL> on a claim line -> maturity level, or -1 when the label is unknown.
47// An unknown label must NOT silently read as 0/ABSENT: that would let a corrupt or
48// future-versioned ledger line quietly become the MIN and pin a domain at the floor.
49func vr_level_of(buf: *u8, p: i64, e: i64) -> i64 {
50 let tag: *u8 = " earns=" as *u8
51 let tl: i64 = el_len(tag)
52 var i: i64 = p
53 while i + tl <= e {
54 if el_match(buf, i, tag, tl) == 1 {
55 var lv: i64 = 0
56 while lv <= MAT_EXCEED {
57 let lab: *u8 = mat_label(lv)
58 let ll: i64 = el_len(lab)
59 if i + tl + ll <= e { if el_match(buf, i + tl, lab, ll) == 1 { return lv } }
60 lv = lv + 1
61 }
62 return 0 - 1
63 }
64 i = i + 1
65 }
66 return 0 - 1
67}
68
69// Best admitted level for (domain, scope); -1 when no claim exists.
70// BOTH tokens must match on the SAME line -- a claim for scope X under a different domain must not
71// count toward this domain, or every domain sharing an axis name would inherit its neighbour's work.
72func vr_claim_level(cb: *u8, cn: i64, domain: *u8, scope: *u8) -> i64 {
73 let dt: *u8 = sys_mmap(VR_SCOPE_CAP + 32)
74 var o: i64 = ss_cat(dt, 0, " domain=" as *u8)
75 o = ss_cat(dt, o, domain); dt[o] = 32 as u8; dt[o+1] = 0 as u8
76 let st: *u8 = sys_mmap(VR_SCOPE_CAP + 32)
77 o = ss_cat(st, 0, " scope=" as *u8)
78 o = ss_cat(st, o, scope); st[o] = 32 as u8; st[o+1] = 0 as u8
79 let dl: i64 = el_len(dt)
80 let sl: i64 = el_len(st)
81 // RETRACTION IS PART OF THE READ, NOT A SEPARATE PASS (2026-07-31).
82 // The ledger is append-only, so the log is a TIMELINE and the answer is the LATEST state for
83 // this (domain, scope): a VSBEST line sets the level, a VSRETRACT line clears it back to
84 // UNMEASURED, and a later VSBEST can legitimately claim it again after a clean re-run.
85 // WHY THIS EXISTS: I admitted search|latency=behind off a benchmark that had starved our own
86 // engine, and then could not take it back -- nx_vsbest only appends. Five routes to a fabricated
87 // WIN were closed by construction and there was no route to correct an honest MISTAKE.
88 // ★★★★★AN AXIS THAT CANNOT BE UN-CLAIMED CAN BE POISONED BY EXACTLY ONE BAD MEASUREMENT.
89 // Order matters, so this walks the file forward and lets the last word win rather than taking a
90 // max over everything ever written.
91 let rt: *u8 = sys_mmap(64)
92 var ro: i64 = ss_cat(rt, 0, "VSRETRACT " as *u8)
93 rt[ro] = 0 as u8
94 let rl: i64 = el_len(rt)
95 var best: i64 = 0 - 1
96 var p: i64 = 0
97 while p < cn {
98 let e: i64 = vr_line_end(cb, p, cn)
99 if e > p {
100 var hd: i64 = 0
101 var hs: i64 = 0
102 var i: i64 = p
103 while i < e {
104 if i + dl <= e { if el_match(cb, i, dt, dl) == 1 { hd = 1 } }
105 if i + sl <= e { if el_match(cb, i, st, sl) == 1 { hs = 1 } }
106 i = i + 1
107 }
108 if hd == 1 { if hs == 1 {
109 var isret: i64 = 0
110 if p + rl <= e { if el_match(cb, p, rt, rl) == 1 { isret = 1 } }
111 if isret == 1 { best = 0 - 1 } else {
112 let lv: i64 = vr_level_of(cb, p, e)
113 if lv > best { best = lv }
114 }
115 } }
116 }
117 p = e + 1
118 }
119 return best
120}
121
122// idx-th required scope for `domain` in the roster buffer. Returns length, 0 when absent.
123func vr_scope_at(rb: *u8, rn: i64, domain: *u8, idx: i64, out: *u8, cap: i64) -> i64 {
124 let dom: *u8 = sys_mmap(VR_SCOPE_CAP)
125 var seen: i64 = 0
126 var p: i64 = 0
127 while p < rn {
128 let e: i64 = vr_line_end(rb, p, rn)
129 if e > p { if (rb[p] as i64) != 35 {
130 vr_field(rb, p, e, 0, dom, VR_SCOPE_CAP)
131 if el_streq(dom, domain) == 1 {
132 let l: i64 = vr_field(rb, p, e, 1, out, cap)
133 if l > 0 {
134 if seen == idx { return l }
135 seen = seen + 1
136 }
137 }
138 } }
139 p = e + 1
140 }
141 out[0] = 0 as u8
142 return 0
143}
144
145// THE ROLL. out[NREQ]/out[NHAVE]/out[MINLV]. Returns VR_OK, VR_NO_ROSTER or VR_INCOMPLETE.
146// MINLV is only meaningful on VR_OK -- on a refusal there is no domain level, by design.
147func vr_roll_buf(domain: *u8, rb: *u8, rn: i64, cb: *u8, cn: i64, out: *i64) -> i64 {
148 out[VRO_NREQ] = 0
149 out[VRO_NHAVE] = 0
150 out[VRO_MINLV] = 0 - 1
151 let scope: *u8 = sys_mmap(VR_SCOPE_CAP)
152 var minlv: i64 = MAT_EXCEED
153 var idx: i64 = 0
154 var go: i64 = 1
155 while go == 1 {
156 let l: i64 = vr_scope_at(rb, rn, domain, idx, scope, VR_SCOPE_CAP)
157 if l <= 0 { go = 0 } else {
158 out[VRO_NREQ] = out[VRO_NREQ] + 1
159 var lv: i64 = 0 - 1
160 if cn > 0 { lv = vr_claim_level(cb, cn, domain, scope) }
161 if lv >= 0 {
162 out[VRO_NHAVE] = out[VRO_NHAVE] + 1
163 if lv < minlv { minlv = lv }
164 }
165 idx = idx + 1
166 }
167 }
168 if out[VRO_NREQ] == 0 { return VR_NO_ROSTER }
169 if out[VRO_NHAVE] < out[VRO_NREQ] { return VR_INCOMPLETE }
170 out[VRO_MINLV] = minlv
171 return VR_OK
172}