890. Identidad de la lección
891. Objetivo de aprendizaje
Al terminar esta lección, podrás redactar un contrato de carga, implementar una ruta de restauración acotada y validar un cambio de persistencia asistido por IA según reglas explícitas de validación de origen, migración, secuencia, fallos durante la aplicación y estado final de los sistemas.
892. Por qué importa
Un archivo guardado que se ha podido interpretar todavía no constituye un estado de juego seguro. Profile, Inventory y Loadout pueden ser responsables de datos distintos, mientras que el HUD solo presenta el estado confirmado por esos sistemas. Si un sistema cambia y otro posterior rechaza la restauración, el juego puede quedar con una mezcla de datos antiguos y nuevos aunque el cargador informe de un error.
La IA puede redactar un cargador, pero no debe decidir por ti el orden de autoridad ni el contrato de fallos. Esas decisiones deben quedar escritas antes de implementar y comprobarse tanto en el diff completo como en el estado final observable.
893. Ruta inicial
Usa el arnés ejecutable de persistencia proporcionado por el instructor si tu proyecto todavía no dispone de una ruta de carga adecuada. El arnés incluye:
- interfaces acotadas de
Profile,Inventory,LoadoutyHUD; - fixtures de texto para la versión actual y la versión 1;
- fixtures con datos malformados y relaciones entre campos no válidas;
- un interruptor de fallo de restauración controlado mediante datos de prueba o configuración, sin depender de una interfaz concreta;
- tablas del estado anterior y posterior a la carga;
- plantillas para el contrato, la revisión de archivos modificados y los resultados de aceptación.
Puedes manejar el arnés con cualquier editor accesible, ejecutor de pruebas, interfaz de comandos o control proporcionado por el instructor. La evidencia requerida es la misma transición de estado y el mismo registro de revisión, no un método de entrada específico.
894. Concepto central: dos niveles de validación antes de restaurar
Una migración no debe consumir un objeto arbitrario recién interpretado, pero tampoco tiene sentido exigir que un guardado antiguo cumpla el esquema actual antes de migrarlo. Usa dos niveles de validación:
- Interpretar y validar el formato de origen. Interpreta los datos sin modificar los sistemas del juego. Valida el discriminador de versión y el esquema mínimo exigido por esa versión. Rechaza los datos malformados, las versiones desconocidas y cualquier campo de origen que la migración no pueda leer con seguridad.
- Migrar sin modificar el estado. Transforma un guardado antiguo admitido en un nuevo valor en memoria. No escribas en
Profile,Inventory,LoadoutniHUD, y no alteres el objeto de origen. - Validar el contenido normalizado actual. Comprueba todos los campos obligatorios, tipos, rangos e invariantes entre campos del esquema actual. Por ejemplo, cada elemento de
activeLoadoutdebe cumplir la regla de propiedad definida en el contrato. - Planificar, comprobar y aplicar la restauración. Crea un plan ordenado. Cuando las interfaces lo permitan, pregunta a cada sistema si puede aceptar los cambios antes de aplicarlos. Después usa una estrategia explícita para los fallos que se produzcan durante la aplicación.
- Reconstruir e informar. Reconstruye el
HUDsolo a partir del estado de juego final y confirmado, e informa del resultado.
895. Flujo de restauración
| Fase | Pregunta de control | Evidencia | Respuesta ante el fallo |
|---|---|---|---|
| Interpretación y validación de origen | ¿Se reconoce la versión y cumple el contenido el esquema mínimo de esa versión? | Versión interpretada y resultado de validación del origen | Rechazar sin modificar el estado. |
| Migración sin mutación | ¿Puede transformarse el contenido de origen admitido en un candidato actual? | Nuevo candidato normalizado y resultado de migración | Rechazar sin modificar el estado. |
| Validación actual | ¿Cumple el candidato completo el esquema actual y sus invariantes? | Resultados de campos, rangos, valores obligatorios y relaciones | Rechazar sin modificar el estado. |
| Plan y comprobación previa | ¿Es coherente el conjunto ordenado de cambios y puede aceptarlo cada sistema cuando exista esa comprobación? | Plan de restauración y resultados previos | Rechazar sin modificar el estado. |
| Aplicación | ¿Pueden todos los sistemas responsables alcanzar un único resultado coherente? | Traza de aplicación y estados finales | Aplicar de forma atómica, revertir o pasar al estado seguro definido. |
| Reconstrucción e informe | ¿Refleja la presentación el estado de juego final y confirmado? | Proyección del HUD y resultado |
No mostrar nunca una mezcla sin confirmar. |
Un fallo de validación y un fallo durante la aplicación no son lo mismo:
- Fallo de validación o comprobación previa: ningún sistema del juego ha cambiado, por lo que basta con rechazar la carga antes de modificar el estado.
- Fallo durante la aplicación: al menos un sistema puede haber cambiado. No basta con devolver un error; el cargador debe recuperar la coherencia según el contrato.
896. Estrategias de coherencia durante la aplicación
Elige una estrategia compatible con la implementación acotada:
1. Aplicación atómica por etapas
Cada sistema prepara un estado candidato sin publicarlo. El cargador publica todos los estados preparados como una sola operación. Si la preparación falla, no se publica ninguno.
2. Instantánea y reversión
Antes de aplicar cambios, captura el estado anterior necesario para restaurar cada sistema que pueda cambiar. Aplica los cambios en orden. Si falla Inventory o Loadout, restaura todos los sistemas ya modificados a partir de sus instantáneas y reconstruye el HUD desde el estado anterior recuperado.
3. Transición a un estado seguro definido
Si no se dispone de una aplicación atómica ni de una reversión fiable, define en el contrato un único estado seguro completo. Si la aplicación falla, lleva todos los sistemas relevantes a ese estado y reconstruye el HUD a partir de él. El estado seguro debe indicar los valores finales o reglas de reinicio de Profile, Inventory y Loadout; «mostrar un error» no define un estado.
Una política de reparación para datos incoherentes es distinta de la recuperación tras un fallo de aplicación. Toda reparación debe realizarse sobre el candidato normalizado en memoria, quedar documentada y superar la validación del esquema actual antes de iniciar la restauración.
897. Ejemplo concreto
La versión actual 2 usa esta estructura:
{
"version": 2,
"profile": { "credits": 120, "rank": 3 },
"ownedItems": ["scanner"],
"activeLoadout": ["scanner"]
}
Una ruta segura desde la versión 1 sigue estos pasos:
- Interpretar el texto.
- Confirmar que
versionestá presente y contiene el valor admitido1. - Validar únicamente los campos y tipos de la versión 1 que necesita la migración documentada.
- Producir por separado un candidato de versión 2 en memoria.
- Validar el candidato completo de versión 2 y sus invariantes entre campos.
- Crear y comprobar el plan ordenado para
Profile,InventoryyLoadout. - Aplicarlo con la estrategia de coherencia elegida.
- Reconstruir el
HUDdesde el estado confirmado resultante.
Si el candidato contiene "grappler" en activeLoadout, pero no en ownedItems, el cargador debe seguir la regla escrita: rechazar el candidato o aplicar una reparación documentada antes de completar la validación actual. No debe conceder el objeto en silencio solo para que la presentación parezca coherente.
898. Traza de fallo
Supón que el estado anterior a la carga es:
| Sistema | Antes de cargar |
|---|---|
Profile |
20 créditos, rango 1 |
Inventory |
scanner en propiedad |
Loadout |
scanner activo |
HUD |
muestra 20 créditos y scanner |
El candidato solicita 120 créditos, scanner y grappler en propiedad, y grappler activo. Profile aplica sus datos, pero el interruptor de fallo hace que Loadout falle.
La prueba no se supera solo porque el cargador informe de un failure. Debe comprobarse el estado final de los cuatro sistemas:
- Con reversión,
Profile,InventoryyLoadoutcoinciden con todo el estado anterior, y elHUDse reconstruye desde ese estado recuperado. - Con una transición a un estado seguro definido, los tres sistemas de juego coinciden con el contrato de estado seguro, y el
HUDrefleja ese estado. - Con una aplicación atómica por etapas, ningún dato del candidato llega a hacerse visible.
Una mezcla final como un Profile nuevo, un Loadout antiguo y un HUD actualizado es contradictoria e incumple el contrato.
899. Flujo de trabajo nativo de IA
- Completa la plantilla breve del contrato: versiones admitidas, esquemas de origen, resultado de migración, invariantes actuales, orden de sistemas, estrategia de coherencia, definición de reversión o estado seguro y comprobaciones del estado final.
- Proporciona a la IA únicamente el punto de entrada del cargador, las interfaces acotadas, los fixtures, los archivos permitidos y las comprobaciones de aceptación.
- Exige una lista previa de archivos que pretende modificar y de los supuestos que está haciendo.
- Pide una migración sin mutación y un plan de restauración explícito. No aceptes que se modifique el estado campo por campo mientras se interpretan o migran los datos.
- Exige que la implementación exponga el interruptor de fallo configurable proporcionado para la restauración de
InventoryoLoadout. - Revisa el diff completo con esta lista: solo archivos previstos, ninguna creación oculta de propiedad, ningún dato de presentación tratado como duradero, ninguna modificación antes de validar el candidato normalizado y ninguna ruta de error que deje un estado parcial sin especificar.
- Justifica cada archivo modificado con una frase vinculada al brief. Rechaza o revierte los cambios no respaldados.
900. Práctica guiada
Usa el arnés inicial o una ruta existente equivalente.
- Completa la plantilla del contrato de carga. Para los fallos durante la aplicación, elige reversión, aplicación atómica por etapas o una transición a un estado seguro completamente especificado.
- Define el esquema mínimo de origen de la versión 1 y el esquema completo de la versión 2. Escribe la transformación sin mutación entre ambos.
- Define el invariante de propiedad entre
activeLoadoutyownedItems. - Implementa o revisa esta secuencia: interpretación, validación de origen, migración, validación actual, plan, comprobación previa cuando exista, aplicación, reconstrucción del
HUDe informe del resultado. - Revisa el diff completo y registra una justificación para cada archivo modificado.
- Ejecuta estos casos de aceptación con los fixtures de texto proporcionados:
- contenido actual válido;
- contenido válido de la versión 1 admitida;
- texto malformado o ausencia del discriminador de versión;
- contenido de una versión de origen que no cumple el esquema mínimo necesario para migrar;
- contenido normalizado con propiedad incoherente;
- fallo provocado durante la aplicación en
InventoryoLoadout.
- Para cada caso, completa una tabla de resultado esperado y observado para
Profile,Inventory,Loadout,HUDy el resultado informado. - Documenta una propuesta rechazada por exceder el brief.
901. Evidencia
Entrega el contrato de carga, el brief acotado para la IA, el artefacto de implementación, la revisión del diff completo, las justificaciones de los archivos y la tabla de aceptación. La evidencia debe mostrar:
- validación de la versión y del esquema de origen antes de migrar;
- una migración que no modifica los sistemas ni el contenido de origen;
- validación completa del esquema actual y sus invariantes antes de restaurar;
- un plan de restauración ordenado y comprobación previa cuando la interfaz lo permita;
- un mecanismo concreto de aplicación atómica, reversión o transición a estado seguro para fallos durante la aplicación;
- comprobaciones del estado final de
Profile,Inventory,LoadoutyHUDtras el fallo provocado; - reconstrucción del
HUDa partir del estado de juego final y confirmado; - una propuesta fuera de alcance rechazada.
902. Puntos clave
- Valida el discriminador de versión y la estructura mínima de origen antes de migrar.
- Migra a un candidato independiente en memoria y después valida el contrato actual completo.
- Rechazar antes de modificar el estado resuelve fallos de validación, no fallos posteriores a la aplicación de un sistema.
- Un fallo durante la aplicación exige publicación atómica, reversión de todos los sistemas modificados o una transición a un estado seguro completamente definido.
- Comprueba el estado final de los sistemas, no solo el error informado.
- Los sistemas de presentación deben observar el estado de juego restaurado y confirmado, no valores de presentación serializados; este mismo límite de observación conduce al siguiente módulo sobre audio.
903. Próxima lección
Continúa con 2.14 — Audio.
904. Comprobación
Responde estas preguntas por tu cuenta antes de leer las respuestas.
Un cargador interpreta datos que declaran la versión 1. ¿Qué debe ocurrir antes de que la migración lea los campos de esa versión?
Mostrar respuesta y explicación
Respuesta: Validar el discriminador de versión y el esquema mínimo de la versión 1 que necesita la migración
Por qué: El cargador debe confirmar que la versión está admitida y validar la estructura mínima de origen que consumirá la migración. Después migra a un candidato independiente y valida ese candidato con el esquema actual completo.
¿Por qué suele ser necesario establecer la propiedad antes de restaurar un equipamiento dependiente?
Mostrar respuesta y explicación
Respuesta: Loadout puede comprobar cada selección con el estado confirmado por Inventory
Por qué: Inventory proporciona el estado de propiedad confirmado con el que se comprueban las selecciones dependientes. Loadout no debe inventar propiedad para validar sus propios datos.
Un candidato normalizado contiene un objeto activo que no pertenece al jugador. ¿Qué respuesta respeta el contrato de carga?
Mostrar respuesta y explicación
Respuesta: Aplicar la regla documentada de rechazo o reparación antes de restaurar y validar el candidato resultante
Por qué: La regla de propiedad forma parte de la validación normalizada. Una reparación documentada puede transformar el candidato en memoria, pero el resultado debe validarse antes de modificar cualquier sistema.
Traza: antes de cargar, Profile tiene 20 créditos, Inventory posee scanner, Loadout usa scanner y el HUD muestra ambos datos. Durante la carga, Profile aplica 120 créditos y después falla Loadout. El contrato exige reversión. ¿Qué evidencia cumple el contrato?
Mostrar respuesta y explicación
Respuesta: Profile vuelve a 20 créditos, Inventory y Loadout coinciden con sus estados completos anteriores, el HUD se reconstruye desde esos estados y se informa del fallo
Por qué: Un contrato de reversión se cumple mediante el estado final de todos los sistemas afectados, no solo con un resultado de error. Todos los sistemas modificados deben volver al estado anterior definido, y el HUD debe reconstruirse desde ese estado confirmado.