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}