diff --git a/core/testkit/src/main/resources/logback.xml b/core/testkit/src/main/resources/logback.xml
index a38273b..d9abfca 100644
--- a/core/testkit/src/main/resources/logback.xml
+++ b/core/testkit/src/main/resources/logback.xml
@@ -25,6 +25,41 @@
+ {# Dedicated audit appender — SYNCHRONOUS, never wrapped by ASYNC/neverBlock (C4): audit lines
+ must never be silently dropped under backpressure. PVC-backed file, ~1y of daily rolls; Loki
+ holds the authoritative 1y via the promtail sidecar that tails this file → {stream="audit"}. #}
+
+ audit.log
+
+ audit-%d{yyyy-MM-dd}.log
+ 7
+ {# Bound total on-disk audit size so a burst can't fill the log PVC. The appender is
+ synchronous/non-dropping, so a full disk would otherwise stall the emitting thread. #}
+ 1GB
+
+
+ {# Do NOT ServiceLoader-scan the classpath for Jackson modules. Under JDK 11+ the
+ transitive jackson-module-jaxb-annotations (from rapidoid/dumbster) would try to load
+ javax.xml.bind.annotation.XmlElement — removed from the JDK in Java 11 — and blow up
+ with NoClassDefFoundError. The encoder registers the modules it actually needs itself. #}
+ false
+ false
+
+ (?i)[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,}***@***
+ (?i)\b(?:sk|pk|whsec|rk)_[a-z0-9_]+\b***
+ (?i)bearer\s+[a-z0-9._/+=-]+Bearer ***
+
+
+
+
+ {# additivity=false so audit lines do NOT also propagate to root (no duplicate in app.log).
+ Audit routes ONLY to AUDIT_FILE; the sidecar tails it for {stream="audit"}. No STDOUT copy —
+ that would be re-shipped to {stream="app"} by the node promtail, double-ingesting every audit
+ line and polluting the operational stream. #}
+
+
+
+