Saltar a contenido

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