nx_games_page.nx
buildroot/runtime/nx_games_page.nx
about
nx_games_page.nx -- EMIT the live nishifamily.com/games portal page.
Classic abstract/board/puzzle games built from scratch (rules are not copyrightable -> clean
original implementations, no ROMs rehosted, no third-party code). Client behaviour and the shared
emit helpers live in nx_games_js.nx; this organ authors document structure, tokens and copy.
license_tier: ORIGINAL
genealogy_id: nishi_games_portal
lineage_id: nx_games_page_v2
v2 (2026-08-10) closes three MEASURED defects. Full evidence ledger and method:
knowledge/papers/games_portal_measured_2026-08-10.md (compiled by nx_paper_forge, 59 cited rows)
1. REFLOW FAILURE. v1's boards were fixed pixel: #c4 was repeat(7,46px) with 5px gaps and 8px
padding, an intrinsic minimum of 7*46+6*5+2*8 = 368px against a 320px bar, so it overflowed
every phone. v1's @media block resized only #ttt, so republishing v1 would NOT have fixed it.
MEASURED on v1's own artifact by nx_uiq_responsive: worst_grid_min_px=368 reflow_fails=1 RED.
v2 uses intrinsic tracks (repeat(N,1fr) + aspect-ratio), so a board's minimum width follows
its container and cannot be re-fixed by a hardcoded pixel sum.
BAR: W3C WCAG 2.1 SC 1.4.10 Reflow (AA) -- an external standard, not a local taste.
2. TWO PORTALS, ONE NAME. /games and /world/games both shipped the same title and h1 with no
canonical claim. proxy_routes.conf states the estate's own law -- "subdomain = capability,
root path = visitor content" -- and games are visitor content, so /games is canonical. v2 is
the single index and lists the /world/* engines as what they are: engine demos.
3. HONEST STATES. v1 advertised chess, go and reversi as "coming soon" with no engine behind any,
while 21 real nx_wasm_* game organs were listed nowhere. v2 says Playable here / Engine demo /
Not started, and never prints a date it has not earned.
dependencies 2 imports · 0 importers
imports: nx_games_js.nxnx_brand_tokens.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
| 42 | const GM_OUT: *u8 = "web_assets/games.html" |
| 47 | const GM_WORLD_OUT: *u8 = "web_assets/world_games.html" |
| 51 | const GM_BANK: *u8 = "web_assets/sudoku_bank.js" |
| 52 | const GM_CAP: i64 = 262144 |
| 53 | const GM_BCAP: i64 = 131072 |
| 57 | const GM_TOKCAP: i64 = 8192 |
| 63 | const GM_BP_MD: i64 = 860 |
| 64 | const GM_BP_SM: i64 = 640 |
functions
| 83 | func gm_brand() -> *u8 |
| 87 | func main() -> i64 |