code wiki / _hdl_build / nx_food_menu_gate.nx

nx_food_menu_gate.nx source

↩ module page · 164 lines · 9417 B

1// nx_food_menu_gate.nx -- GATE: R-MENU. Per-restaurant availability (the original ask). Proves: T1 every 2// restaurant yields a complete build from ONLY its menu, T2 availability honored (Green Wok has no red meat -> 3// never recommends Beef), T3 availability MATTERS (different restaurants -> different recommendations), T4 the 4// directory lists every restaurant, T5 sovereign + availability visible in the rendered pages (Golden Wok page 5// shows Beef, Green Wok page does not), T6 the bundle SHIPS through the publisher. license_tier: ORIGINAL 6import "nx_food_menu.nx" 7import "nx_publisher.nx" 8import "nx_syscalls.nx" 9import "nx_gate_verdict.nx" 10 11const MG_STORE: *u8 = "knowledge/store/food-" 12const MG_CAT: *u8 = "knowledge/registry/nishi_builder.tsv" 13const MG_Q: *u8 = "knowledge/publish/food-queue.tsv" 14const MG_LED: *u8 = "knowledge/publish/food-ledger.tsv" 15const MG_STAGE: *u8 = "knowledge/publish/food-stage" 16const MG_LIVE: *u8 = "knowledge/publish/food-live" 17 18func g_p(s: *u8) -> i64 { var n: i64 = 0; while s[n] != (0 as u8) { n = n + 1 } sys_write(1, s, n); return 0 } 19func g_i(v: i64) -> i64 { 20 let bb: *u8 = sys_mmap(28); var m: i64 = v 21 if m < 0 { sys_write(1, "-" as *u8, 1); m = 0 - m } 22 let t: *u8 = sys_mmap(28); var k: i64 = 0 23 if m == 0 { t[0] = 48 as u8; k = 1 } 24 while m > 0 { t[k] = (48 + (m % 10)) as u8; m = m / 10; k = k + 1 } 25 var i: i64 = 0; while i < k { bb[i] = t[k - 1 - i]; i = i + 1 } sys_write(1, bb, k); return 0 26} 27func g_exists(path: *u8) -> i64 { let fd: i64 = sys_openat_rd(path); if fd < 0 { return 0 } sys_close(fd); return 1 } 28 29// choose for a restaurant's menu (neutral pref); fills build/roles, returns slots filled 30func mg_choose(store: *u8, rest_id: *u8, build: *i64, roles: *i64, prefw: *i64) -> i64 { 31 let avail: *i64 = sys_mmap(8 * 64) as *i64 32 let avoid: *i64 = sys_mmap(8 * 64) as *i64 33 let name: *u8 = sys_mmap(128) 34 if fs_restaurant_avail(store, rest_id, avail, name) == 0 { return 0 } 35 let h: *i64 = fd_world_open(store) 36 fd_set_all(avoid, h[0], 0) 37 let frame: *i64 = sys_mmap(8 * 16) as *i64 38 let nf: i64 = fd_load_frame(store, frame) 39 let wts: *i64 = sys_mmap(8 * 8) as *i64 40 fd_load_weights(store, wts) 41 return fd_choose(h, avail, avoid, prefw, frame, nf, wts, build, roles) 42} 43 44// render restaurant -> stage knowledge/staging/food/<id>.html -> pub_submit; returns submit rc 45func mg_ship_restaurant(store: *u8, cat: *u8, rest_id: *u8) -> i64 { 46 let page: *u8 = sys_mmap(65536) 47 let np: i64 = fs_render_restaurant(store, cat, rest_id, page) 48 if np == 0 { return 0 } 49 let sp: *u8 = sys_mmap(160) 50 var o: i64 = 0 51 o = as_append(sp, o, "knowledge/staging/food/" as *u8); o = as_append(sp, o, rest_id); o = as_append(sp, o, ".html" as *u8); sp[o] = 0 as u8 52 let fd: i64 = sys_openat_wr(sp, 420); if fd >= 0 { sys_write(fd, page, np); sys_close(fd) } 53 let dest: *u8 = sys_mmap(64) 54 var d: i64 = 0 55 d = as_append(dest, d, rest_id); d = as_append(dest, d, ".html" as *u8); dest[d] = 0 as u8 56 return pub_submit_to(MG_Q, sp, dest, "nishifoodfamily" as *u8, "nishi-food" as *u8, "internal" as *u8) 57} 58 59func main() -> i64 { 60 g_p("=== nx_food_menu_gate (R-MENU: best stir-fry from YOUR restaurant's menu) ===\n" as *u8) 61 fd_seed(MG_STORE) 62 fc_seed_veg(MG_STORE) 63 let rs: i64 = fd_seed_restaurants(MG_STORE) 64 fs_teach(MG_CAT) 65 g_p("restaurants seeded this run=" as *u8); g_i(rs); g_p("\n" as *u8) 66 67 let world: *i64 = fd_world_open(MG_STORE) 68 let names: *i64 = world[4] as *i64 69 let beefidx: i64 = fd_index_of(world, "beef" as *u8) 70 let prefw: *i64 = sys_mmap(8 * 8) as *i64 71 var z: i64 = 0; while z < FOOD_NAX { prefw[z] = 0; z = z + 1 } 72 73 let bg: *i64 = sys_mmap(8 * 16) as *i64; let rg: *i64 = sys_mmap(8 * 16) as *i64 74 let bw: *i64 = sys_mmap(8 * 16) as *i64; let rw: *i64 = sys_mmap(8 * 16) as *i64 75 let bs: *i64 = sys_mmap(8 * 16) as *i64; let rsr: *i64 = sys_mmap(8 * 16) as *i64 76 let bm: *i64 = sys_mmap(8 * 16) as *i64; let rm: *i64 = sys_mmap(8 * 16) as *i64 77 let nbg: i64 = mg_choose(MG_STORE, "goldenwok" as *u8, bg, rg, prefw) 78 let nbw: i64 = mg_choose(MG_STORE, "greenwok" as *u8, bw, rw, prefw) 79 let nbs: i64 = mg_choose(MG_STORE, "spicehouse" as *u8, bs, rsr, prefw) 80 let nbm: i64 = mg_choose(MG_STORE, "mongoliangrill" as *u8, bm, rm, prefw) 81 let pgold: *u8 = names[bg[0]] as *u8 82 let pgreen: *u8 = names[bw[0]] as *u8 83 g_p("Golden Wok protein=" as *u8); g_p(pgold); g_p(" | Green Wok protein=" as *u8); g_p(pgreen) 84 g_p(" | Spice House protein=" as *u8); g_p(names[bs[0]] as *u8); g_p("\n" as *u8) 85 86 var pass: i64 = 0 87 var tot: i64 = 0 88 89 // T1 every restaurant builds complete from only its menu 90 tot = tot + 1 91 var ok1: i64 = 1 92 if nbg != 5 { ok1 = 0 } 93 if nbw != 5 { ok1 = 0 } 94 if nbs != 5 { ok1 = 0 } 95 if nbm != 5 { ok1 = 0 } 96 if ok1 == 1 { pass = pass + 1; g_p("PASS T1 all 4 restaurants yield a complete stir-fry from only their menu\n" as *u8) } else { g_p("FAIL T1\n" as *u8) } 97 98 // T2 availability honored: Green Wok carries no red meat -> beef never appears in its build 99 var greenhasbeef: i64 = 0 100 var i: i64 = 0 101 while i < nbw { if bw[i] == beefidx { greenhasbeef = 1 } i = i + 1 } 102 tot = tot + 1 103 if greenhasbeef == 0 { pass = pass + 1; g_p("PASS T2 availability honored: Green Wok (no red meat) never recommends Beef\n" as *u8) } else { g_p("FAIL T2 beef leaked into Green Wok\n" as *u8) } 104 105 // T3 availability MATTERS: different menus -> different recommended protein 106 tot = tot + 1 107 if fd_streq(pgold, pgreen) == 0 { pass = pass + 1; g_p("PASS T3 availability matters: Golden Wok and Green Wok recommend different proteins\n" as *u8) } else { g_p("FAIL T3 same protein\n" as *u8) } 108 109 // render directory + representative pages 110 let dir: *u8 = sys_mmap(65536); let ndir: i64 = fs_render_directory(MG_STORE, MG_CAT, dir) 111 let pgg: *u8 = sys_mmap(65536); let npgg: i64 = fs_render_restaurant(MG_STORE, MG_CAT, "goldenwok" as *u8, pgg) 112 let pgw: *u8 = sys_mmap(65536); let npgw: i64 = fs_render_restaurant(MG_STORE, MG_CAT, "greenwok" as *u8, pgw) 113 114 // T4 directory lists every restaurant + links 115 tot = tot + 1 116 var ok4: i64 = 1 117 if as_contains(dir, ndir, "Golden Wok" as *u8) != 1 { ok4 = 0 } 118 if as_contains(dir, ndir, "Green Wok" as *u8) != 1 { ok4 = 0 } 119 if as_contains(dir, ndir, "Sichuan Spice House" as *u8) != 1 { ok4 = 0 } 120 if as_contains(dir, ndir, "greenwok.html" as *u8) != 1 { ok4 = 0 } 121 if ok4 == 1 { pass = pass + 1; g_p("PASS T4 directory lists all restaurants with links (" as *u8); g_i(ndir); g_p(" bytes)\n" as *u8) } else { g_p("FAIL T4\n" as *u8) } 122 123 // T5 sovereign + availability visible in rendered output 124 tot = tot + 1 125 var ok5: i64 = 1 126 if as_has_thirdparty_js(dir, ndir) != 0 { ok5 = 0 } 127 if as_has_thirdparty_js(pgg, npgg) != 0 { ok5 = 0 } 128 if as_has_thirdparty_js(pgw, npgw) != 0 { ok5 = 0 } 129 if as_contains(pgg, npgg, "Beef" as *u8) != 1 { ok5 = 0 } // Golden Wok serves beef -> on its page 130 if as_contains(pgw, npgw, "Beef" as *u8) != 0 { ok5 = 0 } // Green Wok does not -> never on its page 131 if ok5 == 1 { pass = pass + 1; g_p("PASS T5 sovereign + availability visible (Golden Wok page shows Beef, Green Wok page does not)\n" as *u8) } else { g_p("FAIL T5\n" as *u8) } 132 133 // T6 SHIP the bundle through the publisher 134 sys_mkdir("knowledge/staging" as *u8, 0x1ed) 135 sys_mkdir("knowledge/staging/food" as *u8, 0x1ed) 136 pub_init() 137 sys_mkdir(MG_STAGE, 0x1ed) 138 sys_mkdir(MG_LIVE, 0x1ed) 139 let difd: i64 = sys_openat_wr("knowledge/staging/food/index.html" as *u8, 420); if difd >= 0 { sys_write(difd, dir, ndir); sys_close(difd) } 140 pub_submit_to(MG_Q, "knowledge/staging/food/index.html" as *u8, "index.html" as *u8, "nishifoodfamily" as *u8, "nishi-food" as *u8, "internal" as *u8) 141 mg_ship_restaurant(MG_STORE, MG_CAT, "goldenwok" as *u8) 142 mg_ship_restaurant(MG_STORE, MG_CAT, "greenwok" as *u8) 143 mg_ship_restaurant(MG_STORE, MG_CAT, "spicehouse" as *u8) 144 mg_ship_restaurant(MG_STORE, MG_CAT, "mongoliangrill" as *u8) 145 let pubd: i64 = pub_run_full(MG_Q, MG_LED, MG_STAGE, MG_LIVE, "publish:food-menu" as *u8) 146 g_p(" pub_run_full -> published_this_pass=" as *u8); g_i(pubd); g_p("\n" as *u8) 147 tot = tot + 1 148 var ok6: i64 = 1 149 if g_exists("knowledge/publish/food-live/index.html" as *u8) != 1 { ok6 = 0 } 150 if g_exists("knowledge/publish/food-live/greenwok.html" as *u8) != 1 { ok6 = 0 } 151 if g_exists("knowledge/publish/food-live/goldenwok.html" as *u8) != 1 { ok6 = 0 } 152 if ok6 == 1 { pass = pass + 1; g_p("PASS T6 SHIPPED the restaurant bundle (directory + per-restaurant pages) to liveroot\n" as *u8) } else { g_p("FAIL T6\n" as *u8) } 153 154 g_p("nx_food_menu_gate pass=" as *u8); g_i(pass); g_p("/" as *u8); g_i(tot) 155 // MIGRATED onto nx_gate_verdict by nx_gate_dry_apply (D001, minimal form): every check 156 // row above is untouched, so the PASS/FAIL vector cannot change; only the hand-rolled 157 // verdict emission is replaced by the ONE shared base class. Proven by nx_gate_migrate verify. 158 let ctr__dry: *i64 = gv_ctr() 159 ctr__dry[0] = pass 160 ctr__dry[1] = tot 161 let rc__dry: i64 = gv_verdict("FOOD-MENU-GATE" as *u8, ctr__dry, "per-restaurant availability LIVE: your local menu -> your best stir-fry)" as *u8) 162 sys_exit(rc__dry) 163 return rc__dry 164}