nx_product_board.nx
buildroot/runtime/nx_product_board.nx
about
nx_product_board.nx -- THE PRODUCT CATALOG + ROADMAP, rendered from the `products-` information plane
into the ALREADY-GATED wiki tree (sites/nishifamily/wiki/products.html -> /wiki/products.html).
WHY THIS EXISTS: nx_wiki_products_page claimed in its header AND on the rendered page that it was
"Sourced from knowledge/registry/product_catalog.tsv", but it contained NO file read at all -- all 10
families were hardcoded string literals, so every catalog edit was invisible to the page (debt
1785625149). There was no reader to repoint; the reader never existed. This organ is the reader.
A product is an OUTCOME, and products live in FAMILIES (games contains checkers and chess). Families
are NOT hardcoded here either: they are the DISTINCT values of the family column in first-seen order,
so a new family appears by adding ONE plane row -- the same property that makes nx_research_ocean
free to extend. Adding a product must cost a data row, never code (the gen-2 golden-path bar).
GATING: this writes INTO /wiki, which is OPAQUE-gated by nx_sites_daemon_v2 (no X-Nishi-Session +
text/html -> login bootstrap; else proxy to the session-validating gateway, fail-closed). Product
strategy is therefore behind the wall BY PLACEMENT, using the wall that already exists rather than
standing up a second one. Research stays public in its own rivers.
Reads with sts_load_honest so a stale q:n cannot silently truncate the catalog and present a partial
board as complete; declared/loaded/rendered are printed on the page itself.
Plane row (8 col): id family product arc status governance evidence rung
license_tier: ORIGINAL No hw writes (Rule 26). expect_exit: 0
dependencies 3 imports · 0 importers
imports: nx_store_seed_lib.nxnx_seg_store.nxnx_syscalls.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
| 28 | const PB_PLANE: *u8 = "knowledge/store/products-" |
| 29 | const PB_OUT: *u8 = "sites/nishifamily/wiki/products.html" |
| 30 | const PB_RCAP: i64 = 262144 |
| 31 | const PB_HCAP: i64 = 524288 |
| 32 | const PB_NL: i64 = 10 |
| 33 | const PB_TAB: i64 = 9 |
| 34 | const PB_MAXCOL: i64 = 16 |
| 35 | const PB_PAIR: i64 = 2 |
| 36 | const PB_SPB: i64 = 256 |
| 37 | const PB_MAXFAM: i64 = 32 |
| 38 | const PB_FAMB: i64 = 512 |
| 39 | const PB_FLAGB: i64 = 64 |
| 40 | const PB_C_FAM: i64 = 1 |
| 41 | const PB_C_PROD: i64 = 2 |
| 42 | const PB_C_ARC: i64 = 3 |
| 43 | const PB_C_STATUS: i64 = 4 |
| 44 | const PB_C_GOV: i64 = 5 |
| 45 | const PB_C_EV: i64 = 6 |
| 46 | const PB_C_RUNG: i64 = 7 |
| 47 | const PB_NCOL: i64 = 8 |
| 48 | const PB_MODE: i64 = 0x1a4 |
| 49 | const PB_ERRFD: i64 = 2 |
| 50 | const PB_EXIT_IO: i64 = 1 |
| 51 | const PB_EXIT_EMPTY: i64 = 3 |
| 52 | const PB_LT: i64 = 60 |
| 53 | const PB_GT: i64 = 62 |
| 54 | const PB_AMP: i64 = 38 |
functions
| 56 | func pb_slen(s: *u8) -> i64 { var n: i64 = 0; while s[n] != (0 as u8) { n = n + 1 } return n } |
| 57 | func pb_werr(s: *u8) -> i64 { sys_write(PB_ERRFD, s, pb_slen(s)); return 0 } |
| 58 | func pb_slice_eqs(q: *u8, a: i64, b: i64, s: *u8) -> i64 |
| 65 | func pb_slice_eq(q: *u8, a: i64, b: i64, r: *u8, c: i64, d: i64) -> i64 called by 1: main |
| 71 | func pb_cols(q: *u8, ls: i64, le: i64, sp: *i64) -> i64 called by 1: main |
| 86 | func pb_cat_esc(d: *u8, o: i64, q: *u8, a: i64, b: i64) -> i64 |
| 100 | func main() -> i64 |