Buscar/Modifica un motor de almacenamiento de bases de datos sin perder velocidad ni compatibilidad

Modifica un motor de almacenamiento de bases de datos sin perder velocidad ni compatibilidad

Úsalo cuando una IA modifique un motor de almacenamiento de bases de datos. Cuida los errores y la concurrencia, acelera el código más usado solo con pruebas comparativas, mantiene compatibles las API, los formatos y las compilaciones, y exige pruebas reproducibles antes de aprobar.

Para usar estas reglas de IA
## Escribe código legible que maneje bien los errores y la concurrencia Escribe código claro y autoexplicativo, con nombres significativos y comentarios para las invariantes que no resulten evidentes. Prefiere un flujo de control legible a trucos ingeniosos que solo aporten una mejora marginal de velocidad. Sigue el formateador, las reglas de nomenclatura y los patrones estructurales del repositorio. Utiliza de forma coherente el tipo estándar de estado o error del proyecto. Propaga los fallos con contexto suficiente para identificar la operación que ha fallado. No descartes nunca silenciosamente un error ni un valor de estado sin comprobar. Evita las aserciones para fallos recuperables en las rutas de producción. Cubre entradas no válidas, agotamiento de recursos, fallos de E/S, corrupción y progreso parcial. Conserva la semántica de la base de datos, como el orden de las claves, la visibilidad de las instantáneas, la durabilidad y el comportamiento de recuperación. Documenta las suposiciones de sincronización junto a los datos que protegen. Revisa conjuntamente los bloqueos, las operaciones atómicas, el orden de memoria y los riesgos de condiciones de carrera y de interbloqueo. Mantén explícita la liberación de recursos en las rutas de éxito, error, cancelación y apagado. Centra los comentarios en los contratos locales, no en la justificación actual de una llamada concreta. Elimina la lógica duplicada cuando una abstracción compartida tenga una responsabilidad estable y coherente. No declares listo para integrar un cambio sensible a la corrección hasta haber probado las rutas de fallo y el comportamiento concurrente. ## Acelera el código según cuánto se ejecuta y demuéstralo con pruebas comparativas Considera la atención al rendimiento como un requisito del trabajo en motores de almacenamiento. Establece la corrección antes de realizar microoptimizaciones, pero elige algoritmos y estructuras de datos sólidos desde el principio. Clasifica el código afectado por su frecuencia de ejecución: - En las rutas calientes, cada asignación, copia, bifurcación y fallo de caché se multiplica a lo largo de operaciones frecuentes. - Las rutas templadas requieren un equilibrio medido entre claridad y velocidad. - Las rutas frías favorecen la facilidad de mantenimiento, salvo que el análisis de rendimiento muestre un coste significativo. Respalda las afirmaciones sobre rendimiento con pruebas comparativas y datos de análisis de rendimiento. Compara con una referencia adecuada e informa de la carga de trabajo, la configuración y la variación. Cuando esté justificado, reduce la asignación dinámica en las rutas calientes mediante reutilización, asignación previa, áreas de asignación o grupos de memoria. Prefiere operaciones de movimiento, vistas, referencias y operaciones en el mismo lugar a las copias innecesarias. Organiza los datos y los patrones de acceso para favorecer la localidad y evitar el uso compartido falso. Saca fuera del bucle el trabajo invariable, agrupa las operaciones repetidas y reduce las bifurcaciones impredecibles. Utiliza indicaciones de probabilidad de bifurcación solo en casos realmente infrecuentes o costosos, no en configuraciones habituales. Facilita la vectorización del compilador mediante una disposición de datos adecuada antes de recurrir a funciones intrínsecas explícitas. Utiliza SIMD explícito únicamente donde esté admitido, medido y pueda mantenerse. Aplica RAII y una propiedad clara para evitar fugas y conservar una sobrecarga baja. No mantengas una optimización compleja que carezca de un beneficio reproducible. ## Diseña API compatibles con opciones de un solo propósito Mantén las políticas de alto nivel en el llamador o en la capa de políticas. Expón mecanismos precisos y reutilizables desde las capas inferiores. No hagas que el código genérico dependa de la identidad o la justificación de un llamador concreto. Asigna a cada indicador o parámetro un único comportamiento coherente. Sustituye los valores booleanos que agrupan propiedad, caché, modo de E/S y precarga por campos explícitos o un objeto de opciones. No deduzcas políticas a partir de detalles fortuitos de la implementación, como identificadores de caché o el estado del lector. Utiliza aserciones, interfaces más restringidas y nombres más claros para que los contratos puedan hacerse cumplir. Haz que las API nuevas sean coherentes con la nomenclatura, el orden de parámetros, los tipos de retorno y la gestión de errores existentes. Utiliza opciones con seguridad de tipos, incluidos tipos enteros de ancho fijo y enumeraciones con ámbito cuando corresponda. Valida los valores de las opciones y devuelve errores claros. Haz que los cambios dinámicos de configuración sean seguros entre hilos y verifica cuándo entran en vigor. Conserva la compatibilidad del código fuente y de los binarios, salvo que un cambio incompatible tenga una justificación excepcional. Revisa la disposición, los símbolos y las convenciones de llamada cuando se exponga una interfaz binaria pública. Declara elementos obsoletos mediante el proceso documentado de varias versiones y proporciona indicaciones para la migración. Documenta las API públicas con su uso, el significado de los parámetros, las reglas de seguridad entre hilos, los costes de rendimiento y las notas de compatibilidad. No exportes tipos de implementación de terceros a través de una API pública. ## Revisa a fondo el registro de escritura anticipada y otras partes de alto riesgo Aplica la revisión más profunda al registro de escritura anticipada, las tablas en memoria, la compactación, la recuperación y otras rutas centrales de la base de datos. Prueba los cambios centrales con distintas configuraciones, estilos de compactación, fallos y cargas de trabajo concurrentes. Garantiza que la compactación respete los límites configurados y gestione los casos sin archivos o con un único archivo. Considera las cabeceras públicas como la superficie con mayor impacto sobre la compatibilidad. Considera los formatos persistentes de tablas y bloques como contratos de datos de larga duración. Verifica las sumas de comprobación con distintas opciones de compresión, tamaños de bloque, casos de corrupción y límites de compatibilidad. Prueba las operaciones de búsqueda, siguiente, anterior y eliminación del iterador, así como la semántica de sus extremos. Mantén únicas las claves de caché y garantiza que la precarga respete los límites de recursos. Realiza pruebas comparativas de los cambios en tablas, cachés y utilidades que puedan ejecutarse en rutas calientes. Explicita la sincronización de la caché, la propiedad de la memoria y la política de expulsión. Mantén las utilidades opcionales aisladas de los componentes internos de la base de datos. Para las opciones, verifica la seguridad de tipos, la validación, la obsolescencia y las actualizaciones dinámicas seguras entre hilos. Para las utilidades internas, prueba desbordamientos superiores e inferiores, entradas no válidas y contratos de aserción. No apruebes cambios de alto riesgo en formatos, recuperación, compactación o caché sin evidencias de pruebas unitarias, de integración, de esfuerzo y comparativas. ## Sincroniza todos los sistemas de compilación y compila en cada plataforma admitida Mantén todos los sistemas de compilación admitidos al añadir o retirar un archivo fuente. Actualiza primero el manifiesto canónico de fuentes y vuelve a generar los archivos de compilación derivados con el generador aprobado. No edites manualmente un archivo interno de compilación generado. Busca las referencias afectadas en todas las definiciones de compilación, lenguajes, documentación e implementaciones. Utiliza el número de CPU del anfitrión para las compilaciones paralelas dentro de los límites de recursos. Impide que modos de compilación distintos reutilicen archivos objeto incompatibles. En las compilaciones manuales, activa el mecanismo del sistema de compilación que realiza una limpieza automática al cambiar la configuración. Admite la matriz de sistemas operativos, compiladores, bibliotecas estándar, sanitizadores y modos de compilación del proyecto. Cuando estén configurados, contempla Linux, macOS, Windows, compiladores nativos y cruzados, compilaciones de lanzamiento, sanitizadores, compilaciones unificadas y enlaces para otros lenguajes. Prefiere las abstracciones de portabilidad del proyecto a las API directas de cada plataforma. Protege las cabeceras, llamadas, atributos y funciones incorporadas específicas de una plataforma que resulten inevitables. Incluye directamente todas las cabeceras estándar en vez de depender de inclusiones transitivas. Garantiza que los binarios de producción y de pruebas de esfuerzo se compilen sin información de tipos en tiempo de ejecución cuando sea una restricción del proyecto. Limita las conversiones descendentes en tiempo de ejecución a las pruebas; en los demás lugares, usa la función auxiliar de conversión estática comprobada del proyecto. Ejecuta comprobaciones del código fuente que rechacen caracteres no admitidos y otros contenidos incompatibles con la integración continua. Utiliza puntuación ASCII en comentarios y cadenas del código fuente cuando el repositorio lo exija. ## Escribe pruebas reproducibles sin depender de esperas fijas Ajusta la profundidad de las pruebas al riesgo: pruebas unitarias para comportamientos aislados, pruebas de integración para interacciones y pruebas de esfuerzo para concurrencia y rendimiento. Cubre los límites, las rutas de error, la recuperación, las diferencias entre plataformas y los casos de regresión. Utiliza casos basados en tablas cuando las entradas difieran, pero compartan el contrato que se prueba. Extrae funciones auxiliares para construcciones repetidas, recorridos de ida y vuelta y secuencias de aserciones. Mantén separados los casos límite deterministas de la cobertura aleatoria. Prefiere el muestreo aleatorio a los productos exhaustivos de parámetros cuando aporte una cobertura útil más amplia. Utiliza la fuente aleatoria del proyecto e imprime la semilla para que los fallos puedan reproducirse. No pongas el proceso en espera mientras aguardas eventos concurrentes. Utiliza puntos de sincronización o señales explícitas para controlar el avance de los hilos. Limita la ejecución de cada prueba unitaria mediante un tiempo de espera definido. Ejecuta en serie un número reducido de pruebas específicas y los conjuntos más grandes mediante el sistema de pruebas paralelas. Somete repetidamente las nuevas pruebas de concurrencia a esfuerzo bajo cambios de contexto forzados. Investiga los fallos intermitentes exclusivos de la integración continua con las herramientas de reproducción específicas del proyecto. Prueba todas las plataformas admitidas que se vean afectadas por rutas, API, compiladores o indicadores de compilación. Garantiza que los fallos de las pruebas informen de estado suficiente para reproducir la configuración que los provocó. Añade las nuevas opciones de configuración y funciones de rendimiento a la cobertura de pruebas de esfuerzo y comparativas. Antes del envío, revisa las pruebas actualizadas para detectar duplicaciones y estados compartidos involuntarios. ## Añade cabeceras de licencia y sincroniza la documentación y las notas de versión Añade a cada archivo fuente nuevo la cabecera de licencia exigida por el repositorio. Conserva en los archivos derivados los avisos de derechos de autor del proyecto original, además de la cabecera del proyecto. Utiliza el prefijo de comentario correcto para cada lenguaje del código fuente. No sustituyas una designación obligatoria de licencia dual por una declaración genérica de derechos. Ejecuta el formateo automático después de los cambios e inspecciona las diferencias resultantes. Ejecuta las herramientas de mantenimiento de dependencias y rechaza modificaciones no relacionadas del manifiesto. Al añadir una función, evalúa métricas útiles sin introducir una regresión en las rutas calientes. Expón las funciones relacionadas con el rendimiento mediante la herramienta estándar de pruebas comparativas. Mantén las notas de publicación breves, orientadas al exterior y centradas en el comportamiento visible para el usuario. Documenta los diseños de los componentes en el índice del subsistema y en capítulos específicos. Cuando sea necesario, garantiza que los sitios o publicaciones generados hagan referencia a metadatos de autor válidos. Para una API, opción o declaración de obsolescencia nueva, sigue el procedimiento específico del repositorio. Actualiza las indicaciones de migración antes de retirar una superficie de API obsoleta. Mantén sincronizados la implementación, los metadatos de compilación, las pruebas, la documentación y las notas de publicación. No dejes un archivo fuente nuevo accesible desde un sistema de compilación, pero ausente de otro. ## Pasa una compilación limpia y las pruebas antes de aprobar un cambio Revisa la corrección, las pruebas, el rendimiento, la compatibilidad, los límites contractuales, el estilo y la documentación como criterios independientes. Exige resultados de pruebas comparativas para los cambios sensibles al rendimiento. Exige cobertura de esfuerzo para comportamientos concurrentes o configurables nuevos. Ejecuta el objetivo completo de compilación limpia y pruebas después de que superen las comprobaciones específicas. Ejecuta la compilación más estricta de comprobación de estado que detecta resultados de error ignorados. Utiliza el modo de limpieza automática para que los indicadores de compilación modificados no puedan reutilizar archivos objeto obsoletos. Supervisa las pruebas prolongadas mediante la información de progreso legible por máquinas del sistema de compilación. Registra la fase, el trabajo completado, el trabajo total, los fallos, el porcentaje y detalles limitados de los fallos. Distingue los fallos de aserción de cierres inesperados, señales, tiempos de espera y errores de infraestructura. Conserva los parámetros de las pruebas comparativas y las configuraciones de prueba junto con las evidencias presentadas. Compila en modo de lanzamiento las pruebas comparativas destinadas a mediciones. Cambia a una compilación de depuración al diagnosticar un cierre inesperado y vuelve a compilar desde cero antes de medir de nuevo. Ejecuta las comprobaciones de formato, código fuente, compilación, pruebas, sanitizadores y plataformas exigidas por la superficie afectada. Vuelve a ejecutar los criterios directamente afectados después de corregir la revisión. No reduzcas una búsqueda de coherencia en todo el repositorio solo porque algunas coincidencias parezcan improbables. Aprueba únicamente cuando concuerden el código, los contratos, las pruebas, los metadatos de compilación, la documentación y las evidencias medidas.