KAudit¶
Diff a nivel de campo para auditoría, en compile-time y sin reflexión. Dadas dos instancias de la misma clase (antes/después), genera la lista de cambios con paths legibles, redacción de campos sensibles y diff de colecciones por identidad, no por posición.
Core de dominio puro (hexagonal) sobre kspkit, con dos frontends sobre el mismo dominio:
- Kotlin vía KSP2 → extensión
Type.diff(other): List<FieldChange>. - Java vía javac APT → estática
TypeAuditor.diff(a, b).
Por qué¶
- Cero reflexión → compatible con GraalVM native-image y Kotlin Multiplatform, donde la competencia reflexiva (JaVers) estructuralmente no llega.
- Diff de colecciones por clave (
@AuditKey), no por índice: reordenar no genera ruido. - Redacción estructural de campos
@Sensitive: el valor nunca sale, ni "por si acaso". - ~100× más rápido que JaVers en el mismo diff (ver benchmarks).
Un vistazo¶
@Auditable
data class Account(
@AuditKey val id: Long,
val name: String,
@Sensitive val apiKey: String,
val owner: Person,
)
val changes = old.diff(new) // extensión generada
println(changes.renderText())
@Auditable
public record Account(long id, String name, @Sensitive String apiKey, Person owner) {}
List<FieldChange> changes = AccountAuditor.diff(old, neu); // estática generada
Siguiente paso¶
- La guía de referencia explica el comportamiento y el código generado por temas.
- La variante Java (APT) cubre records, POJOs y la paridad con Kotlin.
- Los ejemplos ejecutables corren ambas variantes con un solo comando.