Tags: denzuko/mlisp
Tags
v0.8.0 (re-tagged after release-fix #118) Highlights: - 42/46 mlisp-admin cmd-* functions converted to define-admin-cmd(+) - mlisp-procmail-gen: s-expr DSL + binary for procmailrc generation - Multi-platform release packages (#97): Linux tarball + pkgsrc, NetBSD pkgsrc, FreeBSD pkg - Automated GitHub Release creation on tag push - Pattern-based Makefile rules (self-healing) - XDG/etc-mlisp config bootstrap fix (#107) - GitFlow branch model + merge-authority policy 378/378 BATS + 78/78 FiveAM = 456/456.
chore: bump version to 0.3.0, update CHANGELOG Version 0.3.0 adds 18 features over v0.2.0: MIME stripping, BCC privacy, RFC 2369 headers, -request mode, bounce management, auto-subscribe, Prometheus metrics, MDN headers, unsubscribe synonyms, daemon discrimination, dedup, moderator queue, digest mode, exploder, Maildir, mlisp-distrib, hash-at-rest, GPG. Test count: 275 (78 FiveAM + 197 BATS)
feat(compliance): CAN-SPAM, GDPR, CASL, LGPD compliance
CAN-SPAM 15 U.S.C. § 7704:
- Footer appended to every distributed message with physical postal
address (1207 Delaware Ave Ste 103, Wilmington DE 19806) and
unsubscribe instructions
- Subject line tagged [list-id] on outbound (no deceptive subjects)
- Sender/List-Id headers injected per § 7704(a)(2)
GDPR Regulation (EU) 2016/679:
- Art.7 consent: subscribe command records :subscribed-at (ISO-8601)
and :consent-method in state.sexp
- Art.17 erasure: unsubscribe removes address immediately
- Art.30 ROPA: audit.sexp append-only event log for subscribe,
unsubscribe, post-distributed, post-rejected events
CASL S.C. 2010 c.23 s.6:
- Opt-out honoured within same process invocation
- Unsubscribe mechanism in every message
LGPD Art.7/18: covered by GDPR erasure + consent path
State schema change: subscriber records promoted from flat address
strings to plists with :address :subscribed-at :consent-method
New files:
templates/{discuss,announce,devel}.footer.sexp
state/audit.sexp (created at runtime)
Test coverage:
FiveAM: +13 tests (53 total)
BATS compliance: 23 new tests
All 105 tests passing
feat: initial mlisp implementation
Compiled standalone SBCL mailing list manager replacing smartlist.
Architecture:
- src/mlisp.lisp: core engine, RFC 2822 parser, troff DSL, MTA fork
- state/state.sexp: S-expression database seeded with discuss/announce/devel
- templates/: 9 troff DSL templates (welcome/help/goodbye x 3 lists)
- build.lisp: sb-ext:save-lisp-and-die compile script
Routing boundaries:
discuss -> denzuko+mlist-discuss@panix.com
announce -> denzuko+mlist-announce@panix.com
devel -> denzuko+mlist-devel@panix.com
Loop protection: X-Loop-List-<Name> header detection
State persistence: MLISP_HOME env-driven runtime path resolution
CRLF tolerance: trailing CR stripped from read-line input
Test coverage:
- FiveAM: 40 unit tests (parse, address, commands, state, troff DSL)
- BATS: 21 integration tests (routing, loops, auth, commands)
- BATS: 8 regression tests (RC-A broken-pipe, RC-B state mutation,
RC-C wrong-loop-header)
Fixes in this commit vs initial scaffold:
RC-A: sendmail pipe guarded with ignore-errors + stdin-draining stub
RC-B: rebuild exposes mlisp-home() runtime path; state.sexp now written
to correct MLISP_HOME location at runtime
RC-C: CRLF stripping ensures headers parse correctly; wrong-list loop
header no longer suppresses authorized subscriber delivery