code wiki / _hdl_build / nx_growth_series.nx
nx_growth_series.nx
buildroot/runtime/_hdl_build/nx_growth_series.nx
about
nx_growth_series.nx -- THE TIME SPINE for the exec/managerial/operational wedding cake.
nx_pm_board emits the three tiers correctly. What the estate had NOWHERE was TIME: measured
2026-08-15, ecomat hist EMPTY, frontier hist EMPTY, comparewatch unseeded, token_efficiency.log
1417B -- so no board could answer "how did this change since last week".
A LEVEL CANNOT EXPRESS GROWTH: growth is a DERIVATIVE and needs two samples in time.
This organ adds ONLY that dimension. Every number it records is COMPOSED from nx_pm_board through
tr_run_capture and every historical number is READ from journals already on disk. Zero measurement
logic is duplicated: one ruler per figure.
nx_growth_series beat [log] [board-elf] -> append ONE dated row; a BEAT-FAIL is ALSO a row
nx_growth_series report [log] -> d/w/m deltas + the per-axis HORIZON
nx_growth_series mine [journal] -> retro-computed workstream history, FULL population
nx_growth_series selftest [scratchlog] -> gate teeth incl. named negative controls
ROW SHAPE -- the ECOMAT shape already proven in knowledge/status/ecosystem_maturity.log, so reader
idiom transfers. Line-anchored, each field name appears EXACTLY ONCE, canonical verdict LAST so a
positional reader can anchor on it.
A FIELD THAT COULD NOT BE READ IS -1, NEVER 0. "Could not look" and "measured zero" are different
facts, and a series that confuses them reports a collapse that never happened.
NO GUESSED CEILINGS. Every buffer here is sized from the thing that fills it -- needles from the
key, emit lines from the field count, the mine day-grid from the journal's own epoch span. The one
remaining bound (GS_BOARDCAP) guards a SUBPROCESS's output, whose size is genuinely unknowable in
advance; it is named for that single purpose and its truncation ANNOUNCES as a RED row rather than
being absorbed. A ceiling that has to be guessed is a defect generator in both directions.
license_tier: ORIGINAL No hw writes (Rule 26). expect_exit: 0
dependencies 3 imports · 0 importers
imports: nx_sovjson_lib.nxnx_syscalls.nxnx_tool_run.nx
imported by: nobody (leaf or entry point)
call flow from main pre-order; caps 40 nodes / depth 6 declared; ↻ = already shown
structs
| none |
consts
| 38 | const GS_BOARDCAP: i64 = 4194304 |
| 39 | const GS_MODE: i64 = 420 |
| 41 | const GS_TAB: i64 = 9 |
| 42 | const GS_NL: i64 = 10 |
| 43 | const GS_SPACE: i64 = 32 |
| 44 | const GS_QUOTE: i64 = 34 |
| 45 | const GS_MINUS: i64 = 45 |
| 46 | const GS_SLASH: i64 = 47 |
| 47 | const GS_D0: i64 = 48 |
| 48 | const GS_D9: i64 = 57 |
| 49 | const GS_COLON: i64 = 58 |
| 50 | const GS_EQ: i64 = 61 |
| 51 | const GS_LBRACK: i64 = 91 |
| 52 | const GS_RBRACK: i64 = 93 |
| 55 | const GS_DAY: i64 = 86400 |
| 56 | const GS_WEEK: i64 = 604800 |
| 57 | const GS_MONTH: i64 = 2592000 |
| 58 | const GS_ABSENT: i64 = 0 - 1 |
| 90 | const GS_NF: i64 = 20 |
| 92 | const GS_VK: i64 = 0 |
| 93 | const GS_VB: i64 = 1 |
| 94 | const GS_VD: i64 = 2 |
| 95 | const GS_VR: i64 = 3 |
| 96 | const GS_VO: i64 = 4 |
| 97 | const GS_NV: i64 = 5 |
functions
| 99 | func gs_strlen(s: *u8) -> i64 { var n: i64 = 0; while s[n] != (0 as u8) { n = n + 1 } return n } |
| 100 | func gs_puts(s: *u8) -> i64 { sys_write(1, s, gs_strlen(s)); return 0 } |
| 101 | func gs_werr(s: *u8) -> i64 { sys_write(2, s, gs_strlen(s)); return 0 } |
| 105 | func gs_linecap() -> i64 { return GS_NF * 128 + 1024 } |
| 107 | func gs_names(t: *i64) -> i64 |
| 131 | func gs_streq(a: *u8, b: *u8) -> i64 called by 1: main |
| 142 | func gs_append(path: *u8, buf: *u8, n: i64) -> i64 |
| 153 | func gs_find(buf: *u8, from: i64, to: i64, pat: *u8, pl: i64) -> i64 |
| 171 | func gs_findz(buf: *u8, from: i64, to: i64, pat: *u8) -> i64 { return gs_find(buf, from, to, pat, gs_strlen(pat)) } |
| 173 | func gs_all_digits(buf: *u8, s: i64, e: i64) -> i64 called by 1: gs_frame |
| 191 | func gs_needle_json(key: *u8, outlen: *i64) -> *u8 |
| 205 | func gs_needle_row(key: *u8, outlen: *i64) -> *u8 |
| 219 | func gs_num_at(buf: *u8, to: i64, start: i64) -> i64 |
| 245 | func gs_json_int(buf: *u8, from: i64, to: i64, key: *u8) -> i64 |
| 255 | func gs_json_count(buf: *u8, from: i64, to: i64, key: *u8) -> i64 |
| 278 | func gs_region(buf: *u8, to: i64, key: *u8, nextkey: *u8, out: *i64) -> i64 |
| 302 | func gs_axis_adoption(elf: *u8) -> i64 |
| 334 | func gs_axis_finance(elf: *u8, v: *i64) -> i64 |
| 368 | func gs_axis_laws(elf: *u8, v: *i64) -> i64 |
| 396 | func gs_axis_owner(elf: *u8, v: *i64) -> i64 |
| 414 | func gs_beat(logp: *u8, boardelf: *u8, adoptelf: *u8, effelf: *u8, lawelf: *u8, ownelf: *u8) -> i64 |
| 486 | func gs_row_field(buf: *u8, s: i64, e: i64, key: *u8) -> i64 |
| 497 | func gs_observed(be: i64, ecur: i64) -> i64 |
| 503 | func gs_report(logp: *u8) -> i64 called by 2: gs_selftestmain calls 12: sys_mmapsys_read_filegs_putsgs_namessys_now_realtime_secgs_row_field+6 |
| 629 | func gs_prefix_at(buf: *u8, s: i64, e: i64, pat: *u8) -> i64 called by 1: gs_frame |
| 648 | func gs_frame(buf: *u8, s: i64, e: i64, out: *i64) -> i64 |
| 670 | func gs_mine_scan(buf: *u8, n: i64, tot: *i64, meta: *i64) -> i64 |
| 699 | func gs_mine(jrnl: *u8) -> i64 |
| 883 | func gs_t(nm: *u8, got: i64, want: i64, ctr: *i64) -> i64 |
| 900 | func gs_q(d: *u8, p: i64) -> i64 { d[p] = GS_QUOTE as u8; return p + 1 } |
| 902 | func gs_fixture(d: *u8) -> i64 |
| 936 | func gs_jfixture(d: *u8) -> i64 |
| 963 | func gs_ffixture(d: *u8) -> i64 |
| 987 | func gs_lfixture(d: *u8) -> i64 |
| 1011 | func gs_selftest(scratch: *u8) -> i64 |
| 1127 | func main(argc: i64, argv: *i64) -> i64 |