code wiki / _hdl_build / nx_lineage.nx

nx_lineage.nx source

↩ module page · 334 lines · 17903 B

1// nx_lineage.nx -- LIB: SEED-TO-FEED traceability (R0 of the seed-to-feed workstream). The sovereign provenance 2// substrate the operator asked for: "from the beginning up from seeds and the swapping and the genealogy of the 3// seeds ... a full complete from seed to feed (eating) type of thing for all plants, animals, etc ... the 4// ability to have [things] genetically tested for inferiority or superiority aka you are what you eat." 5// 6// THREE aspects of ONE traceable organism (seed / plant / animal): 7// (1) GENEALOGY -- parent_a/parent_b lineage + origin (saved/swapped/bought) + source = seed swapping recorded. 8// (2) LIFECYCLE -- an ADDITIVE chain of custody seed->sown->sprout->grow->harvest->process->distribute->eat 9// (rule 13: history is sacred -- stage events are immutable distinct keys, never overwritten). 10// (3) GENETIC QUALITY -- a superiority/inferiority SCORE computed from RECORDED trait markers (germination, 11// disease-resistance, nutrient-density, yield, vigor). HONEST: the software does NOT sequence DNA; it 12// records results from real lab/field tests (the `tested_by` provenance) and SCORES them -- data-driven 13// weights/threshold in the store (rule 11), nutrient-density weighted highest = "you are what you eat". 14// 15// Sovereign seg-store (knowledge/store/bio-*, NO TSV file), integer-only (no float). "-" sentinel for no-parent 16// (never store "" -- it aliases another literal's bytes). license_tier: ORIGINAL 17import "nx_food_science.nx" 18import "nx_seg_store.nx" 19import "nx_syscalls.nx" 20 21// lifecycle stage codes (ordered seed -> feed) 22const ST_SEED: i64 = 1 23const ST_SOWN: i64 = 2 24const ST_SPROUT: i64 = 3 25const ST_GROW: i64 = 4 26const ST_HARVEST: i64 = 5 27const ST_PROCESS: i64 = 6 28const ST_DISTRIBUTE: i64 = 7 29const ST_EAT: i64 = 8 30 31func ln_stage_label(code: i64) -> *u8 { 32 if code == ST_SEED { return "Seed" as *u8 } 33 if code == ST_SOWN { return "Sown" as *u8 } 34 if code == ST_SPROUT { return "Sprout" as *u8 } 35 if code == ST_GROW { return "Grow" as *u8 } 36 if code == ST_HARVEST { return "Harvest" as *u8 } 37 if code == ST_PROCESS { return "Process" as *u8 } 38 if code == ST_DISTRIBUTE { return "Distribute" as *u8 } 39 if code == ST_EAT { return "Eat" as *u8 } 40 return "Unknown" as *u8 41} 42 43// ---- key builders ------------------------------------------------------------------------------------- 44func ln_org_key(id: *u8, out: *u8) -> i64 { var o: i64 = 0; o = as_append(out, o, "bio:org:" as *u8); o = as_append(out, o, id); out[o] = 0 as u8; return o } 45func ln_gene_key(id: *u8, out: *u8) -> i64 { var o: i64 = 0; o = as_append(out, o, "bio:gene:" as *u8); o = as_append(out, o, id); out[o] = 0 as u8; return o } 46func ln_stagen_key(id: *u8, out: *u8) -> i64 { var o: i64 = 0; o = as_append(out, o, "bio:stagen:" as *u8); o = as_append(out, o, id); out[o] = 0 as u8; return o } 47func ln_stage_key(id: *u8, seq: i64, out: *u8) -> i64 { 48 var o: i64 = 0 49 o = as_append(out, o, "bio:stage:" as *u8); o = as_append(out, o, id) 50 out[o] = 58 as u8; o = o + 1 // ':' 51 o = fd_apnum(out, o, seq) 52 out[o] = 0 as u8 53 return o 54} 55 56// idempotent single-record put (additive: only writes if absent-or-changed). Returns 1 if written. 57func ln_put(prefix: *u8, key: *u8, val: *u8) -> i64 { 58 let vl: i64 = as_len(val) 59 if fd_streq_store(prefix, key, val, vl) == 1 { return 0 } 60 let w: *i64 = ss_begin() 61 ss_add(w, 1, key, val, vl) 62 let seg: i64 = fd_seg_next(prefix) 63 ss_commit(prefix, w, seg) 64 return 1 65} 66 67// ---- (1) GENEALOGY ------------------------------------------------------------------------------------ 68// register a seed/plant/animal. parent_a/parent_b = "-" if none. origin = saved|swapped|bought. source = who/where from. 69func ln_add(prefix: *u8, id: *u8, name: *u8, kind: *u8, variety: *u8, gen: i64, parent_a: *u8, parent_b: *u8, origin: *u8, source: *u8, cite: *u8) -> i64 { 70 let key: *u8 = sys_mmap(96); ln_org_key(id, key) 71 let val: *u8 = sys_mmap(512) 72 var o: i64 = 0 73 o = as_append(val, o, name); val[o] = 9 as u8; o = o + 1 74 o = as_append(val, o, kind); val[o] = 9 as u8; o = o + 1 75 o = as_append(val, o, variety); val[o] = 9 as u8; o = o + 1 76 o = fd_apnum(val, o, gen); val[o] = 9 as u8; o = o + 1 77 o = as_append(val, o, parent_a); val[o] = 9 as u8; o = o + 1 78 o = as_append(val, o, parent_b); val[o] = 9 as u8; o = o + 1 79 o = as_append(val, o, origin); val[o] = 9 as u8; o = o + 1 80 o = as_append(val, o, source); val[o] = 9 as u8; o = o + 1 81 o = as_append(val, o, cite) 82 val[o] = 0 as u8 83 return ln_put(prefix, key, val) 84} 85 86func ln_field_str(prefix: *u8, id: *u8, f: i64, out: *u8) -> i64 { 87 let key: *u8 = sys_mmap(96); ln_org_key(id, key) 88 let pq: *i64 = sys_mmap(16) as *i64 89 let lq: *i64 = sys_mmap(16) as *i64 90 if ss_get(prefix, key, pq, lq) != 1 { out[0] = 0 as u8; return 0 } 91 return fd_field(pq[0] as *u8, lq[0], f, out) 92} 93func ln_exists(prefix: *u8, id: *u8) -> i64 { 94 let key: *u8 = sys_mmap(96); ln_org_key(id, key) 95 let pq: *i64 = sys_mmap(16) as *i64 96 let lq: *i64 = sys_mmap(16) as *i64 97 if ss_get(prefix, key, pq, lq) != 1 { return 0 } 98 return 1 99} 100 101// walk the parent_a lineage to the root, building "id <- parent <- grandparent ..." into out; returns generations up. 102func ln_ancestry(prefix: *u8, id: *u8, out: *u8) -> i64 { 103 var o: i64 = 0 104 let cur: *u8 = sys_mmap(64) 105 var t: i64 = 0 106 while id[t] != (0 as u8) { cur[t] = id[t]; t = t + 1 } cur[t] = 0 as u8 107 var gens: i64 = 0 108 var guard: i64 = 0 109 var go: i64 = 1 110 while go == 1 { 111 if guard >= 64 { go = 0 } else { 112 o = as_append(out, o, cur) 113 let pa: *u8 = sys_mmap(64) 114 ln_field_str(prefix, cur, 4, pa) // field 4 = parent_a 115 if pa[0] == (0 as u8) { go = 0 } else { 116 if fd_streq(pa, "-" as *u8) == 1 { go = 0 } else { 117 o = as_append(out, o, " <- " as *u8) 118 var u: i64 = 0 119 while pa[u] != (0 as u8) { cur[u] = pa[u]; u = u + 1 } cur[u] = 0 as u8 120 gens = gens + 1 121 } 122 } 123 guard = guard + 1 124 } 125 } 126 out[o] = 0 as u8 127 return gens 128} 129 130// ---- (2) LIFECYCLE (additive chain of custody) -------------------------------------------------------- 131func ln_stagen(prefix: *u8, id: *u8) -> i64 { 132 let key: *u8 = sys_mmap(96); ln_stagen_key(id, key) 133 let pq: *i64 = sys_mmap(16) as *i64 134 let lq: *i64 = sys_mmap(16) as *i64 135 if ss_get(prefix, key, pq, lq) != 1 { return 0 } 136 return fd_atoi(pq[0] as *u8, lq[0]) 137} 138// the seq of the stage with `code` for this id, or -1 if not yet recorded. 139func ln_find_stage(prefix: *u8, id: *u8, code: i64) -> i64 { 140 let n: i64 = ln_stagen(prefix, id) 141 var i: i64 = 0 142 while i < n { 143 let key: *u8 = sys_mmap(96); ln_stage_key(id, i, key) 144 let pq: *i64 = sys_mmap(16) as *i64 145 let lq: *i64 = sys_mmap(16) as *i64 146 if ss_get(prefix, key, pq, lq) == 1 { 147 let fb: *u8 = sys_mmap(16) 148 let fl: i64 = fd_field(pq[0] as *u8, lq[0], 0, fb) 149 if fd_atoi(fb, fl) == code { return i } 150 } 151 i = i + 1 152 } 153 return 0 - 1 154} 155// append a lifecycle stage (idempotent by code: a stage already recorded is a no-op). Returns its seq. 156func ln_add_stage(prefix: *u8, id: *u8, code: i64, date: *u8, loc: *u8, actor: *u8, note: *u8) -> i64 { 157 let exist: i64 = ln_find_stage(prefix, id, code) 158 if exist >= 0 { return exist } 159 let seq: i64 = ln_stagen(prefix, id) 160 let key: *u8 = sys_mmap(96); ln_stage_key(id, seq, key) 161 let val: *u8 = sys_mmap(384) 162 var o: i64 = 0 163 o = fd_apnum(val, o, code); val[o] = 9 as u8; o = o + 1 164 o = as_append(val, o, date); val[o] = 9 as u8; o = o + 1 165 o = as_append(val, o, loc); val[o] = 9 as u8; o = o + 1 166 o = as_append(val, o, actor); val[o] = 9 as u8; o = o + 1 167 o = as_append(val, o, note) 168 val[o] = 0 as u8 169 ln_put(prefix, key, val) 170 let nk: *u8 = sys_mmap(96); ln_stagen_key(id, nk) 171 let nv: *u8 = sys_mmap(16); var no: i64 = fd_apnum(nv, 0, seq + 1); nv[no] = 0 as u8 172 ln_put(prefix, nk, nv) 173 return seq 174} 175func ln_stage_field(prefix: *u8, id: *u8, seq: i64, f: i64, out: *u8) -> i64 { 176 let key: *u8 = sys_mmap(96); ln_stage_key(id, seq, key) 177 let pq: *i64 = sys_mmap(16) as *i64 178 let lq: *i64 = sys_mmap(16) as *i64 179 if ss_get(prefix, key, pq, lq) != 1 { out[0] = 0 as u8; return 0 } 180 return fd_field(pq[0] as *u8, lq[0], f, out) 181} 182func ln_stage_code(prefix: *u8, id: *u8, seq: i64) -> i64 { 183 let fb: *u8 = sys_mmap(16) 184 let fl: i64 = ln_stage_field(prefix, id, seq, 0, fb) 185 if fl == 0 { return 0 - 1 } 186 return fd_atoi(fb, fl) 187} 188// 1 if the chain reached the plate (an EAT stage exists) 189func ln_reached_plate(prefix: *u8, id: *u8) -> i64 { if ln_find_stage(prefix, id, ST_EAT) >= 0 { return 1 } return 0 } 190 191// ---- (3) GENETIC QUALITY (recorded trait markers, scored) --------------------------------------------- 192// store config (weights + superiority threshold) -- data-driven, not magic numbers in logic. 193func ln_seed_config(prefix: *u8) -> i64 { 194 var w: i64 = 0 195 w = w + ln_put(prefix, "bio:geneweights" as *u8, "3\t3\t4\t2\t2" as *u8) // germ,disease,NUTRIENT(highest),yield,vigor 196 w = w + ln_put(prefix, "bio:genethreshold" as *u8, "70" as *u8) 197 return w 198} 199func ln_set_gene(prefix: *u8, id: *u8, germ: i64, disease: i64, nutrient: i64, yield: i64, vigor: i64, tested_by: *u8, cite: *u8) -> i64 { 200 let key: *u8 = sys_mmap(96); ln_gene_key(id, key) 201 let val: *u8 = sys_mmap(256) 202 var o: i64 = 0 203 o = fd_apnum(val, o, germ); val[o] = 9 as u8; o = o + 1 204 o = fd_apnum(val, o, disease); val[o] = 9 as u8; o = o + 1 205 o = fd_apnum(val, o, nutrient); val[o] = 9 as u8; o = o + 1 206 o = fd_apnum(val, o, yield); val[o] = 9 as u8; o = o + 1 207 o = fd_apnum(val, o, vigor); val[o] = 9 as u8; o = o + 1 208 o = as_append(val, o, tested_by); val[o] = 9 as u8; o = o + 1 209 o = as_append(val, o, cite) 210 val[o] = 0 as u8 211 return ln_put(prefix, key, val) 212} 213func ln_gene_int(prefix: *u8, id: *u8, f: i64) -> i64 { 214 let key: *u8 = sys_mmap(96); ln_gene_key(id, key) 215 let pq: *i64 = sys_mmap(16) as *i64 216 let lq: *i64 = sys_mmap(16) as *i64 217 if ss_get(prefix, key, pq, lq) != 1 { return 0 - 1 } 218 let fb: *u8 = sys_mmap(16) 219 let fl: i64 = fd_field(pq[0] as *u8, lq[0], f, fb) 220 return fd_atoi(fb, fl) 221} 222func ln_gene_str(prefix: *u8, id: *u8, f: i64, out: *u8) -> i64 { 223 let key: *u8 = sys_mmap(96); ln_gene_key(id, key) 224 let pq: *i64 = sys_mmap(16) as *i64 225 let lq: *i64 = sys_mmap(16) as *i64 226 if ss_get(prefix, key, pq, lq) != 1 { out[0] = 0 as u8; return 0 } 227 return fd_field(pq[0] as *u8, lq[0], f, out) 228} 229func ln_cfg_int(prefix: *u8, key: *u8, f: i64) -> i64 { 230 let pq: *i64 = sys_mmap(16) as *i64 231 let lq: *i64 = sys_mmap(16) as *i64 232 if ss_get(prefix, key, pq, lq) != 1 { return 0 - 1 } 233 let fb: *u8 = sys_mmap(16) 234 let fl: i64 = fd_field(pq[0] as *u8, lq[0], f, fb) 235 return fd_atoi(fb, fl) 236} 237// weighted quality score (0..100) from the recorded markers; -1 if no gene record. 238func ln_quality_score(prefix: *u8, id: *u8) -> i64 { 239 let germ: i64 = ln_gene_int(prefix, id, 0) 240 if germ < 0 { return 0 - 1 } 241 let disease: i64 = ln_gene_int(prefix, id, 1) 242 let nutrient: i64 = ln_gene_int(prefix, id, 2) 243 let yield: i64 = ln_gene_int(prefix, id, 3) 244 let vigor: i64 = ln_gene_int(prefix, id, 4) 245 let wg: i64 = ln_cfg_int(prefix, "bio:geneweights" as *u8, 0) 246 let wd: i64 = ln_cfg_int(prefix, "bio:geneweights" as *u8, 1) 247 let wn: i64 = ln_cfg_int(prefix, "bio:geneweights" as *u8, 2) 248 let wy: i64 = ln_cfg_int(prefix, "bio:geneweights" as *u8, 3) 249 let wv: i64 = ln_cfg_int(prefix, "bio:geneweights" as *u8, 4) 250 let wsum: i64 = wg + wd + wn + wy + wv 251 if wsum <= 0 { return 0 - 1 } 252 return (germ * wg + disease * wd + nutrient * wn + yield * wy + vigor * wv) / wsum 253} 254// 1 = superior (score >= threshold), 0 = inferior or untested 255func ln_is_superior(prefix: *u8, id: *u8) -> i64 { 256 let sc: i64 = ln_quality_score(prefix, id) 257 if sc < 0 { return 0 } 258 let thr: i64 = ln_cfg_int(prefix, "bio:genethreshold" as *u8, 0) 259 if sc >= thr { return 1 } 260 return 0 261} 262// "you are what you eat": the quality that reaches the PLATE = the organism's genetic quality, but ONLY when the 263// chain of custody actually reached the EAT stage (no provenance to the plate -> -1, never a fabricated number). 264func ln_plate_quality(prefix: *u8, id: *u8) -> i64 { 265 if ln_reached_plate(prefix, id) == 0 { return 0 - 1 } 266 return ln_quality_score(prefix, id) 267} 268 269// ---- the SEED-TO-FEED PASSPORT (sovereign no-JS) ------------------------------------------------------ 270func ln_render_passport(prefix: *u8, id: *u8, out: *u8) -> i64 { 271 let nm: *u8 = sys_mmap(96); ln_field_str(prefix, id, 0, nm) 272 let kind: *u8 = sys_mmap(32); ln_field_str(prefix, id, 1, kind) 273 let variety: *u8 = sys_mmap(96); ln_field_str(prefix, id, 2, variety) 274 let origin: *u8 = sys_mmap(32); ln_field_str(prefix, id, 6, origin) 275 let source: *u8 = sys_mmap(96); ln_field_str(prefix, id, 7, source) 276 var o: i64 = 0 277 o = as_append(out, o, "<!doctype html><html lang='en'><head><meta charset='utf-8'><meta name='viewport' content='width=device-width,initial-scale=1'><title>Seed-to-feed passport</title><style>body{margin:0;font-family:system-ui,sans-serif;color:#22301d;background:#f3f7ee;line-height:1.5}header{background:#3a5a2a;color:#fff;padding:22px}header h1{margin:0;font-size:1.4rem}header p{margin:4px 0 0;color:#d8ebca}main{max-width:680px;margin:0 auto;padding:16px}section{background:#fff;border-radius:12px;padding:16px 18px;margin-top:16px;box-shadow:0 1px 0 #e2e8d6}h2{font-size:1.1rem;margin:0 0 8px;color:#3a5a2a;border-bottom:2px solid #cfe0bd;padding-bottom:5px}ol.trace{margin:0;padding-left:20px}ol.trace li{padding:3px 0}dl{display:grid;grid-template-columns:1fr auto;gap:5px 14px;margin:0}dt{color:#54614a}dd{margin:0;font-weight:700;text-align:right;font-variant-numeric:tabular-nums}.verdict{font-size:1.1rem;font-weight:800;padding:10px 14px;border-radius:8px;margin-top:10px}.sup{background:#e6f3d9;color:#2c6b1f}.inf{background:#f6e3df;color:#a23a2a}.muted{color:#54614a;font-size:.88rem}</style></head><body><header><h1>Seed-to-feed passport</h1><p>" as *u8) 278 o = as_append_escaped(out, o, nm, as_len(nm)) 279 o = as_append(out, o, " &mdash; " as *u8) 280 o = as_append_escaped(out, o, variety, as_len(variety)) 281 o = as_append(out, o, "</p></header><main>" as *u8) 282 283 // genealogy 284 o = as_append(out, o, "<section><h2>Genealogy</h2><p>" as *u8) 285 let anc: *u8 = sys_mmap(512); let gens: i64 = ln_ancestry(prefix, id, anc) 286 o = as_append_escaped(out, o, anc, as_len(anc)) 287 o = as_append(out, o, "</p><dl><dt>Generations traced</dt><dd>" as *u8); o = fd_apnum(out, o, gens) 288 o = as_append(out, o, "</dd><dt>Origin</dt><dd>" as *u8); o = as_append_escaped(out, o, origin, as_len(origin)) 289 o = as_append(out, o, "</dd><dt>Source</dt><dd>" as *u8); o = as_append_escaped(out, o, source, as_len(source)) 290 o = as_append(out, o, "</dd></dl></section>" as *u8) 291 292 // lifecycle trace 293 o = as_append(out, o, "<section><h2>From seed to feed</h2><ol class='trace'>" as *u8) 294 let nstg: i64 = ln_stagen(prefix, id) 295 var i: i64 = 0 296 while i < nstg { 297 let code: i64 = ln_stage_code(prefix, id, i) 298 let date: *u8 = sys_mmap(32); ln_stage_field(prefix, id, i, 1, date) 299 o = as_append(out, o, "<li><b>" as *u8) 300 o = as_append(out, o, ln_stage_label(code)) 301 o = as_append(out, o, "</b> &mdash; " as *u8) 302 o = as_append_escaped(out, o, date, as_len(date)) 303 o = as_append(out, o, "</li>" as *u8) 304 i = i + 1 305 } 306 o = as_append(out, o, "</ol></section>" as *u8) 307 308 // genetic quality 309 o = as_append(out, o, "<section><h2>Genetic quality (you are what you eat)</h2>" as *u8) 310 let sc: i64 = ln_quality_score(prefix, id) 311 if sc < 0 { 312 o = as_append(out, o, "<p class='muted'>No trait markers recorded yet.</p>" as *u8) 313 } else { 314 let tb: *u8 = sys_mmap(96); ln_gene_str(prefix, id, 5, tb) 315 o = as_append(out, o, "<dl><dt>Germination</dt><dd>" as *u8); o = fd_apnum(out, o, ln_gene_int(prefix, id, 0)) 316 o = as_append(out, o, "</dd><dt>Disease resistance</dt><dd>" as *u8); o = fd_apnum(out, o, ln_gene_int(prefix, id, 1)) 317 o = as_append(out, o, "</dd><dt>Nutrient density</dt><dd>" as *u8); o = fd_apnum(out, o, ln_gene_int(prefix, id, 2)) 318 o = as_append(out, o, "</dd><dt>Yield</dt><dd>" as *u8); o = fd_apnum(out, o, ln_gene_int(prefix, id, 3)) 319 o = as_append(out, o, "</dd><dt>Vigor</dt><dd>" as *u8); o = fd_apnum(out, o, ln_gene_int(prefix, id, 4)) 320 o = as_append(out, o, "</dd><dt><b>Quality score</b></dt><dd><b>" as *u8); o = fd_apnum(out, o, sc) 321 o = as_append(out, o, "/100</b></dd></dl>" as *u8) 322 if ln_is_superior(prefix, id) == 1 { 323 o = as_append(out, o, "<div class='verdict sup'>Superior strain &mdash; above the quality threshold</div>" as *u8) 324 } else { 325 o = as_append(out, o, "<div class='verdict inf'>Below the superiority threshold</div>" as *u8) 326 } 327 o = as_append(out, o, "<p class='muted'>Trait markers recorded from external lab/field tests (" as *u8) 328 o = as_append_escaped(out, o, tb, as_len(tb)) 329 o = as_append(out, o, "); the Nishi ecosystem records and scores results &mdash; it does not perform DNA sequencing.</p>" as *u8) 330 } 331 o = as_append(out, o, "</section><p class='muted'>Sovereign Nishi passport &mdash; no third-party scripts, no tracking.</p></main></body></html>" as *u8) 332 out[o] = 0 as u8 333 return o 334}