code wiki / _hdl_build / nx_cms_comments_gate.nx
nx_cms_comments_gate.nx source
↩ module page · 125 lines · 7580 B
1// nx_cms_comments_gate.nx -- CMS COMMENT-MODERATION gate: land the missing WP comments+Akismet class
2// HONESTLY by proving the sovereign on-box moderation engine -- deterministic integer spam scoring,
3// the exact pending->approved/spam/trash state machine, and approved-only public visibility -- over
4// the real nx_cms_store record. Positive AND negative controls (spam NEVER auto-publishes; a single
5// weak signal is NOT over-blocked; spam->approved is refused; scoring is reproducible). Appends
6// "CMSGATE row=nx_cms_comments comments-moderation ... verdict=PASS" to knowledge/status/cms_gate.log
7// ONLY if every assertion holds (no fake-green). Exit 0 iff all pass. license_tier: ORIGINAL
8import "nx_cms_comments.nx"
9import "nx_cms_store.nx"
10import "nx_syscalls.nx"
11
12func cg_w(s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} sys_write(1,s,n); return 0 }
13func cg_num(v: i64) -> i64 { let bb: *u8=sys_mmap(28); var m: i64=v; if m<0{m=0-m}; let t: *u8=sys_mmap(28); var k: i64=0; if m==0{t[0]=48;k=1}; while m>0{t[k]=48+(m%10);m=m/10;k=k+1}; var i: i64=0; while i<k{bb[i]=t[k-1-i];i=i+1}; sys_write(1,bb,k); return 0 }
14func cg_cat(dst: *u8, off: i64, s: *u8) -> i64 { var o: i64=off; var k: i64=0; while s[k]!=(0 as u8){dst[o]=s[k];o=o+1;k=k+1} return o }
15func cg_catnum(dst: *u8, off: i64, v: i64) -> i64 {
16 var o: i64=off; let t: *u8=sys_mmap(28); var m: i64=v; if m<0{m=0-m}; var k: i64=0
17 if m==0 {t[0]=48 as u8;k=1}; while m>0 {t[k]=(48+(m%10)) as u8; m=m/10; k=k+1}
18 var i: i64=0; while i<k {dst[o]=t[k-1-i]; o=o+1; i=i+1} return o
19}
20func cg_cpy(dst: *u8, src: *u8) -> i64 { var k: i64=0; while src[k]!=(0 as u8){dst[k]=src[k];k=k+1} return k }
21
22// compare exactly n bytes of buf to a NUL-terminated literal (literal must be exactly n long)
23func cg_streq(buf: *u8, n: i64, lit: *u8) -> i64 {
24 var i: i64=0
25 while i<n { if (buf[i] as i64) != (lit[i] as i64) { return 0 } i=i+1 }
26 if (lit[n] as i64) != 0 { return 0 }
27 return 1
28}
29
30func cg_slen(s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} return n }
31
32func cg_row(id: i64, ok: i64, what: *u8) -> i64 {
33 cg_w("CMTROW " as *u8); cg_num(id); cg_w(" " as *u8)
34 if ok==1 { cg_w("PASS " as *u8) } else { cg_w("FAIL " as *u8) }
35 cg_w(what); cg_w("\n" as *u8)
36 return ok
37}
38
39func main() -> i64 {
40 var pass: i64 = 0
41 var rows: i64 = 0
42 var ok: i64 = 0
43
44 // ---- real comment bodies (bytes the scorer sees) ----
45 let clean: *u8 = "Great article, this really helped me out. Thanks!" as *u8
46 let oneLink: *u8 = "Thanks, see the guide at http://docs.example for more." as *u8
47 let spammy: *u8 = "buy now at http://spam.example casino loan http://more.example" as *u8
48 let cleanN: i64 = cg_slen(clean)
49 let oneLinkN: i64 = cg_slen(oneLink)
50 let spamN: i64 = cg_slen(spammy)
51
52 // R0: a clean comment scores 0 -> classified PENDING (queued, NOT auto-approved)
53 let sc0: i64 = cmt_score(clean, cleanN)
54 ok = 0; if sc0 == 0 { if cmt_classify(sc0) == NX_CMT_PENDING { ok = 1 } }
55 rows=rows+1; pass=pass+cg_row(0, ok, "clean comment score=0 -> classified PENDING (queued, not auto-approved)" as *u8)
56
57 // R1: moderate pending -> approved is allowed and an approved comment is publicly visible
58 ok = 0
59 if cmt_can_moderate(NX_CMT_PENDING, NX_CMT_APPROVED) == 1 { if cmt_visible_public(NX_CMT_APPROVED) == 1 { ok = 1 } }
60 rows=rows+1; pass=pass+cg_row(1, ok, "pending->approved allowed; approved comment is public" as *u8)
61
62 // R2: a link+banned-token comment scores over threshold -> SPAM, and spam is NOT public
63 let sc2: i64 = cmt_score(spammy, spamN) // links(2)*3 + banned(casino,loan=2)*5 = 16
64 ok = 0
65 if sc2 >= NX_CMT_SPAM_THRESHOLD { if cmt_classify(sc2) == NX_CMT_SPAM { if cmt_visible_public(NX_CMT_SPAM) == 0 { ok = 1 } } }
66 rows=rows+1; pass=pass+cg_row(2, ok, "link+banned spam scored over threshold -> SPAM, withheld from public" as *u8)
67
68 // R3 (neg control): spam -> approved is REFUSED (no direct rehab; must route through pending)
69 ok = 0; if cmt_can_moderate(NX_CMT_SPAM, NX_CMT_APPROVED) == 0 { ok = 1 }
70 rows=rows+1; pass=pass+cg_row(3, ok, "spam->approved REFUSED (negative control: no direct rehab)" as *u8)
71
72 // R4: idempotent re-moderation (approved->approved) is allowed, visibility unchanged
73 ok = 0
74 if cmt_can_moderate(NX_CMT_APPROVED, NX_CMT_APPROVED) == 1 { if cmt_visible_public(NX_CMT_APPROVED) == 1 { ok = 1 } }
75 rows=rows+1; pass=pass+cg_row(4, ok, "idempotent approved->approved allowed; still public" as *u8)
76
77 // R5 (neg control): ONLY approved renders -- pending, spam and trash are all withheld
78 ok = 0
79 if cmt_visible_public(NX_CMT_PENDING) == 0 { if cmt_visible_public(NX_CMT_SPAM) == 0 { if cmt_visible_public(NX_CMT_TRASH) == 0 { if cmt_visible_public(NX_CMT_APPROVED) == 1 { ok = 1 } } } }
80 rows=rows+1; pass=pass+cg_row(5, ok, "public render shows ONLY approved (pending/spam/trash withheld)" as *u8)
81
82 // R6 (determinism control): the scorer is reproducible -- same bytes -> same score, twice
83 let d1: i64 = cmt_score(spammy, spamN)
84 let d2: i64 = cmt_score(spammy, spamN)
85 let z1: i64 = cmt_score(clean, cleanN)
86 ok = 0; if d1 == d2 { if d1 == sc2 { if z1 == 0 { ok = 1 } } }
87 rows=rows+1; pass=pass+cg_row(6, ok, "deterministic scoring: same comment -> identical score (no cloud call)" as *u8)
88
89 // R7 (over-block control, rule 25): a single weak signal (one link) stays UNDER threshold ->
90 // PENDING not SPAM -- legit one-link comments are queued, not stripped
91 let sc7: i64 = cmt_score(oneLink, oneLinkN) // 1 link * 3 = 3 < 6
92 ok = 0; if sc7 < NX_CMT_SPAM_THRESHOLD { if cmt_classify(sc7) == NX_CMT_PENDING { ok = 1 } }
93 rows=rows+1; pass=pass+cg_row(7, ok, "single weak signal NOT over-blocked -> PENDING (rule 25, no over-strip)" as *u8)
94
95 // R8 (end-to-end over the real store): a comment record transitions pending -> approved and the
96 // stored @status reads back "approved" (composes nx_cms_store, exactly like the schedule gate)
97 let rec: *u8 = sys_mmap(8192)
98 let rec2: *u8 = sys_mmap(8192)
99 let sbuf: *u8 = sys_mmap(128)
100 var rn: i64 = cg_cpy(rec, "@author\nVisitor\n@status\npending\n@body\nNice post.\n" as *u8)
101 let s_before: i64 = cst_get(rec, rn, "status" as *u8, sbuf, 128)
102 ok = 0
103 if cg_streq(sbuf, s_before, "pending" as *u8) == 1 {
104 let rn2: i64 = cst_set(rec, rn, "status" as *u8, "approved" as *u8, 8, rec2, 8192)
105 let s_after: i64 = cst_get(rec2, rn2, "status" as *u8, sbuf, 128)
106 if cg_streq(sbuf, s_after, "approved" as *u8) == 1 { ok = 1 }
107 }
108 rows=rows+1; pass=pass+cg_row(8, ok, "store record pending->approved transition reads back approved (e2e)" as *u8)
109
110 cg_w("CMS-COMMENTS-GATE rows=" as *u8); cg_num(rows); cg_w(" pass=" as *u8); cg_num(pass); cg_w("\n" as *u8)
111
112 if pass == rows {
113 let line: *u8 = sys_mmap(256)
114 var lo: i64 = cg_cat(line, 0, "CMSGATE row=nx_cms_comments comments-moderation rows=" as *u8)
115 lo = cg_catnum(line, lo, rows)
116 lo = cg_cat(line, lo, " pass=" as *u8); lo = cg_catnum(line, lo, pass)
117 lo = cg_cat(line, lo, " verdict=PASS\n" as *u8)
118 let gf: i64 = sys_openat_append("knowledge/status/cms_gate.log" as *u8, 0x1a4)
119 if gf >= 0 { sys_write(gf, line, lo); sys_close(gf) }
120 cg_w("CMS-COMMENTS-GATE verdict=PASS -- comments-moderation recorded in cms_gate.log\n" as *u8)
121 sys_exit(0); return 0
122 }
123 cg_w("CMS-COMMENTS-GATE verdict=FAIL -- NOT recorded (no fake-green)\n" as *u8)
124 sys_exit(1); return 1
125}