Some checks failed
Test, Build, and Deploy / test-build-deploy (push) Failing after 54s
Pure SX state machine (lib/mod/lifecycle.sx) over the engine: open→triaged→decided→appealed→final, transition table guards illegal moves. Auto-tier resolves terminal actions; escalate parks at human-tier (resolve blocked until review supplies evidence). Appeal re-runs the engine — new exonerated-keep rule at top precedence lets exoneration override a prior hide. Api façade (mod/triage/resolve/review/appeal/finalize) over a case registry, logging committed decisions to the audit trail. +46 escalation tests. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
164 lines
3.7 KiB
Plaintext
164 lines
3.7 KiB
Plaintext
;; lib/mod/api.sx — report registry + lifecycle façade + public entry points.
|
|
;;
|
|
;; mod/report files a report (assigning a sequential id) and opens a lifecycle
|
|
;; case for it; mod/add-evidence accumulates evidence; mod/decide runs the engine
|
|
;; and commits to the audit log. The lifecycle façade (mod/triage, mod/resolve,
|
|
;; mod/review, mod/appeal, mod/finalize) drives the per-report case through its
|
|
;; states, logging each committed decision to the audit trail.
|
|
|
|
(define mod/*reports* (list))
|
|
(define mod/*cases* (list))
|
|
(define mod/*counter* 0)
|
|
(define mod/*rules* mod/default-rules)
|
|
|
|
(define
|
|
mod/reset!
|
|
(fn
|
|
()
|
|
(begin
|
|
(set! mod/*reports* (list))
|
|
(set! mod/*cases* (list))
|
|
(set! mod/*counter* 0)
|
|
(mod/audit-reset!))))
|
|
|
|
(define
|
|
mod/report
|
|
(fn
|
|
(by about reason)
|
|
(begin
|
|
(set! mod/*counter* (+ mod/*counter* 1))
|
|
(let
|
|
((id (str "r" mod/*counter*)))
|
|
(let
|
|
((r (mod/mk-report id by about reason)))
|
|
(begin
|
|
(append! mod/*reports* r)
|
|
(append! mod/*cases* {:id id :case (mod/mk-case r)})
|
|
r))))))
|
|
|
|
(define
|
|
mod/get-report
|
|
(fn
|
|
(id)
|
|
(reduce
|
|
(fn (acc r) (if (= (mod/report-id r) id) r acc))
|
|
nil
|
|
mod/*reports*)))
|
|
|
|
(define
|
|
mod/add-evidence
|
|
(fn
|
|
(id kind val)
|
|
(let
|
|
((r (mod/get-report id)))
|
|
(if
|
|
(nil? r)
|
|
nil
|
|
(let
|
|
((updated (mod/attach-evidence r (mod/mk-evidence kind val))))
|
|
(begin
|
|
(set!
|
|
mod/*reports*
|
|
(map
|
|
(fn (x) (if (= (mod/report-id x) id) updated x))
|
|
mod/*reports*))
|
|
updated))))))
|
|
|
|
(define
|
|
mod/decide
|
|
(fn
|
|
(id)
|
|
(let
|
|
((r (mod/get-report id)))
|
|
(if
|
|
(nil? r)
|
|
nil
|
|
(let
|
|
((d (mod/decide-report r mod/*reports* mod/*rules*)))
|
|
(begin (mod/log-decision! d (mod/report-evidence r)) d))))))
|
|
|
|
;; ── lifecycle façade over the case registry ──
|
|
|
|
(define
|
|
mod/case-of
|
|
(fn
|
|
(id)
|
|
(reduce
|
|
(fn (acc rec) (if (= (get rec :id) id) (get rec :case) acc))
|
|
nil
|
|
mod/*cases*)))
|
|
|
|
(define
|
|
mod/case-store!
|
|
(fn
|
|
(id c)
|
|
(set!
|
|
mod/*cases*
|
|
(map
|
|
(fn (rec) (if (= (get rec :id) id) {:id id :case c} rec))
|
|
mod/*cases*))))
|
|
|
|
;; apply a lifecycle op to the stored case, persist it, and (when a decision was
|
|
;; committed cleanly) append it to the audit log; returns the updated case
|
|
(define
|
|
mod/case-apply!
|
|
(fn
|
|
(id op log?)
|
|
(let
|
|
((c (mod/case-of id)))
|
|
(if
|
|
(nil? c)
|
|
nil
|
|
(let
|
|
((c2 (op c)))
|
|
(begin
|
|
(mod/case-store! id c2)
|
|
(when
|
|
log?
|
|
(when
|
|
(nil? (mod/case-error c2))
|
|
(let
|
|
((d (mod/case-decision c2)))
|
|
(if
|
|
(nil? d)
|
|
nil
|
|
(mod/log-decision!
|
|
d
|
|
(mod/report-evidence (mod/case-report c2)))))))
|
|
c2))))))
|
|
|
|
(define
|
|
mod/triage
|
|
(fn
|
|
(id)
|
|
(mod/case-apply!
|
|
id
|
|
(fn (c) (mod/case-triage c mod/*reports* mod/*rules*))
|
|
false)))
|
|
|
|
(define
|
|
mod/resolve
|
|
(fn (id) (mod/case-apply! id (fn (c) (mod/case-resolve c)) true)))
|
|
|
|
(define
|
|
mod/review
|
|
(fn
|
|
(id kind val)
|
|
(mod/case-apply!
|
|
id
|
|
(fn (c) (mod/case-review c kind val mod/*reports* mod/*rules*))
|
|
true)))
|
|
|
|
(define
|
|
mod/appeal
|
|
(fn
|
|
(id kind val)
|
|
(mod/case-apply!
|
|
id
|
|
(fn (c) (mod/case-appeal c kind val mod/*reports* mod/*rules*))
|
|
true)))
|
|
|
|
(define
|
|
mod/finalize
|
|
(fn (id) (mod/case-apply! id (fn (c) (mod/case-finalize c)) false)))
|