nx_analyst_dashboard.nx source
↩ module page · 195 lines · 12790 B
1// nx_analyst_dashboard.nx -- F1007: the BI DASHBOARD, DATA-BOUND and served on nishifamily.com. It is not
2// a hardcoded status page: it READS the census SSOT (dataeng_sota_features.conf) and a live stored dataset
3// (azdemo) and RENDERS from that data server-side -- regenerating reflects the current numbers, the same
4// model Superset/Metabase use. Emits a complete, self-contained, accessible, theme-consistent HTML page
5// (the site design system, high-contrast dark). Honest scope: server-side data binding + real analysis;
6// a client-side interactive QUERY BUILDER is the finer gap. license_tier: ORIGINAL No hardware writes.
7import "nx_syscalls.nx"
8import "nx_estate_path.nx" // ep_anchor: the CWD must not decide this organ's verdict
9import "_hdl_build/nx_analyst_store.nx"
10import "nx_analyst_infer.nx"
11const DB_MAGIC_100000: i64 = 100000
12
13const DB_OUT: i64 = 65536
14const DB_CONF_CAP: i64 = 262144 // the census SSOT is ~18KB and GROWS; a 16KB buffer silently
15// dropped the tail rows (the last PARTIAL + both EXCEED) and undercounted 34->31. Match the census organ.
16const DB_TAB: i64 = 9
17const DB_NL: i64 = 10
18const DB_HASH: i64 = 35
19const DB_ZERO: i64 = 48
20
21func db_raw(out: *u8, o: i64, s: *u8) -> i64 { var i: i64 = 0; while s[i] != (0 as u8) { out[o] = s[i]; o = o + 1; i = i + 1 } return o }
22func db_num(out: *u8, o: i64, v: i64) -> i64 {
23 var oo: i64 = o
24 var m: i64 = v
25 if m < 0 { out[oo] = 45 as u8; oo = oo + 1; m = 0 - m }
26 let t: *u8 = sys_mmap(24)
27 var k: i64 = 0
28 if m == 0 { t[0] = DB_ZERO as u8; k = 1 }
29 while m > 0 { t[k] = (DB_ZERO + (m % 10)) as u8; m = m / 10; k = k + 1 }
30 var i: i64 = k - 1
31 while i >= 0 { out[oo] = t[i]; oo = oo + 1; i = i - 1 }
32 return oo
33}
34func db_streq_span(buf: *u8, a: i64, b: i64, lit: *u8) -> i64 {
35 var i: i64 = 0
36 while a + i < b { if lit[i] == (0 as u8) { return 0 } if buf[a+i] != lit[i] { return 0 } i = i + 1 }
37 if lit[i] != (0 as u8) { return 0 }
38 return 1
39}
40// count census statuses from the conf; writes have/part/gap/exc/tot into c[0..4]
41func db_census(c: *i64) -> i64 {
42 var i: i64 = 0
43 while i < 6 { c[i] = 0; i = i + 1 }
44 let fd: i64 = sys_openat_rd("knowledge/registry/dataeng_sota_features.conf" as *u8)
45 if fd < 0 { return 0 }
46 let cb: *u8 = sys_mmap(DB_CONF_CAP)
47 var n: i64 = 0
48 var r: i64 = 1
49 while r > 0 { if n >= DB_CONF_CAP { r = 0 } else { r = sys_read(fd, (((cb as i64) + n) as *u8), DB_CONF_CAP - n); if r > 0 { n = n + r } } }
50 sys_close(fd)
51 if n >= DB_CONF_CAP { c[5] = 1 } // buffer filled => the conf may be truncated; count is unreliable
52 var ls: i64 = 0
53 while ls < n {
54 var le: i64 = ls
55 var e: i64 = 0
56 while e == 0 { if le >= n { e = 1 } else { if cb[le] == (DB_NL as u8) { e = 1 } else { le = le + 1 } } }
57 if le > ls { if cb[ls] != (DB_HASH as u8) {
58 // the census row is feature<TAB>tier<TAB>STATUS<TAB>organ<TAB>note -- the STATUS is field
59 // index 2 (0-based), NOT field 1. Walk the tab-fields and capture field 2's [start,end).
60 var fld: i64 = 0
61 var fstart: i64 = ls
62 var f2s: i64 = 0 - 1
63 var f2e: i64 = le
64 var i: i64 = ls
65 while i <= le {
66 var cut: i64 = 0
67 if i == le { cut = 1 } else { if cb[i] == (DB_TAB as u8) { cut = 1 } }
68 if cut == 1 { if fld == 2 { f2s = fstart; f2e = i } fld = fld + 1; fstart = i + 1 }
69 i = i + 1
70 }
71 if f2s >= 0 {
72 if db_streq_span(cb, f2s, f2e, "HAVE" as *u8) == 1 { c[0] = c[0] + 1; c[4] = c[4] + 1 }
73 if db_streq_span(cb, f2s, f2e, "PARTIAL" as *u8) == 1 { c[1] = c[1] + 1; c[4] = c[4] + 1 }
74 if db_streq_span(cb, f2s, f2e, "GAP" as *u8) == 1 { c[2] = c[2] + 1; c[4] = c[4] + 1 }
75 if db_streq_span(cb, f2s, f2e, "EXCEED" as *u8) == 1 { c[3] = c[3] + 1; c[4] = c[4] + 1 }
76 }
77 } }
78 ls = le + 1
79 }
80 return 1
81}
82// a horizontal bar row: label, count, color-class, out of total
83func db_bar(out: *u8, o: i64, label: *u8, cnt: i64, tot: i64, color: *u8) -> i64 {
84 var pct: i64 = 0
85 if tot > 0 { pct = cnt * 100 / tot }
86 o = db_raw(out, o, "<div class=\"barrow\"><span class=\"blab\">" as *u8)
87 o = db_raw(out, o, label)
88 o = db_raw(out, o, "</span><span class=\"btrack\"><span class=\"bfill\" style=\"width:" as *u8)
89 o = db_num(out, o, pct)
90 o = db_raw(out, o, "%;background:" as *u8)
91 o = db_raw(out, o, color)
92 o = db_raw(out, o, "\"></span></span><span class=\"bval\">" as *u8)
93 o = db_num(out, o, cnt)
94 o = db_raw(out, o, "</span></div>" as *u8)
95 return o
96}
97// one analysis table row for a candidate column vs the target
98func db_relrow(out: *u8, o: i64, name: *u8, tcol: *i64, ccol: *i64, n: i64) -> i64 {
99 let r: i64 = am_pearson_milli(tcol, ccol, n)
100 let sig: i64 = ai_r_significant(r, n)
101 let cls: *u8 = sys_mmap(64)
102 am_class(0 as *u8, r, cls)
103 let lo: *i64 = sys_mmap(8) as *i64
104 let hi: *i64 = sys_mmap(8) as *i64
105 o = db_raw(out, o, "<tr><td>" as *u8)
106 o = db_raw(out, o, name)
107 o = db_raw(out, o, "</td><td class=\"mono\">" as *u8)
108 o = db_num(out, o, r)
109 o = db_raw(out, o, "</td><td>" as *u8)
110 if sig == 1 { o = db_raw(out, o, "<span class=\"tag ok\">significant</span>" as *u8) } else { o = db_raw(out, o, "<span class=\"tag mut\">not significant</span>" as *u8) }
111 o = db_raw(out, o, "</td><td class=\"mono\">" as *u8)
112 if ai_r_ci(r, n, 50, lo, hi) == 1 { o = db_num(out, o, lo[0]); o = db_raw(out, o, " to " as *u8); o = db_num(out, o, hi[0]) } else { o = db_raw(out, o, "—" as *u8) }
113 o = db_raw(out, o, "</td><td>" as *u8)
114 o = db_raw(out, o, cls)
115 o = db_raw(out, o, "</td></tr>" as *u8)
116 return o
117}
118// build the full page into out; returns byte length
119func db_build(out: *u8) -> i64 {
120 let c: *i64 = sys_mmap(8 * 6) as *i64
121 db_census(c)
122 let tot: i64 = c[4]
123 var meet: i64 = 0
124 if tot > 0 { meet = (c[0] * 2 + c[3] * 2 + c[1]) * 1000 / (tot * 2) }
125
126 var o: i64 = 0
127 o = db_raw(out, o, "<!DOCTYPE html><html lang=\"en\"><head><meta charset=\"utf-8\"><meta name=\"viewport\" content=\"width=device-width,initial-scale=1\"><title>Nishi Analyst — Data Dashboard</title><style>" as *u8)
128 o = db_raw(out, o, ":root{--bg:#0b1013;--pan:#131b20;--ln:#243139;--ink:#e7eef1;--i2:#b3c2ca;--mut:#7f93a0;--ac:#3fbecb;--good:#48be6a;--warn:#d99a2b;--crit:#e06561;--prod:#5ab0e0;--mo:ui-monospace,Consolas,monospace}" as *u8)
129 o = db_raw(out, o, "*{box-sizing:border-box}body{margin:0;background:var(--bg);color:var(--ink);font:15px/1.5 system-ui,-apple-system,sans-serif}" as *u8)
130 o = db_raw(out, o, ".wrap{max-width:1040px;margin:0 auto;padding:24px 18px 60px}" as *u8)
131 o = db_raw(out, o, ".nav{display:flex;flex-wrap:wrap;gap:4px;margin-bottom:20px;border-bottom:1px solid var(--ln);padding-bottom:12px;font:600 12px var(--mo)}" as *u8)
132 o = db_raw(out, o, ".nav a{color:var(--i2);text-decoration:none;padding:6px 11px;border-radius:7px}.nav a:hover{background:var(--pan);color:var(--ink)}.nav a.on{background:var(--ac);color:#04191c}" as *u8)
133 o = db_raw(out, o, "h1{font-size:24px;margin:0;letter-spacing:-.01em}.sub{color:var(--mut);font-size:13px;margin-top:4px}" as *u8)
134 o = db_raw(out, o, ".pulse{display:flex;flex-wrap:wrap;gap:8px;margin:16px 0}" as *u8)
135 o = db_raw(out, o, ".pill{font:12px var(--mo);padding:6px 11px;border:1px solid var(--ln);border-radius:999px;color:var(--i2)}.pill b{color:var(--ink)}.pill.ok{border-color:#2f6b46;background:#48be6a1e}.pill.big{font-size:14px}.pill.big b{color:var(--ac)}" as *u8)
136 o = db_raw(out, o, "h2{font:600 12.5px var(--mo);letter-spacing:.15em;text-transform:uppercase;color:var(--ac);margin:30px 0 12px;border-bottom:1px solid var(--ln);padding-bottom:7px}" as *u8)
137 o = db_raw(out, o, ".barrow{display:flex;align-items:center;gap:12px;margin:9px 0}.blab{width:88px;font:600 12px var(--mo);color:var(--i2)}.btrack{flex:1;height:16px;background:var(--pan);border:1px solid var(--ln);border-radius:6px;overflow:hidden}.bfill{display:block;height:100%}.bval{width:34px;text-align:right;font:600 13px var(--mo)}" as *u8)
138 o = db_raw(out, o, ".scroll{overflow-x:auto;border:1px solid var(--ln);border-radius:10px;background:var(--pan)}table{border-collapse:collapse;width:100%;min-width:520px;font-size:13px}" as *u8)
139 o = db_raw(out, o, "th,td{text-align:left;padding:9px 13px;border-bottom:1px solid var(--ln)}th{font:600 11px var(--mo);letter-spacing:.06em;text-transform:uppercase;color:var(--mut)}tr:last-child td{border-bottom:0}.mono{font:13px var(--mo);color:var(--i2)}" as *u8)
140 o = db_raw(out, o, ".tag{font:600 11px var(--mo);padding:3px 8px;border-radius:999px}.tag.ok{background:#48be6a22;color:var(--good)}.tag.mut{background:#7f93a022;color:var(--mut)}" as *u8)
141 o = db_raw(out, o, "footer{margin-top:40px;color:var(--mut);font-size:12px;border-top:1px solid var(--ln);padding-top:14px}a{color:var(--ac)}" as *u8)
142 o = db_raw(out, o, "</style></head><body><div class=\"wrap\">" as *u8)
143 o = db_raw(out, o, "<nav class=\"nav\"><a href=\"/\">home</a><a href=\"/compare/dataeng\">compare</a><a class=\"on\" href=\"/analyst.html\">analyst</a><a href=\"/maturity.html\">maturity</a></nav><main>" as *u8)
144 o = db_raw(out, o, "<h1>Nishi Analyst — Data Dashboard</h1>" as *u8)
145 o = db_raw(out, o, "<p class=\"sub\">Data-bound & rendered server-side: the census below is counted live from the feature registry, and the analysis is computed live over a stored dataset. Every statistic is integer-exact and reproducible. Regenerating the page reflects the current numbers — no hand-editing.</p>" as *u8)
146
147 o = db_raw(out, o, "<div class=\"pulse\"><span class=\"pill big\">meet-SOTA <b>" as *u8)
148 o = db_num(out, o, meet)
149 o = db_raw(out, o, "</b>/1000</span><span class=\"pill ok\">HAVE <b>" as *u8)
150 o = db_num(out, o, c[0])
151 o = db_raw(out, o, "</b></span><span class=\"pill\">PARTIAL <b>" as *u8)
152 o = db_num(out, o, c[1])
153 o = db_raw(out, o, "</b></span><span class=\"pill\">GAP <b>" as *u8)
154 o = db_num(out, o, c[2])
155 o = db_raw(out, o, "</b></span><span class=\"pill\">EXCEED <b>" as *u8)
156 o = db_num(out, o, c[3])
157 o = db_raw(out, o, "</b></span></div>" as *u8)
158
159 o = db_raw(out, o, "<h2>Capability census composition</h2>" as *u8)
160 o = db_bar(out, o, "HAVE" as *u8, c[0], tot, "var(--good)" as *u8)
161 o = db_bar(out, o, "PARTIAL" as *u8, c[1], tot, "var(--prod)" as *u8)
162 o = db_bar(out, o, "GAP" as *u8, c[2], tot, "var(--warn)" as *u8)
163 o = db_bar(out, o, "EXCEED" as *u8, c[3], tot, "var(--ac)" as *u8)
164
165 // ---- live analysis over the azdemo store -----------------------------------------------------
166 let sz: *i64 = sys_mmap(8 * DB_MAGIC_100000) as *i64
167 let ag: *i64 = sys_mmap(8 * DB_MAGIC_100000) as *i64
168 let pr: *i64 = sys_mmap(8 * DB_MAGIC_100000) as *i64
169 let fl: *i64 = sys_mmap(8) as *i64
170 fl[0] = 0
171 let n: i64 = asr_load_field_sharded("knowledge/store/azdemo-" as *u8, "row" as *u8, 0, sz, DB_MAGIC_100000, 64, fl)
172 asr_load_field_sharded("knowledge/store/azdemo-" as *u8, "row" as *u8, 1, ag, DB_MAGIC_100000, 64, fl)
173 asr_load_field_sharded("knowledge/store/azdemo-" as *u8, "row" as *u8, 2, pr, DB_MAGIC_100000, 64, fl)
174 o = db_raw(out, o, "<h2>Live analysis — what associates with price (" as *u8)
175 o = db_num(out, o, n)
176 o = db_raw(out, o, " rows)</h2><div class=\"scroll\"><table><thead><tr><th>variable</th><th>r ×1000</th><th>significance</th><th>95% CI ×1000</th><th>strength</th></tr></thead><tbody>" as *u8)
177 o = db_relrow(out, o, "size" as *u8, pr, sz, n)
178 o = db_relrow(out, o, "age" as *u8, pr, ag, n)
179 o = db_raw(out, o, "</tbody></table></div>" as *u8)
180
181 o = db_raw(out, o, "<footer>Served bits-up by the Nishi stack — TLS 1.3, no third-party web server, no client framework. Analytics: 100% integer / fixed-point (bit-reproducible). Call the same engine as an agent: <span class=\"mono\">nx_analyze ask "what drives price"</span>. This dashboard is the view; <a href=\"/compare/dataeng\">/compare/dataeng</a> is the full census.</footer>" as *u8)
182 o = db_raw(out, o, "</main></div></body></html>" as *u8)
183 out[o] = 0 as u8
184 return o
185}
186func main(argc: i64, argv: *i64) -> i64 {
187 // ANCHOR FIRST (2026-08-04, nx_cwdguard finding): this organ reads a RELATIVE
188 // knowledge/ path, so its answer depended on where it was launched. No-op when
189 // already at the estate root, so the cron/MCP context is unchanged.
190 ep_anchor()
191 let out: *u8 = sys_mmap(DB_OUT)
192 let n: i64 = db_build(out)
193 sys_write(1, out, n)
194 return 0
195}