# 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.