face_verification_core 0.2.0

Cross-platform on-device face liveness and verification core.
Documentation
# Integracion Con `face_liveness_kit`

## Estado Actual

Este crate todavia no esta listo para usarse como paquete Flutter final.

La API Rust ya contiene el nucleo de decision:

- reto de 6 pasos,
- validacion de pose sobre datos normalizados,
- sesion live con estabilidad temporal,
- verificacion final de 6 fotos,
- checks explicables y resultado serializable.

Lo que falta antes de integrarlo de verdad en `face_liveness_kit` es el puente
entre Dart y Rust y, despues, el runtime ML real.

## Regla Para Pub.dev

El paquete publicado en pub.dev no debe depender de rutas absolutas ni de un
repo hermano local. Cualquier referencia como `../../face_verification_core`
solo vale para desarrollo en esta maquina o en un workspace controlado.

Para publicar `face_liveness_kit`, hay dos opciones validas:

- Recomendado: publicar `face_verification_core` como crate versionado en
  crates.io y hacer que el wrapper Rust del paquete Flutter dependa de esa
  version.
- Alternativa: vendorizacion, copiando el core Rust dentro del paquete Flutter
  publicado. Evita crates.io, pero duplica codigo y complica mantenimiento.

No usar `path = "../../face_verification_core"` en el paquete final que se suba
a pub.dev.

## Primer Modo De Inclusion Recomendado

Flutter no puede depender directamente de este crate desde `pubspec.yaml`.
La inclusion debe hacerse con un wrapper Rust dentro del paquete Flutter.

Estructura recomendada en el paquete Flutter:

```text
face_liveness_kit/
  lib/
    src/
      core_bridge.dart
  rust/
    Cargo.toml
    src/
      lib.rs
```

Para desarrollo local, el `rust/Cargo.toml` del paquete Flutter puede depender
de este core por path:

```toml
[dependencies]
face_verification_core = { path = "../../face_verification_core" }
```

Pero antes de publicar en pub.dev debe cambiarse a una dependencia versionada:

```toml
[dependencies]
face_verification_core = "0.1"
```

Si hace falta seguir desarrollando contra una copia local, usar un override
local no publicado, por ejemplo `.cargo/config.toml` ignorado por git o un
workspace privado, no el manifiesto que se publica.

El paquete Flutter debe seguir siendo responsable de:

- UI de camara,
- captura de frames/fotos,
- permisos,
- carga o llamada a modelos mientras no exista runtime Rust completo,
- conversion de resultados ML a los structs del core.

El core Rust debe recibir datos ya normalizados equivalentes a:

- `FrameAnalysis`,
- `FaceAnalysis`,
- `HandAnalysis`,
- `CapturedPhotoAnalysis`,
- `LivenessChallenge`,
- `VerificationThresholds`.

## Puente Dart/Rust Propuesto

La primera version del puente usa JSON con `serde`, no FFI binario manual. Es
mas facil de depurar y suficiente para estabilizar el contrato.

Funciones Rust disponibles para exponer desde el wrapper:

- `generate_challenge_json() -> String`
- `new_session_json(challenge_json, thresholds_json) -> String`
- `tick_session_json(session_json, frame_json, timestamp_ms) -> String`
- `validate_pose_json(step_json, frame_json, challenge_json, thresholds_json) -> String`
- `verify_captured_photos_json(photos_json, challenge_json, thresholds_json) -> String`

Cuando el contrato sea estable, se puede optimizar el transporte.

En Dart, `core_bridge.dart` debe encargarse de:

- convertir `FaceLivenessChallenge` a JSON compatible con `LivenessChallenge`,
- convertir `FaceLivenessConfig` a JSON compatible con `VerificationThresholds`,
- convertir los resultados ML/camara a `FrameAnalysis` y `CapturedPhotoAnalysis`,
- llamar al wrapper nativo/WASM,
- mapear `VerificationResult` a `FaceVerificationResult`.

## Criterio Para Decir "Lista Para Flutter"

Avisar como lista para integrar en `face_liveness_kit` cuando existan:

- wrapper JSON estable compilando en Rust,
- ejemplo Dart o test mínimo que llame al core,
- mapeo documentado de Dart a `FrameAnalysis`,
- tests Rust pasando,
- decision clara de si el primer consumo sera mock/manual o con modelos reales.
- estrategia de publicacion elegida: crates.io recomendado o vendorizacion.

Hasta entonces, este repo esta en fase de core reusable, no de paquete Flutter
consumible.

## Estado De Preparacion

- Core Rust: listo como nucleo reusable.
- Puente JSON Rust: listo y testeado.
- Inclusion Flutter: todavia pendiente.

La siguiente fase que convierte esto en "listo para Flutter" es crear el wrapper
`rust/` dentro de `face_liveness_kit` y un test Dart minimo contra ese wrapper.