code wiki / _hdl_build / nx_cap_type_classify.nx
nx_cap_type_classify.nx source
↩ module page · 153 lines · 6842 B
1// nx_cap_type_classify.nx -- the census CAPABILITY-TYPE classifier (L7 of the
2// sovereign-data-substrate roadmap). Pure NishiLang, NO SQL. Maps a capability's
3// name/path to a normalized capability-type via a DATA-DRIVEN keyword rule table
4// (Rule #11), first-match-wins, so nx_dedup_audit's clustering can run ACROSS
5// subsystems. Tutored by Claude (the LLM novel-module rung); the gate below is
6// self-contained (no enumerator dependency) so the Engineer can verify it now.
7// license_tier: ORIGINAL
8import "nx_syscalls.nx"
9
10const CT_OTHER: i64 = 0
11const CT_IMAGE_GEN: i64 = 1
12const CT_GARMENT: i64 = 2
13const CT_CHARACTER: i64 = 3
14const CT_SCENE: i64 = 4
15const CT_CAPTION: i64 = 5
16const CT_QUALITY: i64 = 6
17const CT_FORENSICS: i64 = 7
18const CT_SCRAPE: i64 = 8
19const CT_STORAGE: i64 = 9
20const CT_SEARCH: i64 = 10
21const CT_UI: i64 = 11
22const CT_API: i64 = 12
23const CT_DEPLOY: i64 = 13
24const CT_ORCH: i64 = 14
25const CT_GOVERN: i64 = 15
26const CT_TRAIN: i64 = 16
27const MAXR: i64 = 64
28
29func pr_n(v: i64) -> i64 {
30 let b: *u8 = sys_mmap(28); var m: i64 = v; let t: *u8 = sys_mmap(28); var k: i64 = 0
31 if m == 0 { t[0] = 48 as u8; k = 1 }
32 while m > 0 { t[k] = (48 + (m % 10)) as u8; m = m / 10; k = k + 1 }
33 var i: i64 = 0
34 while i < k { b[i] = t[k - 1 - i]; i = i + 1 }
35 sys_write(1, b, k); return 0
36}
37
38func _puts(s: *u8) -> i64 {
39 var n: i64 = 0
40 while (s[n] as i64) != 0 { n = n + 1 }
41 sys_write(1, s, n); return 0
42}
43
44func _slen(s: *u8) -> i64 {
45 var n: i64 = 0
46 while (s[n] as i64) != 0 { n = n + 1 }
47 return n
48}
49
50// substring search: is `needle` (len nn) anywhere in `hay` (len hn)?
51func _contains(hay: *u8, hn: i64, needle: *u8, nn: i64) -> i64 {
52 if nn <= 0 { return 0 }
53 if nn > hn { return 0 }
54 var i: i64 = 0
55 while i + nn <= hn {
56 var k: i64 = 0
57 var matched: i64 = 1
58 while k < nn {
59 let a: i64 = (hay[i + k] as i64) & 255
60 let b: i64 = (needle[k] as i64) & 255
61 if a != b { matched = 0; k = nn }
62 else { k = k + 1 }
63 }
64 if matched == 1 { return 1 }
65 i = i + 1
66 }
67 return 0
68}
69
70// classify a capability name/path -> capability-type (first matching rule wins;
71// order = specific-before-generic; SEARCH before bare "arc" since "search" contains "arc")
72func classify(name: *u8, nlen: i64) -> i64 {
73 let kw: *i64 = sys_mmap(8 * MAXR) as *i64
74 let kl: *i64 = sys_mmap(8 * MAXR) as *i64
75 let kt: *i64 = sys_mmap(8 * MAXR) as *i64
76 var r: i64 = 0
77 kw[r]="tryon" as *u8 as i64; kl[r]=5; kt[r]=CT_GARMENT; r=r+1
78 kw[r]="vton" as *u8 as i64; kl[r]=4; kt[r]=CT_GARMENT; r=r+1
79 kw[r]="garment" as *u8 as i64; kl[r]=7; kt[r]=CT_GARMENT; r=r+1
80 kw[r]="clothing" as *u8 as i64;kl[r]=8; kt[r]=CT_GARMENT; r=r+1
81 kw[r]="outfit" as *u8 as i64; kl[r]=6; kt[r]=CT_GARMENT; r=r+1
82 kw[r]="wardrobe" as *u8 as i64;kl[r]=8; kt[r]=CT_GARMENT; r=r+1
83 kw[r]="caption" as *u8 as i64; kl[r]=7; kt[r]=CT_CAPTION; r=r+1
84 kw[r]="forensic" as *u8 as i64;kl[r]=8; kt[r]=CT_FORENSICS; r=r+1
85 kw[r]="anatomy" as *u8 as i64; kl[r]=7; kt[r]=CT_FORENSICS; r=r+1
86 kw[r]="realism" as *u8 as i64; kl[r]=7; kt[r]=CT_FORENSICS; r=r+1
87 kw[r]="continuity" as *u8 as i64; kl[r]=10; kt[r]=CT_SCENE; r=r+1
88 kw[r]="scene" as *u8 as i64; kl[r]=5; kt[r]=CT_SCENE; r=r+1
89 kw[r]="character" as *u8 as i64;kl[r]=9; kt[r]=CT_CHARACTER; r=r+1
90 kw[r]="persona" as *u8 as i64; kl[r]=7; kt[r]=CT_CHARACTER; r=r+1
91 kw[r]="scrap" as *u8 as i64; kl[r]=5; kt[r]=CT_SCRAPE; r=r+1
92 kw[r]="crawl" as *u8 as i64; kl[r]=5; kt[r]=CT_SCRAPE; r=r+1
93 kw[r]="ingest" as *u8 as i64; kl[r]=6; kt[r]=CT_SCRAPE; r=r+1
94 kw[r]="download" as *u8 as i64;kl[r]=8; kt[r]=CT_SCRAPE; r=r+1
95 kw[r]="beauty" as *u8 as i64; kl[r]=6; kt[r]=CT_QUALITY; r=r+1
96 kw[r]="quality" as *u8 as i64; kl[r]=7; kt[r]=CT_QUALITY; r=r+1
97 kw[r]="aesthetic" as *u8 as i64;kl[r]=9; kt[r]=CT_QUALITY; r=r+1
98 kw[r]="lora" as *u8 as i64; kl[r]=4; kt[r]=CT_TRAIN; r=r+1
99 kw[r]="kohya" as *u8 as i64; kl[r]=5; kt[r]=CT_TRAIN; r=r+1
100 kw[r]="bm25" as *u8 as i64; kl[r]=4; kt[r]=CT_SEARCH; r=r+1
101 kw[r]="search" as *u8 as i64; kl[r]=6; kt[r]=CT_SEARCH; r=r+1
102 kw[r]="retriev" as *u8 as i64; kl[r]=7; kt[r]=CT_SEARCH; r=r+1
103 kw[r]="arc" as *u8 as i64; kl[r]=3; kt[r]=CT_SCENE; r=r+1
104 kw[r]="vault" as *u8 as i64; kl[r]=5; kt[r]=CT_STORAGE; r=r+1
105 kw[r]="storage" as *u8 as i64; kl[r]=7; kt[r]=CT_STORAGE; r=r+1
106 kw[r]="catalog" as *u8 as i64; kl[r]=7; kt[r]=CT_STORAGE; r=r+1
107 kw[r]="img" as *u8 as i64; kl[r]=3; kt[r]=CT_IMAGE_GEN; r=r+1
108 kw[r]="diffus" as *u8 as i64; kl[r]=6; kt[r]=CT_IMAGE_GEN; r=r+1
109 kw[r]="comfy" as *u8 as i64; kl[r]=5; kt[r]=CT_IMAGE_GEN; r=r+1
110 kw[r]="sdcpp" as *u8 as i64; kl[r]=5; kt[r]=CT_IMAGE_GEN; r=r+1
111 kw[r]="deploy" as *u8 as i64; kl[r]=6; kt[r]=CT_DEPLOY; r=r+1
112 kw[r]="docker" as *u8 as i64; kl[r]=6; kt[r]=CT_DEPLOY; r=r+1
113 kw[r]="daemon" as *u8 as i64; kl[r]=6; kt[r]=CT_ORCH; r=r+1
114 kw[r]="queue" as *u8 as i64; kl[r]=5; kt[r]=CT_ORCH; r=r+1
115 kw[r]="registr" as *u8 as i64; kl[r]=7; kt[r]=CT_GOVERN; r=r+1
116 kw[r]="audit" as *u8 as i64; kl[r]=5; kt[r]=CT_GOVERN; r=r+1
117 kw[r]="frontend" as *u8 as i64;kl[r]=8; kt[r]=CT_UI; r=r+1
118 kw[r]="svelte" as *u8 as i64; kl[r]=6; kt[r]=CT_UI; r=r+1
119 kw[r]="server" as *u8 as i64; kl[r]=6; kt[r]=CT_API; r=r+1
120 kw[r]="service" as *u8 as i64; kl[r]=7; kt[r]=CT_API; r=r+1
121 var i: i64 = 0
122 while i < r {
123 if _contains(name, nlen, kw[i] as *u8, kl[i]) == 1 { return kt[i] }
124 i = i + 1
125 }
126 return CT_OTHER
127}
128
129func ck(name: *u8, want: i64) -> i64 {
130 let got: i64 = classify(name, _slen(name))
131 if got == want { return 1 }
132 _puts(" FAIL " as *u8); _puts(name); _puts(" want=" as *u8); pr_n(want)
133 _puts(" got=" as *u8); pr_n(got); _puts("\n" as *u8)
134 return 0
135}
136
137func main() -> i64 {
138 var ok: i64 = 0
139 let total: i64 = 9
140 ok = ok + ck("companion_clothing_tryon" as *u8, CT_GARMENT)
141 ok = ok + ck("nx_bm25" as *u8, CT_SEARCH)
142 ok = ok + ck("svc-nishicaption" as *u8, CT_CAPTION)
143 ok = ok + ck("universal_scraper" as *u8, CT_SCRAPE)
144 ok = ok + ck("companion_vault.db" as *u8, CT_STORAGE)
145 ok = ok + ck("gen-img" as *u8, CT_IMAGE_GEN)
146 ok = ok + ck("svc-scene-engine" as *u8, CT_SCENE)
147 ok = ok + ck("beauty.db" as *u8, CT_QUALITY)
148 ok = ok + ck("characters.db" as *u8, CT_CHARACTER)
149 _puts("nx_cap_type_classify: " as *u8); pr_n(ok); _puts("/" as *u8); pr_n(total); _puts(" PASS\n" as *u8)
150 if ok == total { sys_exit(0) }
151 sys_exit(1)
152 return 0
153}