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}