Some checks failed
Test, Build, and Deploy / test-build-deploy (push) Failing after 49s
mod/trace-rules evaluates a report against every rule, returning each rule's proved/unproved status + goal-by-goal derivation (an unproved rule shows which goal failed). mod/first-proved = winner (matches engine precedence, cross-checked), mod/proved-rules the firing set, mod/trace-report a [fires]/[ - ] rendering. Answers 'why didn't my rule fire?' without instrumenting the engine. +15 tests. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
117 lines
3.2 KiB
Plaintext
117 lines
3.2 KiB
Plaintext
;; lib/mod/tests/trace.sx — Ext 9: policy dry-run diagnostics.
|
|
|
|
(define mod-tr-count 0)
|
|
(define mod-tr-pass 0)
|
|
(define mod-tr-fail 0)
|
|
(define mod-tr-failures (list))
|
|
|
|
(define
|
|
mod-tr-test!
|
|
(fn
|
|
(name got expected)
|
|
(begin
|
|
(set! mod-tr-count (+ mod-tr-count 1))
|
|
(if
|
|
(= got expected)
|
|
(set! mod-tr-pass (+ mod-tr-pass 1))
|
|
(begin
|
|
(set! mod-tr-fail (+ mod-tr-fail 1))
|
|
(append!
|
|
mod-tr-failures
|
|
(str name "\n expected: " expected "\n got: " got)))))))
|
|
|
|
(define
|
|
mod-tr-find
|
|
(fn
|
|
(trace nm)
|
|
(reduce (fn (acc t) (if (= (get t :rule) nm) t acc)) nil trace)))
|
|
|
|
;; ── trace a spam report against the default rules ──
|
|
|
|
(define mod-tr-spam (mod/mk-report "r1" "alice" "bob" "this is spam"))
|
|
(define
|
|
mod-tr-t
|
|
(mod/trace-rules mod-tr-spam (list mod-tr-spam) mod/default-rules))
|
|
|
|
(mod-tr-test! "trace covers every rule" (len mod-tr-t) 6)
|
|
(mod-tr-test!
|
|
"spam-hide fires"
|
|
(get (mod-tr-find mod-tr-t "spam-hide") :proved)
|
|
true)
|
|
(mod-tr-test!
|
|
"default-keep always fires"
|
|
(get (mod-tr-find mod-tr-t "default-keep") :proved)
|
|
true)
|
|
(mod-tr-test!
|
|
"reviewer-remove does not fire (no evidence)"
|
|
(get (mod-tr-find mod-tr-t "reviewer-remove") :proved)
|
|
false)
|
|
(mod-tr-test!
|
|
"exonerated-keep does not fire"
|
|
(get (mod-tr-find mod-tr-t "exonerated-keep") :proved)
|
|
false)
|
|
(mod-tr-test!
|
|
"abuse-remove does not fire"
|
|
(get (mod-tr-find mod-tr-t "abuse-remove") :proved)
|
|
false)
|
|
|
|
;; ── winner matches the engine ──
|
|
|
|
(mod-tr-test!
|
|
"first-proved is spam-hide"
|
|
(get (mod/first-proved mod-tr-t) :rule)
|
|
"spam-hide")
|
|
(mod-tr-test!
|
|
"winner action matches decide-report"
|
|
(get (mod/first-proved mod-tr-t) :action)
|
|
(get
|
|
(mod/decide-report mod-tr-spam (list mod-tr-spam) mod/default-rules)
|
|
:action))
|
|
|
|
;; ── an unproved rule shows which goal failed ──
|
|
|
|
(define
|
|
mod-tr-rev-goals
|
|
(get (mod-tr-find mod-tr-t "reviewer-remove") :goals))
|
|
(mod-tr-test!
|
|
"reviewer-remove goal is unsolved"
|
|
(get (first mod-tr-rev-goals) :solved)
|
|
false)
|
|
(define mod-tr-spam-goals (get (mod-tr-find mod-tr-t "spam-hide") :goals))
|
|
(mod-tr-test!
|
|
"spam-hide goal is solved"
|
|
(get (first mod-tr-spam-goals) :solved)
|
|
true)
|
|
|
|
;; ── proved-rules list + rendering ──
|
|
|
|
(mod-tr-test!
|
|
"proved-rules lists fired rules in order"
|
|
(mod/proved-rules mod-tr-t)
|
|
(list "spam-hide" "default-keep"))
|
|
(mod-tr-test!
|
|
"trace-report marks a firing rule"
|
|
(mod/str-contains? (mod/trace-report mod-tr-t) "[fires] spam-hide")
|
|
true)
|
|
(mod-tr-test!
|
|
"trace-report marks a non-firing rule"
|
|
(mod/str-contains? (mod/trace-report mod-tr-t) "[ - ] reviewer-remove")
|
|
true)
|
|
|
|
;; ── clean report: only default-keep fires ──
|
|
|
|
(define mod-tr-clean (mod/mk-report "r2" "a" "b" "a fine post"))
|
|
(define
|
|
mod-tr-tc
|
|
(mod/trace-rules mod-tr-clean (list mod-tr-clean) mod/default-rules))
|
|
(mod-tr-test!
|
|
"clean report: only default-keep proves"
|
|
(mod/proved-rules mod-tr-tc)
|
|
(list "default-keep"))
|
|
(mod-tr-test!
|
|
"clean report winner is default-keep"
|
|
(get (mod/first-proved mod-tr-tc) :rule)
|
|
"default-keep")
|
|
|
|
(define mod-trace-tests-run! (fn () {:failures mod-tr-failures :total mod-tr-count :passed mod-tr-pass :failed mod-tr-fail}))
|