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, " — " 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> — " 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 — 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 — it does not perform DNA sequencing.</p>" as *u8)
330 }
331 o = as_append(out, o, "</section><p class='muted'>Sovereign Nishi passport — no third-party scripts, no tracking.</p></main></body></html>" as *u8)
332 out[o] = 0 as u8
333 return o
334}