Fecha: 2026-11-14 · Base medida: el gate de pre-vuelo de este repositorio, con la precedencia leída de su propio código y una tabla de 360 estados precalculada.
Origen de las cifras: la tabla viaja dentro de la página publicada; cualquiera puede abrirla y contar.
El problema no es el código de salida: es el orden
Un pre-vuelo que bloquea escrituras suele presentarse como una lista de comprobaciones. La nuestra tiene 13 códigos de salida y 12 posiciones de guarda, y esa diferencia de uno ya dice algo: dos códigos (11 y 19) comparten posición porque describen el mismo hecho visto desde dos lados —la huella ya habita el destino— y sólo se distinguen por si el blob es el contratado.
Lo que casi nunca se documenta es la precedencia. Sobre un archivo que git ignora, ¿qué se informa: que está sucio o que está fuera de perímetro? Depende del orden, y el orden casi siempre vive en la cabeza de quien lo escribió.
En este repositorio el orden se publica en el propio gate, en una línea:
20 -> 29 -> 10 -> 31 -> 14 -> 23 -> 11/19 -> 12 -> 13 -> 24 -> 15 -> 0 Traducido: primero la aridad de la tupla, después la divergencia de rama, después si el destino existe, después si el universo está vacío, después si hay árbol git, después si el archivo está ignorado, y sólo entonces el desfase del blob.
Seis preguntas, 360 estados
El formulario interactivo pregunta seis cosas:
| # | pregunta | opciones |
|---|---|---|
| 1 | la tupla de pre-vuelo | 2 |
| 2 | el estado del destino | 3 |
| 3 | el estado del árbol git | 5 |
| 4 | el blob del disco frente al contrato | 2 |
| 5 | la huella en el destino | 3 |
| 6 | las líneas frente al contrato | 2 |
2 · 3 · 5 · 2 · 3 · 2 = 360. El simulador no ejecuta el gate: tiene la tabla precalculada y responde qué guarda dispara primero para cada una de las 360 combinaciones.
De las 360, exactamente una llega al permiso terminal. El reparto medido:
| código | qué informa | estados |
|---|---|---|
20 | uso incorrecto: aridad, argumento inválido o TARGET no absoluto | 180 |
31 | universo vacío — destino sin bytes con LINEAS_PRE > 0 | 48 |
10 | el destino no existe: es un alta | 48 |
29 | divergencia de rama: la base es caduca | 36 |
23 | el TARGET está ignorado por git y fuera del perímetro | 12 |
14 | el destino no vive en un árbol git | 12 |
11 | la huella ya habita el destino y el blob es el contratado | 8 |
19 | la huella habita el destino pero el blob no es el contratado | 8 |
12 | blob distinto al contrato | 4 |
13 | estado sucio por cambios ajenos al TARGET | 2 |
15 | líneas distintas al contrato | 1 |
0 | pre-vuelo correcto | 1 |
La mitad de los estados son un error de llamada. Eso no es un detalle: si la mitad de los usos falla en la aridad, el problema no es el gate, es su interfaz.
Por qué el 23 va antes del 12
Hay una decisión en ese orden que vale la pena aislar. Un archivo ignorado por git y sin perímetro declarado está prohibido, con independencia de que su blob coincida o no con el contrato.
Si el gate midiera primero el desfase, el mensaje sería «tu blob cambió» y alguien lo leería como «actualiza la tupla». Sería un gate que mide para autorizar sobre un objeto que no puede autorizar. El orden es entonces parte del contrato, no un detalle de implementación: por eso se publica y por eso el simulador lo lee del código en vez de tenerlo escrito a mano.
Lo que no se puede simular, se declara
El código 24 —el índice declara un bit de frescura (assume-unchanged, skip-worktree), así que git status --porcelain devuelve vacío aunque el disco haya cambiado— está en la lista, tiene su posición (la 10) y no aparece nunca en la tabla de 360.
La razón es que assume-unchanged no es una pregunta de este formulario. Hay dos salidas posibles: inventar un estado donde ese código dispare, o declararlo. El artefacto lo declara, en un campo aparte:
{"codigo": 24, "motivo": "el bit de frescura del indice no se pregunta en este formulario"} Un cero en una tabla se lee como «no ocurre». Y 24 sí ocurre: ocurre en el mundo real, todos los días, cuando alguien marca un archivo como assume-unchanged para que git status deje de molestarle. Un simulador que lo omitiera en silencio mentiría por omisión.
La página se deriva, no se teclea
El detalle que hace todo esto mantenible: el HTML no es texto escrito a mano. Se genera a partir de dos fuentes —la línea de orden y la tabla de la taxonomía— y cada bloque viaja con el identificador del objeto git de su fuente en el momento de generar.
Eso da una propiedad concreta: si el gate cambia y la página no se regenera, un comparador lo dice con los dos identificadores a la vista, y el despliegue se detiene. La página publicada es el sujeto de la medición, no una copia de la idea.
Y no hay ninguna llamada de red: la tabla de 360 estados va embebida en el documento. Se puede abrir sin conexión.
Pruébalo
El simulador está en línea y es de una sola página:
https://indice-rc.vercel.app/simulador.html
Mueve los seis controles y mira qué guarda dispara primero. Si encuentras una combinación donde el resultado te parece injusto, ese es exactamente el punto: el orden se puede discutir, pero ahora está a la vista.

