Repository navigation
Las poblaciones de examen se declaran, y el servidor verifica lo que hay dentro - #1171
Merged
github-actions[bot] merged 1 commit intoNov 8, 2026
Merged
Conversation
…hay dentro La decision 2 del ADR-D57: cada poblacion de examen entra como conjunto declarado, descrito y verificable. Son dos, congeladas una vez por el laboratorio sobre Swiss-Prot 2022_03, y ya estan en el almacen: 3.335 proteinas para el examen de sitios y 4.227 para el de dominios. EL PAYLOAD NOMBRA UN MANIFIESTO Y NADA MAS. Una poblacion de examen son varios ficheros (los pares de accesion y md5 con su mitad, el corte, los conceptos, las instancias o los sitios, y el manifiesto del propio laboratorio con los scripts que los construyeron y sus huellas) y una fila de query_set tiene un artifact_uri y un content_sha256. Asi que la fila apunta a un manifiesto que nombra cada fichero con su propia huella. NINGUNA RUTA DEL SISTEMA DE FICHEROS LLEGA A LA OPERACION. Los ficheros estan en el almacen antes de que corra, bajo claves derivadas de su propia huella, por la misma ruta por la que llegaron los vectores de los terminos. Una ruta en un payload dejaria que la API leyera cualquier fichero del servidor. Y UNA HUELLA NO BASTA, que es lo que esta operacion anade sobre la del corpus. Una huella prueba que nadie toco los bytes entre alli y aqui; nunca prueba que sean los bytes que se querian. El 2026-11-08 llego un fichero de vectores cuya etiqueta de linea de comandos nombraba una instantanea y cuyo contenido era de otra, y todas las huellas coincidian. Asi que la operacion abre cada fichero y comprueba lo que hay DENTRO contra lo que el manifiesto afirma: las filas de cada parquet, la cabecera del tsv, su orden, su particion, y que cada accesion es una proteina de la que esta plataforma tiene secuencia. Lo que reporta y no guarda: cuantos de los md5 declarados siguen coincidiendo con la secuencia que la plataforma tiene hoy, y las accesiones donde no. Es una MEDIDA de (poblacion, plataforma) en una fecha, no una propiedad del conjunto: el examen deriva su propia exclusion de la misma comparacion cuando corre. La descripcion de la fila lleva la particion y los conceptos por rol, para que se vean en la plataforma sin descargar nada: los mismos conceptos partidos de otra forma son otra poblacion, y los reservados son los que nadie ha mirado. La migracion b7c3f91d2a04 ensancha el vocabulario de source_kind a seis valores y crea ck_query_set_exam_is_declared, con los mismos cuatro criterios que el del corpus. El test que fija el vocabulario a mano hizo su trabajo: fallo al anadir el valor sin la linea. Veinte tests nuevos, y los que importan son los que RECHAZAN: un prefijo de sha donde se quiere una identidad, una clave con "..", un manifiesto que describe un fichero distinto del que apunta con todas las huellas correctas, un tsv desordenado cuando su huella es de un orden, una accesion repetida, una mitad fuera del vocabulario, y la particion contada contra la afirmada. Mas el que mira el job EN el flush, porque es ahi donde el CHECK hermano pillo el defecto de ayer. Suite completa: 6.623 tests, 0 fallos, exit 0. ruff, mypy sobre 425 ficheros, check_smells, check_sets, check_doc_refs, check_autodoc_coverage, check_openapi_refs y check_row_alignment, todos en 0.
Codecov Report❌ Patch coverage is
Additional details and impacted files@@ Coverage Diff @@
## develop #1171 +/- ##
===========================================
+ Coverage 87.85% 87.96% +0.11%
===========================================
Files 306 405 +99
Lines 23414 31547 +8133
===========================================
+ Hits 20570 27751 +7181
- Misses 2844 3796 +952
🚀 New features to boost your workflow:
|
github-actions Bot
pushed a commit
that referenced
this pull request
Nov 8, 2026
…los (#1172) Seguimiento de #1171 con la revision del laboratorio. Y empieza por **una afirmacion falsa mia** que el sobremesa pillo leyendo los manifiestos del almacen antes de declarar nada. Era el momento barato y lo fue. ## Lo que escribi mal, y es la tercera vez hoy con la misma forma El manifiesto llevaba `"positions_are": "indices, base 0"` **en la raiz**. Era cierto de seis indices de selenocisteina de las comprobaciones del laboratorio y **falso de todos los ficheros de etiquetas**, que cuentan residuos desde 1 como las lineas FT de Swiss-Prot. Un examen portado que se fiara de esa clave habria **desplazado todos los sitios y todos los dominios un residuo**, y nada habria fallado. Tome un hecho cierto de una cosa y lo escribi como propiedad de todo el documento. Medido antes de reescribirlo: ``` sites.parquet position de 1 a 7924, cero filas en 0, sobre 1.986.242 instances.parquet las 10.070 cumplen 1 <= start <= end <= longitud contra proteins.parquet ``` La convencion va ahora **por fichero y por columna**, con la linea del codigo del laboratorio que la lee, y **se comprueba contra los datos**. Y la operacion **exige** `position_conventions` y `halves` en el manifiesto, que es lo que deja indeclarables los dos manifiestos escritos antes: el arreglo no es borrar esos dos objetos, es que el siguiente escrito a mano tampoco pueda repetirlo. ## Las comprobaciones entre ficheros, que una huella no cubre Una huella habla de los bytes de **un** fichero y no tiene nada que decir de dos. Cada fichero puede estar intacto y describir otra poblacion. | comprueba | contra | |---|---| | las mitades del tsv | las de `split.parquet` | | las accesiones de `sites.parquet` e `instances.parquet` | la pertenencia a la poblacion | | `md5(proteins.parquet.sequence)` | el md5 que el tsv declara, fila a fila | | los roles por concepto | **contados** en `concepts.json`, no copiados | Lo ultimo importa mas de lo que parece: esos numeros llegan a la **descripcion de la fila**, que es la identidad visible de la poblacion, asi que una afirmacion no basta. Y los dos examenes los anidan distinto, asi que el mapa por concepto se **busca**: sitios bajo `concepts`, dominios bajo `concepts_detail`, y `roles` en dominios ya es un agregado. ## Y la puerta me pillo cometiendo el error que persigo `check_row_alignment` refuso `dict(zip(...))`, que **se queda el ultimo valor de una clave repetida**. Un `split.parquet` que nombrara una proteina dos veces en dos mitades distintas habria pasado mi comprobacion de desacuerdo. Ahora usa `lookup_by`, que levanta, y hay dos tests que lo fijan. ## La medida que decide el diseno Etiquetas que caen fuera de la secuencia que **esta** plataforma guarda: ``` sitios 38 filas, 2 accesiones todas con md5 distinto dominios 8 filas, 5 accesiones todas con md5 distinto y al contrario NO se cumple: sitios 8 de las 10 con md5 distinto tienen etiquetas que SI caben dominios 35 de las 40 ``` Un control por rango coge **7 de las 50** proteinas cuya secuencia se movio; el md5 coge **las 50**. Asi que el rango se reporta como medida y el md5 es la regla de exclusion, como dice el ADR. ## Ensayado contra los manifiestos reales, sin escribir fila ``` sitios 5 ficheros verificados roles contados 79/42/47/1 = los afirmados split coincide position min 1 max 7924 dominios 6 ficheros verificados roles contados 71/40/9 = los afirmados split coincide secuencias == su md5, fila a fila instancias dentro de la secuencia del propio examen ``` Suite completa **6.642 tests, 0 fallos**. `ruff`, `mypy` sobre 426 ficheros, `check_smells`, `check_row_alignment`, `check_sets`, `check_doc_refs`, `check_autodoc_coverage` y `check_openapi_refs` en 0. > El sobremesa pidio no desplegar ni lanzar los jobs hasta que esten su punto 1 > (los manifiestos, ya rehechos en el almacen) y su punto 3 (esto). Con esto > fusionado, quedan los dos hechos.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
La decision 2 del ADR-D57: cada poblacion de examen entra como conjunto
declarado, descrito y verificable. Son dos, congeladas una vez por el
laboratorio sobre Swiss-Prot 2022_03, y los ficheros ya estan en el almacen,
subidos por la misma ruta por la que llegaron los vectores de los terminos.
El payload nombra un manifiesto y nada mas
Una poblacion de examen son varios ficheros: los pares de (accesion, md5 de la
secuencia del examen) con su mitad, el corte, los conceptos, las instancias o
los sitios, y el manifiesto del propio laboratorio con los scripts que los
construyeron, sus huellas, el Swiss-Prot del que salen y las comprobaciones que
corrio. Una fila de
query_settiene unartifact_uriy uncontent_sha256,asi que la fila apunta a un manifiesto que nombra cada fichero con su huella.
Ninguna ruta del sistema de ficheros llega a la operacion. Una ruta en un
payload dejaria que la API leyera cualquier fichero del servidor, y un alcance
que vive en un payload es una hipotesis disfrazada de constante.
Y una huella no basta, que es lo que esta operacion anade
Una huella prueba que nadie toco los bytes entre alli y aqui. Nunca prueba que
sean los bytes que se querian. Esta manana llego un fichero de vectores cuya
etiqueta de linea de comandos nombraba una instantanea mientras su contenido era
de otra, y todas las huellas coincidian.
Asi que la operacion abre cada fichero y comprueba lo que hay dentro contra
lo que el manifiesto afirma:
(accession, md5, half), en ese ordenLo que reporta y no guarda
Cuantos de los md5 declarados siguen coincidiendo con la secuencia que la
plataforma tiene hoy, y las accesiones donde no. Medido ya a mano sobre el
paquete entregado: 3.325 de 3.335 en sitios y 4.187 de 4.227 en dominios, o
sea las 10 y las 40 que el registro ya nombraba.
Es una MEDIDA de (poblacion, plataforma) en una fecha, no una propiedad del
conjunto: el examen deriva su propia exclusion de la misma comparacion cuando
corre, como dice el registro, y un recuento congelado en una fila esta rancio en
cuanto se mueva una secuencia mas.
A la vista sin descargar nada
La descripcion de la fila lleva la particion y los conceptos por rol,
porque son la identidad de una poblacion de examen: los mismos conceptos
partidos de otra forma son otra poblacion, y los reservados son los que nadie ha
mirado.
La migracion
b7c3f91d2a04ensanchasource_kinda seis valores y creack_query_set_exam_is_declared, con los mismos cuatro criterios que el delcorpus. Es aditiva: ensanchar un CHECK no rompe una fila que ya pasaba, y el
CHECK nuevo solo restringe filas de un tipo del que hay cero.
Y el test que fija el vocabulario a mano hizo exactamente su trabajo: fallo al
anadir el valor sin la linea, que es para lo que su comentario decia que
estaba.
Los tests
Veinte, y los que importan son los que rechazan: un prefijo de sha donde se
quiere una identidad, una clave con
.., un manifiesto que describe un ficherodistinto del que apunta con todas las huellas correctas, un tsv desordenado, una
accesion repetida, una mitad fuera del vocabulario, y la particion contada
contra la afirmada. Mas el que mira el
job_iden el flush, porque es ahidonde el CHECK hermano pillo el defecto de ayer y no al final de la funcion.
Suite completa: 6.623 tests, 0 fallos, exit 0.
ruff,mypysobre 425ficheros,
check_smells,check_sets,check_doc_refs,check_autodoc_coverage,check_openapi_refsycheck_row_alignment, todos en0.