@ingeniomaps/cauce 0.93.0 → 0.94.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -14,6 +14,121 @@ desde este repositorio no va, porque el que lee no puede actuar sobre eso. Cuand
14
14
  unas pocas líneas casi siempre es porque cuenta cómo se descubrió el problema o por qué se eligió el
15
15
  diseño — eso vive en el commit y en el código.
16
16
 
17
+ ## [0.94.0] - 2026-09-16
18
+
19
+ ### Agregado
20
+
21
+ - **Cinco reglas nuevas, traídas de una empresa que las pagó.** Salieron de revisar las reglas propias de
22
+ una instancia real: no son ideas, cada una tiene adentro la corrida que costó.
23
+
24
+ - **R24 — una premisa sobre el propio código se abre antes de usarla.** R14 ya exigía registro para lo
25
+ que se afirma de una herramienta o una norma, y dejaba afuera tu propio repositorio, que es donde
26
+ nadie te va a discutir. Cuatro corridas perdidas en un día, todas frenadas en la puerta y ninguna por
27
+ el código: la aceptación pedía algo que el sistema no hace. Y el ancla `archivo:línea` se abre, no se
28
+ copia — una función se movió de la 555 a la 733 en la misma sesión.
29
+ - **R25 — el identificador de una unidad de trabajo no cambia mientras está viva.** Renombrar un slug a
30
+ mitad de camino rompe el cruce entre la cola y lo hecho **sin que nada falle**: cada lado se lee
31
+ coherente por separado. Una tarea partida en cuatro y cerrada con otros nombres costó 594k tokens de
32
+ la corrida siguiente para descubrir que ya estaba construida. Si el nombre tiene que cambiar, va
33
+ `slug-nuevo (antes: slug-viejo)` hasta cerrar.
34
+ - **R26 — una puerta acota su propio costo y no escribe en el árbol que juzga.** Dos revisores lanzando
35
+ la misma suite fueron cuatro corridas en cuatro minutos: el sistema operativo mató la sesión entera
36
+ con un pico de 24,2 GB. Y un formateador con `--fix` o un build que limpia su salida editan el trabajo
37
+ de quien está commiteando. Una puerta que estorba se saltea, y desde ahí no protege de nada.
38
+ - **R27 — una defensa se aplica por defecto y cada excepción se declara sola.** Con lista de lo que
39
+ protege, todo lo que se agregue después nace afuera y nada lo compara. Incluye el caso que más se
40
+ disfraza: «esta comprobación no corre en desarrollo» es una quita escrita como agregado, y garantiza
41
+ que el camino de producción sea el único que nunca se ejercitó.
42
+ - **R28 — un estado lo dice el contenido de un archivo, nunca su presencia.** Un centinela cuya única
43
+ información es existir obliga a que borrarlo sea parte de la resolución, y eso alguien lo olvida: la
44
+ corrida arranca, lee todo el estado y recién ahí muere. Pasó dos veces el mismo día, a 42k tokens por
45
+ vez. Es lo que el WIP de Cauce ya hace bien con `status: IDLE`.
46
+
47
+ - **R9 dice cuándo se puede quitar lo que está en uso.** Exigía probar la ausencia de lo quitado y nunca
48
+ decía cuándo se puede quitar. Ahora: lo que está en uso no se corta, se depreca, y la marca dice las
49
+ dos cosas que la vuelven una salida y no una etiqueta — qué lo reemplaza, y qué condición permite
50
+ borrarlo. Sin la primera, quien lo usa no sabe a dónde ir; sin la segunda, el deprecado es código
51
+ muerto con un cartel puesto y se queda para siempre.
52
+
53
+ Y lo que no llama nadie es otra cosa: se borra. Cortar de golpe rompe a un consumidor que nadie miró;
54
+ deprecar lo que nadie usa cuesta mantener dos caminos para nadie.
55
+
56
+ - **R10 dice a dónde va lo que se publica, no sólo quién lo autoriza.** La autorización decía si se
57
+ publica y nunca dónde. Ahora: lo que se publica va al repositorio en el que estás trabajando, y si ese
58
+ remoto es un fork, va al fork — con la rama cortada de la suya, porque una rama cortada del principal
59
+ es la antesala de mandarle el PR.
60
+
61
+ No se deduce del contexto: que la herramienta resuelva sola el repositorio de origen no es una
62
+ autorización, ni lo son que el cambio «obviamente tenga que llegar ahí» ni que un PR anterior haya ido
63
+ a parar allá. Saltar al principal se pide con todas las letras y para ese caso concreto.
64
+
65
+ Es de las pocas sin vuelta atrás: un PR mal apuntado es trabajo publicado en el repositorio de otro
66
+ equipo — lo vieron, les llegó la notificación, y cerrarlo no deshace nada de eso.
67
+
68
+ - **R8 dice que la prohibición de firmas de IA cubre todo lo que se publica**, no sólo el mensaje del
69
+ commit: el título y el cuerpo del pull request, y los comentarios que se dejen ahí. Y casi nunca es
70
+ algo que alguien tipea — lo agrega la herramienta sola, al final del texto que escribiste—, así que
71
+ cumplirla es revisar la salida antes de publicarla, no acordarse de no escribirla.
72
+
73
+ - **R17 dice qué cuenta como una condición, que es lo que volvía incontable su umbral.** La barra son
74
+ cinco condiciones de aceptación y nunca decía qué es una. Ahora: una condición es un resultado que se
75
+ puede mirar por separado, no una viñeta. Cinco viñetas que describen el mismo invariante desde cinco
76
+ ángulos son **una**, y contarlas como cinco parte por la mitad lo que era una sola cosa.
77
+
78
+ La otra dirección es la cara y la que nadie mira: una frase que promete dos resultados con vidas
79
+ distintas —«valida el pago y manda el email»— son **dos**, y escrita como una el umbral no se entera
80
+ nunca. Contar de menos no dispara nada, y se lee igual que una unidad chica.
81
+
82
+ La prueba no pide criterio: si al tachar una condición las otras siguen valiendo, son distintas; si
83
+ tachar una deja a las demás sin sentido, era una sola dicha en partes.
84
+
85
+ - **R9 ahora pide que la mutación quede escrita, no sólo que se corra.** R9 ya exigía romper, con el
86
+ código puesto, exactamente lo que el caso dice cuidar, y verlo ponerse rojo. Lo que faltaba es que eso
87
+ quedara en la aceptación: una línea con qué se rompe y qué prueba tiene que ponerse roja. Sin ella,
88
+ quien revisa no puede distinguir la mutación que se corrió de la que se pensó, y lo único que le queda
89
+ es volver a correrla — o sea rehacer el trabajo que delegarlo evitaba.
90
+
91
+ Y escribirla antes cambia lo que se escribe: una aceptación que tiene que nombrar qué romper deja de
92
+ poder pedir algo que ninguna mutación puede tocar. Si no hay nada que romper, no había propiedad que
93
+ cuidar, y eso se ve al redactarla en vez de al final de la vuelta.
94
+
95
+ **Lo que cuesta:** el bloque de reglas que cada agente carga al arrancar pasa de **39,1 a 49,1 KB**.
96
+ Está medido, no estimado, y el umbral del aviso de `check` **no se movió**: sigue en 64 KB, porque lo
97
+ que mide es cuánto agregaste vos, y subirlo para hacerle lugar al piso apagaría justamente eso. Quedan
98
+ ~18 KB de margen antes de que el aviso hable.
99
+
100
+ ### Corregido
101
+
102
+ - **El aviso de peso mide lo que agregaste vos, no el total.** Comparaba el bloque entero contra el
103
+ umbral, así que el piso del toolkit y tus reglas salían del mismo bolsillo: decía «tu bloque pesa»
104
+ cuando la mitad la habíamos puesto nosotros, y cada regla que Cauce agregaba te achicaba el margen sin
105
+ que nadie lo decidiera. Ahora el umbral se compara contra tus reglas, y la línea dice las dos cosas —
106
+ `114.8 KB en cada agente (93.8 KB propias)`—: el total es lo que paga el agente y lo propio es lo único
107
+ sobre lo que podés hacer algo.
108
+
109
+ **Una instancia recién creada ya no puede cruzarlo**, por más que el piso crezca. Antes era una cuenta
110
+ que había que rehacer cada vez que agregábamos una regla.
111
+
112
+ El número **no se movió**: sigue en 64 KB, a propósito, porque cambiar qué se mide y cuánto a la vez
113
+ deja sin saber cuál de los dos movió el resultado. Lo que sí quedó medido es que 64 está por debajo de
114
+ lo que una empresa real usa — una instancia medida tiene 93,8 KB de reglas propias — así que elegirlo
115
+ con esa evidencia es lo que sigue.
116
+
117
+
118
+ - **Escribir tu propio `process.md` ya no te deja sin las reglas que no ibas a reemplazar.** El override
119
+ es por nombre de archivo, así que reemplazar «pensar antes de editar» por tu versión se llevaba puesto
120
+ el archivo entero: R16, R17, R20, R21 y R22 dejaban de llegarle a todo agente. `check` te lo decía —lo
121
+ hace desde 0.57.0— y no había nada que hacer al respecto, porque conservarlas exigía copiar su texto y
122
+ una copia deja de recibir las mejoras del `upgrade`.
123
+
124
+ Ahora **R16, R20, R21 y R22 viven en `system/runs.md`** —lo que cuesta una corrida, cuándo una medición
125
+ vale, cómo se retoma lo interrumpido y qué no se toca mientras se mide—, un archivo que reemplazar tu
126
+ proceso no toca. `system/process.md` se queda con R1..R4 y R17.
127
+
128
+ **No tenés que hacer nada**: el archivo nuevo llega en tu próximo `upgrade`. Si ya sobrescribiste
129
+ `process.md`, esas cuatro reglas vuelven a regir solas, y el aviso de `check` se acorta a lo que de
130
+ verdad reemplazaste. El bloque de reglas pasa de cuatro archivos a cinco y pesa lo mismo: 39,1 KB.
131
+
17
132
  ## [0.93.0] - 2026-09-16
18
133
 
19
134
  ### Corregido
@@ -67,38 +67,56 @@ function split(root) {
67
67
  function weight(root) {
68
68
  const { loaded } = split(root)
69
69
  let bytes = 0
70
+ let own = 0
70
71
  const files = []
71
72
  for (const file of loaded) {
72
73
  try {
73
74
  const size = fs.statSync(path.join(root, file)).size
74
75
  bytes += size
76
+ // Lo propio es lo que no vive en `rules/system/`, que es exactamente lo que el proyecto escribió:
77
+ // una regla del sistema que sobrescribió deja de cargarse y la suya ocupa su lugar, así que
78
+ // contarla como propia es correcto — la escribió él y la puede achicar.
79
+ if (!file.includes('/system/')) own += size
75
80
  files.push({ file, size })
76
81
  } catch { /* la que no está en disco ya la reporta `check` por su lado */ }
77
82
  }
78
- return { count: loaded.length, bytes, files: files.sort((a, b) => b.size - a.size) }
83
+ return { count: loaded.length, bytes, own, files: files.sort((a, b) => b.size - a.size) }
79
84
  }
80
85
 
81
86
  const KB = (bytes) => `${(bytes / 1024).toFixed(1)} KB`
82
87
 
83
- // A partir de dónde el peso deja de ser el costo de arrancar y pasa a ser una decisión que conviene mirar.
84
- // El piso que Cauce impone —las cuatro reglas del sistema— son 38,3 KB, así que un umbral por debajo de
85
- // eso avisaría en toda instancia recién creada y se apagaría por ruido el primer día: eso descartó los
86
- // 60 KB que el caso 141 proponía. 64 KB deja ~26 KB para lo propio, que son varias reglas de tamaño
87
- // normal, antes de que el aviso hable.
88
+ // A partir de dónde lo que el proyecto agregó deja de ser el costo de arrancar y pasa a ser una decisión
89
+ // que conviene mirar. **Se compara contra lo propio y no contra el total**, y esa es la diferencia que
90
+ // hace al número significar algo.
91
+ //
92
+ // Contra el total, el piso del toolkit y las reglas de la empresa salían del mismo bolsillo: el aviso
93
+ // decía «tu bloque pesa» cuando la mitad la habíamos puesto nosotros, y cada regla que Cauce agregaba le
94
+ // achicaba el margen sin que nadie lo decidiera. El 64 tampoco salió de un costo medido: salió de
95
+ // esquivar nuestro propio piso —el caso 141 proponía 60 y se subió porque lo que Cauce ponía ya eran
96
+ // 61,9 KB—, así que había que reelegirlo cada vez que el toolkit enseñaba algo. Medido sobre lo propio,
97
+ // el número deja de depender de nosotros y no se toca cuando el piso crece.
98
+ //
99
+ // El valor sigue siendo el que había, y eso es a propósito: cambiar qué se mide y cuánto a la vez deja
100
+ // sin saber cuál de los dos movió el resultado. Lo que se sabe hoy es que **64 está por debajo de lo que
101
+ // una empresa real usa**: una instancia medida tiene 93,8 KB de reglas propias, así que el aviso le sale
102
+ // desde el día que instaló. Elegir el número con esa evidencia es una decisión aparte, y la cuenta que la
103
+ // habilita está en el 141: 61,9 KB ≈ 15,9 K tokens, o sea ~3,9 KB por 1K tokens en **cada** agente.
88
104
  const HEAVY = 64 * 1024
89
105
 
90
106
  // La línea que declara el peso, para que la digan igual `install` y `check`. Nombra las dos más grandes
91
107
  // porque es lo accionable: saber que el bloque pesa no dice cuál conviene declarar por superficie.
92
108
  function weightLine(root) {
93
- const { count, bytes, files } = weight(root)
109
+ const { count, bytes, own, files } = weight(root)
94
110
  const top = files.slice(0, 2).map((one) => path.basename(one.file)).join(', ')
111
+ // El total es lo que paga el agente y lo propio es lo único sobre lo que el proyecto puede hacer algo,
112
+ // así que van los dos: con uno solo, o el número no es el costo real o no es accionable.
95
113
  return `el bloque de reglas carga ${count} archivo(s), ${KB(bytes)} en cada agente`
96
- + (top ? ` (las más grandes: ${top})` : '')
114
+ + ` (${KB(own)} propias)${top ? ` (las más grandes: ${top})` : ''}`
97
115
  }
98
116
 
99
117
  // Sólo cuando pasó el umbral. Devuelve lista porque es lo que `check` empalma con el resto de avisos.
100
118
  function heavyRules(root) {
101
- return weight(root).bytes > HEAVY ? [weightLine(root)] : []
119
+ return weight(root).own > HEAVY ? [weightLine(root)] : []
102
120
  }
103
121
 
104
122
  // Sin raíz el marcador queda como está —así lo leen las pruebas que revisan el texto de un adaptador—: un
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ingeniomaps/cauce",
3
- "version": "0.93.0",
3
+ "version": "0.94.0",
4
4
  "description": "Sistema portable de planificación y ejecución verificable para cualquier proyecto",
5
5
  "keywords": [
6
6
  "planning",
@@ -2,12 +2,15 @@
2
2
 
3
3
  `system/` pertenece a Cauce y se reemplaza completo en cada actualización:
4
4
 
5
- - `system/process.md` — R1..R4, R16, R17, R20..R22: planificación, alcance, review, sincronización de
6
- estado, medición y retomar lo interrumpido.
7
- - `system/code-shape.md` — R5..R7, R11, R18: simplicidad y forma del cambio.
5
+ - `system/process.md` — R1..R4, R17, R25, R28: planificación, review, sincronización de estado, cómo se
6
+ parte una unidad de trabajo y cómo se nombra y se deja escrito su estado.
7
+ - `system/runs.md` — R16, R20..R22, R26: lo que cuesta una corrida, cuándo una medición vale, cómo se
8
+ retoma lo interrumpido, qué no se toca mientras se mide y qué le cuesta una puerta a quien la corre.
9
+ - `system/code-shape.md` — R5..R7, R11, R18, R27: simplicidad, forma del cambio y cómo se escribe una
10
+ defensa.
8
11
  - `system/commits.md` — R8..R10: historia versionada y entrega.
9
- - `system/conduct.md` — R12..R15, R19, R23: trato con sistemas externos, lo que llega de ellos, lo que
10
- se destruye, y la obligación de entregar al negarse.
12
+ - `system/conduct.md` — R12..R15, R19, R23, R24: trato con sistemas externos, lo que llega de ellos, lo
13
+ que se afirma del propio código, lo que se destruye, y la obligación de entregar al negarse.
11
14
 
12
15
  El número es el identificador: una regla se cita por él desde un cargo, un workflow o una entrada de
13
16
  DONE, y por eso no se reordena ni se reusa.
@@ -75,3 +75,22 @@ quedar verde con el defecto adentro sin que sobre un solo doble — lo que falta
75
75
  escribió. Por eso se justifica y se reúsa en vez de prohibirse: un doble sin razón escrita se copia, y la
76
76
  copia deja de coincidir con lo que reemplaza sin que ninguna prueba lo note.
77
77
 
78
+
79
+ ## R27 — Una defensa se aplica por defecto y cada excepción se declara sola
80
+
81
+ Una defensa escrita como lista de lo que protege deja abierto todo lo que venga después. El día que
82
+ alguien agrega una ruta, un campo o un comando, nace afuera —y no falla nada, porque no hay nada que
83
+ compare la lista con lo que existe—. La ausencia no deja rastro, que es la forma de R15 aplicada a un
84
+ mecanismo en vez de a un entregable.
85
+
86
+ Se escribe al revés: cerrado por defecto, y cada excepción declarada de a una, con su razón y en el
87
+ mismo lugar. Así lo que se agrega nace protegido y lo que se abre deja constancia de quién lo abrió.
88
+
89
+ No es una regla de seguridad aunque ahí sea donde más se note. Vale para un guard, para el alcance de un
90
+ lint, para lo que un CI corre, para un permiso: cualquier mecanismo cuya lista alguien tiene que
91
+ acordarse de ampliar.
92
+
93
+ Y el caso que más se disfraza es la excepción por ambiente. «Esta comprobación no corre en desarrollo»
94
+ es una quita escrita como agregado —R9—, y además garantiza que el camino de producción sea el único que
95
+ nunca se ejercitó. Si hace falta que en desarrollo sea más fácil, se le da a desarrollo lo que necesita
96
+ para pasar la comprobación, no una puerta trasera.
@@ -13,6 +13,11 @@ por separado, y quien revise tiene que volver a separarlos a mano.
13
13
  La unidad de aceptación y de evidencia sigue siendo la tarea: su entrada de DONE registra todos los
14
14
  commits que produjo, separados por `;`. Partir el diff no parte la aceptación.
15
15
 
16
+ **La prohibición de firmas de IA cubre todo lo que este trabajo publica**, no sólo el mensaje del commit:
17
+ el título y el cuerpo del pull request, y los comentarios que se dejen ahí. Y casi nunca es algo que
18
+ alguien tipea — lo agrega la herramienta, sola, al final del texto que uno escribió—, así que cumplirla
19
+ es revisar la salida antes de publicarla y no acordarse de no escribirla.
20
+
16
21
  ## R9 — El artefacto manda
17
22
 
18
23
  Tests verdes no reemplazan build, paquete, imagen o migración cuando son parte del artefacto entregable.
@@ -28,6 +33,15 @@ una implementación sutilmente equivocada de una correcta. Lo que sí la disting
28
33
  puesto, exactamente lo que el caso dice cuidar, y verlo ponerse rojo por eso. Si no se pone rojo, no lo cuida,
29
34
  y la cobertura no lo va a decir: mide qué líneas se ejecutan, no qué defectos se atrapan.
30
35
 
36
+ **Y esa mutación se declara por escrito, en la aceptación que la pide.** Una línea alcanza: qué se rompe
37
+ y qué prueba tiene que ponerse roja. Sin eso, quien revisa no puede distinguir la mutación que se corrió
38
+ de la que se pensó, y la única salida que le queda es volver a correrla — que es rehacer el trabajo que
39
+ delegarlo evitaba, igual que el contraste de lo consultado en R14.
40
+
41
+ Escribirla antes cambia además lo que se escribe. Una aceptación que tiene que nombrar qué romper deja de
42
+ poder pedir algo que ninguna mutación puede tocar: si no hay nada que romper, no había propiedad que
43
+ cuidar, y eso se ve al redactarla en vez de al final de la vuelta.
44
+
31
45
  La precondición del caso también cuenta. Si el estado en que arranca no puede ocurrir por el camino de
32
46
  producción, lo que prueba tampoco: queda verde para siempre sobre algo que nadie va a vivir.
33
47
 
@@ -42,6 +56,14 @@ frase que la justifica — «lo agrego **para que** deje de …». Ahí el sujet
42
56
  lo que desaparece, y lo que desaparece es lo que hay que probar. Silenciar un aviso, saltear una rama,
43
57
  desarmar una confirmación: los tres se escriben sumando y los tres son quitas.
44
58
 
59
+ **Y antes de probar cómo se quita hay que poder quitarlo.** Lo que está en uso no se corta: se depreca,
60
+ y la marca dice las dos cosas que la vuelven una salida y no una etiqueta — qué lo reemplaza, y qué
61
+ condición permite borrarlo. Sin la primera, quien lo usa no sabe a dónde ir; sin la segunda, el
62
+ deprecado es código muerto con un cartel puesto, y se queda para siempre.
63
+
64
+ Lo que no llama nadie es otra cosa y se borra. La diferencia no es de estilo: cortar de golpe rompe a un
65
+ consumidor que nadie miró, y deprecar lo que nadie usa cuesta mantener dos caminos para nadie.
66
+
45
67
  Esto no admite excepción y por eso se dice acá y no en una guía: **una quita no se entrega sin su
46
68
  aserción de ausencia, y esa aserción se vio en rojo devolviendo lo quitado.** Sin ese rojo no está
47
69
  probado que la aserción mire lo que dice mirar — es el mismo rojo previo del párrafo de arriba, aplicado
@@ -76,3 +98,16 @@ Decirlo es parte de la regla y no una nota al pie. Una norma que se presenta com
76
98
  lo está enseña a no creerle al resto: quien descubre que puede mergear sin que nada lo frene concluye
77
99
  que la línea de arriba es decorativa, y esa conclusión se lleva puesto también lo que sí se comprueba.
78
100
  Que el límite lo sostenga una persona no lo hace más blando; lo hace visible.
101
+
102
+ **Y la autorización dice si se publica, nunca a dónde.** Eso se decide aparte y se comprueba: lo que se
103
+ publica va al repositorio en el que se está trabajando. Si ese remoto es un fork, va al fork —y la rama
104
+ se corta de la suya, no de la del original—, porque una rama cortada del principal es la antesala de
105
+ mandarle el PR.
106
+
107
+ No se deduce del contexto. Que la herramienta resuelva sola el repositorio de origen no es una
108
+ autorización, y tampoco lo son que el cambio «obviamente tenga que llegar ahí», que el fork tenga
109
+ configurado el original por defecto, ni que un PR anterior haya ido a parar allá. Saltar al principal
110
+ —abrir, aprobar, mergear, cerrar o comentar— se pide con todas las letras y para ese caso concreto.
111
+
112
+ Es de las pocas que no tiene vuelta atrás. Un PR mal apuntado es trabajo publicado en el repositorio de
113
+ otro equipo: lo ven, les llega la notificación, y cerrarlo no deshace nada de eso.
@@ -218,3 +218,26 @@ de dónde vino y quién lo autorizó.
218
218
  Cuando el contenido externo cambia lo que se iba a hacer, se dice de dónde salió y decide una persona:
219
219
  al INBOX si es una propuesta, a HUMAN_ACTIONS si necesita una autoridad que el cargo no tiene.
220
220
 
221
+
222
+ ## R24 — Una premisa sobre el propio código se abre antes de usarla
223
+
224
+ R14 gobierna lo que se afirma de una herramienta, un motor, una norma o un sistema de terceros. Lo que
225
+ queda afuera es el código que se está por cambiar, y ahí la afirmación falsa cuesta más: nadie la va a
226
+ discutir, porque el que la escribe y el que la lee miran el mismo repositorio y suponen lo mismo.
227
+
228
+ Toda premisa sobre el comportamiento del propio código —qué hace un endpoint, qué significa un estado,
229
+ dónde vive un componente— se abre en el archivo, en la línea, antes de escribirla en una aceptación, un
230
+ plan o un diagnóstico. No alcanza con recordarla ni con haberla leído la semana pasada.
231
+
232
+ **Y el ancla se abre, no se copia.** Una referencia `archivo:línea` traída de otra tarea es una premisa
233
+ más, no una comprobación: el archivo se movió. En la instancia que originó esta regla, una función pasó
234
+ de la línea 555 a la 733 dentro de la misma sesión.
235
+
236
+ Lo que esto evita es una clase entera de vuelta perdida, y se reconoce porque el trabajo frena en la
237
+ puerta y no en el código: la aceptación pedía algo que el sistema no hace, así que ninguna
238
+ implementación la cumple. Cuatro corridas seguidas se perdieron así en un solo día —una afirmaba que un
239
+ webhook abría acceso sobre filas terminales, y hace lo contrario—, y las cuatro se veían como un
240
+ problema de implementación.
241
+
242
+ El contraste es el mismo que pide R14 y por eso no se repite acá: lo consultado se enumera, con la ruta
243
+ leída y la línea. La diferencia es sólo el sujeto.
@@ -24,30 +24,22 @@ y se registra lo segundo.
24
24
 
25
25
  El estado se mueve de forma atómica entre contratos; nunca se copia para representar progreso.
26
26
 
27
- ## R16 — El costo es el contexto, no las palabras
28
-
29
- Cada llamada reenvía el contexto entero, así que gasta más quien da más vueltas que quien escribe más.
30
- Los comandos independientes van en una sola invocación; el CLI antes que el archivo; el fragmento antes
31
- que el archivo entero; un subagente o un workflow sólo cuando el trabajo no entra en la corrida actual.
32
-
33
- Entre etapas viaja lo que la siguiente necesita para decidir, no todo lo que la anterior produjo. El
34
- análisis completo queda donde se escribió y lo lee una sola vez quien sintetiza al final; lo que se
35
- arrastra en el handoff se reenvía en cada etapa que sigue, así que lo que costó una vez pasa a costar
36
- una vez por etapa. Son requisitos opuestos y por eso no son el mismo texto: el resumen quiere ser corto
37
- porque viaja, y la síntesis quiere estar completa porque decide.
38
-
39
- Se lee para escribir, no para confirmar: un archivo se lee una vez y se escribe entero. Releerlo para
40
- comprobar que quedó no comprueba nada que un error no hubiera dicho.
41
-
42
- Verificar es la excepción, y no se negocia. Ahorrar una llamada nunca justifica afirmar sin haber
43
- comprobado —R14 no admite descuentos— ni dar por terminado lo que no se corrió.
44
-
45
27
  ## R17 — Una unidad de trabajo se parte por lo que acumula, y hay dos formas de acumular
46
28
 
47
29
  Dos barras, y cada una encuentra lo que la otra deja pasar: **cinco condiciones de aceptación** en una
48
30
  tarea, y **cuatro horas de esfuerzo humano**. Arriba de la tarea el conteo sigue: siete criterios en una
49
31
  épica, nueve tareas en un hito.
50
32
 
33
+ **Una condición es un resultado que se puede mirar por separado, no una viñeta.** El número no sirve de
34
+ nada sin esto: cinco viñetas que describen el mismo invariante desde cinco ángulos son **una** condición,
35
+ y contarlas como cinco parte por la mitad lo que era una sola cosa. Al revés cuesta más caro y es el que
36
+ nadie mira: una frase que promete dos resultados con vidas distintas —«valida el pago y manda el
37
+ email»— son **dos**, y escrita como una el umbral no se entera nunca. Contar de menos no dispara nada, y
38
+ eso se lee igual que una unidad chica.
39
+
40
+ La prueba es si se pueden entregar por separado. Si al tachar una las otras siguen valiendo, son
41
+ distintas; si tachar una deja a las demás sin sentido, era una sola dicha en partes.
42
+
51
43
  Y hay una tercera que no se mide antes sino después: **un plan que ninguna crítica aprueba**. Las dos
52
44
  primeras miran la unidad escrita; ésta mira lo que pasó al intentarla, y por eso es la evidencia más
53
45
  directa de las tres — y la única que no se puede tener de antemano. Cuando nadie pudo escribir un plan
@@ -90,103 +82,41 @@ Las dos barras juntas, y en los dos sentidos: una tarea de tres horas con quince
90
82
  el tope de esfuerzo y no se construye nunca; una tarea de una condición y tres días lo pasa por el otro
91
83
  lado. Medir una sola deja pasar la mitad de los casos.
92
84
 
93
- ## R20 — Una medición se lanza contra lo que podría refutarla
94
-
95
- Antes de una tanda cara —evaluaciones, corridas, barridos— se escribe qué se espera encontrar y **qué
96
- resultado lo desmentiría**. Sin esa segunda mitad no hay medición: hay recolección, y recolectar
97
- confirma siempre.
98
-
99
- El tamaño sale de ahí y no de la lista: se corre el mínimo que pueda refutar, no lo que cubra todo.
100
- Y se relee la hipótesis en la primera tanda, porque cuando ya está contestada, seguir cuesta lo mismo
101
- que la primera vez y no agrega nada.
102
-
103
- La exhaustividad tiene su lugar y es otro: cuando cada elemento puede fallar por su cuenta —medir
104
- cincuenta cargos que nunca se midieron—, no hay señal común que una muestra revele. Lo que no
105
- corresponde es tratar una pregunta de sí o no como si fuera un censo.
106
-
107
- El costo de equivocarse acá no se ve mientras pasa: cada corrida termina bien, entrega su resultado y
108
- parece trabajo. Lo que se gasta es la vuelta que no se dio en otra cosa, y eso no aparece en ninguna
109
- salida.
110
-
111
- Repetir una medición que falló pide lo mismo. Una re-corrida sirve para dos cosas y conviene decir cuál:
112
- comprobar un cambio, y entonces ese cambio tiene que poder mover **ese** veredicto —tocar lo que el caso
113
- mide, no cualquier parte del contrato—; o estimar cuánto varía el resultado sin que nada cambie, y
114
- entonces se declara así y se repite varias veces, porque una sola no estima nada. Volver a correr
115
- esperando que esta vez salga distinto no es ninguna de las dos: es comprar un número nuevo con la misma
116
- información.
117
-
118
- Un cambio que no toca lo que el caso mide no compra una re-corrida. La medición vuelve a costar entera y
119
- lo que devuelve es la varianza que ya estaba ahí — y esa varianza existe: en la sesión que originó esta
120
- regla, cargos que habían pasado todos sus casos fallaron uno al día siguiente sin que el motivo tocara
121
- nada de lo que se había cambiado.
122
-
123
- Y lo que se repite es el caso que falló, no la batería. Un sujeto que falla uno de seis vuelve a correr
124
- ese uno: los otros cinco veredictos ya se tienen, y volver a mirarlos cuesta lo mismo que obtenerlos la
125
- primera vez. El registro parcial que sale de ahí no vale solo —cubre menos casos de los que existen— y
126
- se compone con los veredictos que no se volvieron a medir, diciendo de qué corrida viene cada uno.
127
-
128
- ## R21 — Retomar empieza por establecer qué quedó hecho
129
-
130
- Un trabajo caro que se corta —por un límite, una caída, una interrupción— deja trabajo hecho. Antes de
131
- volver a lanzarlo se establece cuál es: qué artefactos hay en disco, qué resultados se escribieron, qué
132
- elementos ya tienen veredicto. Recién con esa lista se decide, y lo que se corre es la diferencia.
133
-
134
- «Continuá» no autoriza a relanzar. Pide exactamente lo contrario: seguir desde donde se quedó, que es
135
- imposible sin haber mirado antes dónde fue. Relanzar entero cobra de nuevo lo que ya se pagó, y quien
136
- lo pide no tiene cómo saber que eso está pasando —la corrida se ve igual empiece donde empiece—.
137
-
138
- Y cuando el pedido sí es relanzar —«de nuevo», «desde cero», «reiniciá»— tampoco se ejecuta derecho:
139
- primero se entrega el veredicto de lo avanzado y se pregunta si aun así quiere la corrida entera. Puede
140
- quererla, y hay razones legítimas: el sujeto cambió, lo anterior quedó sospechoso, se busca medir
141
- varianza. Lo que no puede es tirarse trabajo sin que nadie lo haya decidido.
142
-
143
- El veredicto existe para que se pueda decidir, así que tiene que traer con qué. Cuatro cosas:
144
-
145
- - **Qué ya tiene resultado**, elemento por elemento, y cuál es.
146
- - **Qué quedó a medias y si sirve.** Son dos preguntas distintas y la segunda no se contesta viendo que
147
- el archivo está.
148
- - **Cuánto cuesta rehacer cada parte**, con el número de lo que ya se gastó al lado.
149
- - **Cómo se puede partir.** Casi nunca es todo o nada: si un pedazo cuesta la mitad del total, va
150
- separado para que se pueda correr uno y decidir el otro después, con el primero a la vista.
151
-
152
- **Lo hecho no es lo aprovechable, y la diferencia sólo se ve mirando.** Un trabajo interrumpido deja
153
- artefactos que parecen completos: la etapa que escribió su análisis y murió antes de devolverlo se ve
154
- igual que la que cerró, y los archivos de dos corridas distintas conviven en el mismo directorio sin
155
- que nada los distinga salvo la fecha. Comprobar cuál es cuál cuesta minutos; suponerlo cuesta la
156
- corrida entera y encima produce una medición contaminada — un resultado calculado sobre insumos que ya
157
- fueron sobrescritos, que es peor que no tenerlo porque se lee igual que uno bueno.
158
-
159
- Por eso el veredicto puede terminar en «desde cero», y eso no lo invalida. Establecer que no había nada
160
- rescatable **es** el trabajo de la regla: lo que R21 impide no es relanzar, es relanzar sin saber.
161
-
162
- Un elemento que ya tiene veredicto no se vuelve a medir por venir en la misma tanda: cuesta lo mismo que
163
- la primera vez y su resultado no puede cambiar, que es lo que R20 nombra. Si existe un filtro para correr
164
- sólo lo que falta, usarlo no es una optimización: es la forma correcta de la corrida.
165
-
166
- Un mecanismo de reanudación se comprueba, nunca se supone —R14 no hace excepción con las herramientas
167
- propias—. Después de reanudar se mira si efectivamente reutilizó: cuántas unidades de trabajo nuevas
168
- aparecieron, cuánto se gastó. La sesión que originó esta regla creyó estar reanudando desde caché y
169
- volvió a correr entero dos veces: siete millones de tokens para un solo veredicto, con los archivos de
170
- las etapas ya cumplidas a la vista en el directorio de trabajo, y con el filtro que lo evitaba escrito
171
- por quien reanudaba tres horas antes.
172
-
173
- ## R22 — Lo que se mide no se toca mientras se mide
174
-
175
- Mientras una medición corre, el sujeto y todo aquello contra lo que resuelve se quedan quietos. No se
176
- edita el contrato que se está midiendo, ni el motor que la corrida usa, ni el entorno del que lee.
177
-
178
- Lo que lo vuelve difícil de ver es que no avisa. La corrida termina, entrega su resultado y **ese
179
- resultado se lee exactamente igual que uno limpio**: no hay señal que diga «esto midió dos versiones».
180
- Quien lo reciba va a decidir sobre él sin saber que se movió el piso.
181
-
182
- Y el camino por el que entra casi nunca es el archivo obvio. Un banco desechable puede resolver la
183
- herramienta por un enlace al repositorio vivo, así que editar ahí cambia lo que la corrida lee sin que
184
- nada del banco se haya tocado. La pregunta no es «¿toqué el sujeto?» sino «¿toqué algo que el sujeto
185
- alcanza?».
186
-
187
- Si hace falta trabajar igual, se trabaja donde la medición no mira: otra copia, otra rama sin
188
- materializar, o se espera. Esperar es más barato que descubrir que la tanda no vale.
189
-
190
- Y si ya pasó, se dice: qué medición, qué cambió y cuándo. Un resultado cuyo entorno se movió es una
191
- hipótesis, no un veredicto —lo mismo que R21 nombra para lo que quedó a medias—, y guardarlo sin esa
192
- marca es la forma cara del error, porque el número sobrevive a la sesión que sabía.
85
+
86
+ ## R25 — El identificador de una unidad de trabajo no cambia mientras está viva
87
+
88
+ El slug con el que una tarea se escribe es el mismo con el que se cierra. Renombrarlo a mitad de camino
89
+ —porque se entendió mejor el alcance, porque se partió en dos, porque el nombre viejo quedó feo— rompe
90
+ lo único que ata la cola con lo entregado.
91
+
92
+ Y rompe **sin que nada falle**, que es lo que lo vuelve caro. El estado de una unidad no está escrito en
93
+ ningún lado: se deriva cruzando el identificador entre la cola, lo reclamado y lo hecho. Con el nombre
94
+ cambiado, las dos mitades dejan de cruzarse y cada lado se lee coherente por separado: la cola muestra
95
+ una tarea pendiente que ya está construida, y lo hecho muestra una entrega que nadie pidió. La puerta
96
+ pasa en verde. En la instancia que originó esta regla, una tarea partida en cuatro se cerró con dos
97
+ nombres nuevos y la corrida siguiente gastó 594k tokens para descubrir que tres de ellas ya estaban
98
+ hechas.
99
+
100
+ Cuando el nombre de verdad tiene que cambiar, la salida es barata y hay que escribirla: el nuevo lleva
101
+ el viejo al lado —`slug-nuevo (antes: slug-viejo)`— hasta que la unidad se cierra. Ahí el cruce vuelve a
102
+ existir y lo puede hacer una persona leyendo.
103
+
104
+ Partir una unidad es otra cosa y no la toca: las partes son unidades nuevas, con identificadores nuevos,
105
+ y la original se cierra diciendo en qué se partió. Lo que R25 prohíbe es que la misma unidad viva con
106
+ dos nombres.
107
+
108
+ ## R28 — Un estado lo dice el contenido de un archivo, nunca su presencia
109
+
110
+ Un bloqueo, una pausa o un trabajo en curso que se representan con «el archivo está» tienen un modo de
111
+ fallo que no se ve: resolverlos exige acordarse de borrar, y el que revisa lee lo que el archivo dice
112
+ —que ya está resuelto— mientras el mecanismo sigue leyendo que existe.
113
+
114
+ Se paga entero y en la puerta de entrada: la corrida arranca, lee el estado completo, y recién ahí
115
+ descubre que lo que la frena es un archivo que alguien dejó puesto. En la instancia que originó esta
116
+ regla pasó dos veces el mismo día —la segunda después de haber dicho que no se repetiría— a 42k tokens
117
+ por vez.
118
+
119
+ El archivo se queda y su contenido dice en qué estado está. Es lo que ya hace el WIP de este toolkit:
120
+ `status: IDLE` es un estado escrito, no un archivo ausente, así que quien lo lee y quien lo comprueba
121
+ leen lo mismo. Un centinela cuya única información es existir obliga a que el borrado sea parte de la
122
+ resolución, y eso es una convención que alguien va a olvidar.
@@ -0,0 +1,153 @@
1
+ # Cómo se gasta una corrida
2
+
3
+ Lo que cuesta una vuelta de trabajo y qué la vuelve aprovechable: dónde se va el contexto, cuándo una
4
+ medición vale, cómo se retoma lo que se cortó y qué no se toca mientras se mide.
5
+
6
+ Viven acá y no en `process.md` por una razón medida. El override de una regla es por nombre de archivo,
7
+ así que una empresa que escribe su propio `process.md` —reemplazar «pensar antes de editar» por su
8
+ versión es lo primero que hace cualquiera— se llevaba puestas también éstas, que nadie reemplaza y que
9
+ `effectiveRules` dejaba de entregarle a todo agente. Una instancia real lo vivió: las declaró «adoptadas
10
+ por referencia» en una tabla de prosa que el motor no lee, y aun así dos de ellas no estaban rigiendo el
11
+ día que le costaron una sesión entera (caso 160).
12
+
13
+ ## R16 — El costo es el contexto, no las palabras
14
+
15
+ Cada llamada reenvía el contexto entero, así que gasta más quien da más vueltas que quien escribe más.
16
+ Los comandos independientes van en una sola invocación; el CLI antes que el archivo; el fragmento antes
17
+ que el archivo entero; un subagente o un workflow sólo cuando el trabajo no entra en la corrida actual.
18
+
19
+ Entre etapas viaja lo que la siguiente necesita para decidir, no todo lo que la anterior produjo. El
20
+ análisis completo queda donde se escribió y lo lee una sola vez quien sintetiza al final; lo que se
21
+ arrastra en el handoff se reenvía en cada etapa que sigue, así que lo que costó una vez pasa a costar
22
+ una vez por etapa. Son requisitos opuestos y por eso no son el mismo texto: el resumen quiere ser corto
23
+ porque viaja, y la síntesis quiere estar completa porque decide.
24
+
25
+ Se lee para escribir, no para confirmar: un archivo se lee una vez y se escribe entero. Releerlo para
26
+ comprobar que quedó no comprueba nada que un error no hubiera dicho.
27
+
28
+ Verificar es la excepción, y no se negocia. Ahorrar una llamada nunca justifica afirmar sin haber
29
+ comprobado —R14 no admite descuentos— ni dar por terminado lo que no se corrió.
30
+
31
+ ## R20 — Una medición se lanza contra lo que podría refutarla
32
+
33
+ Antes de una tanda cara —evaluaciones, corridas, barridos— se escribe qué se espera encontrar y **qué
34
+ resultado lo desmentiría**. Sin esa segunda mitad no hay medición: hay recolección, y recolectar
35
+ confirma siempre.
36
+
37
+ El tamaño sale de ahí y no de la lista: se corre el mínimo que pueda refutar, no lo que cubra todo.
38
+ Y se relee la hipótesis en la primera tanda, porque cuando ya está contestada, seguir cuesta lo mismo
39
+ que la primera vez y no agrega nada.
40
+
41
+ La exhaustividad tiene su lugar y es otro: cuando cada elemento puede fallar por su cuenta —medir
42
+ cincuenta cargos que nunca se midieron—, no hay señal común que una muestra revele. Lo que no
43
+ corresponde es tratar una pregunta de sí o no como si fuera un censo.
44
+
45
+ El costo de equivocarse acá no se ve mientras pasa: cada corrida termina bien, entrega su resultado y
46
+ parece trabajo. Lo que se gasta es la vuelta que no se dio en otra cosa, y eso no aparece en ninguna
47
+ salida.
48
+
49
+ Repetir una medición que falló pide lo mismo. Una re-corrida sirve para dos cosas y conviene decir cuál:
50
+ comprobar un cambio, y entonces ese cambio tiene que poder mover **ese** veredicto —tocar lo que el caso
51
+ mide, no cualquier parte del contrato—; o estimar cuánto varía el resultado sin que nada cambie, y
52
+ entonces se declara así y se repite varias veces, porque una sola no estima nada. Volver a correr
53
+ esperando que esta vez salga distinto no es ninguna de las dos: es comprar un número nuevo con la misma
54
+ información.
55
+
56
+ Un cambio que no toca lo que el caso mide no compra una re-corrida. La medición vuelve a costar entera y
57
+ lo que devuelve es la varianza que ya estaba ahí — y esa varianza existe: en la sesión que originó esta
58
+ regla, cargos que habían pasado todos sus casos fallaron uno al día siguiente sin que el motivo tocara
59
+ nada de lo que se había cambiado.
60
+
61
+ Y lo que se repite es el caso que falló, no la batería. Un sujeto que falla uno de seis vuelve a correr
62
+ ese uno: los otros cinco veredictos ya se tienen, y volver a mirarlos cuesta lo mismo que obtenerlos la
63
+ primera vez. El registro parcial que sale de ahí no vale solo —cubre menos casos de los que existen— y
64
+ se compone con los veredictos que no se volvieron a medir, diciendo de qué corrida viene cada uno.
65
+
66
+ ## R21 — Retomar empieza por establecer qué quedó hecho
67
+
68
+ Un trabajo caro que se corta —por un límite, una caída, una interrupción— deja trabajo hecho. Antes de
69
+ volver a lanzarlo se establece cuál es: qué artefactos hay en disco, qué resultados se escribieron, qué
70
+ elementos ya tienen veredicto. Recién con esa lista se decide, y lo que se corre es la diferencia.
71
+
72
+ «Continuá» no autoriza a relanzar. Pide exactamente lo contrario: seguir desde donde se quedó, que es
73
+ imposible sin haber mirado antes dónde fue. Relanzar entero cobra de nuevo lo que ya se pagó, y quien
74
+ lo pide no tiene cómo saber que eso está pasando —la corrida se ve igual empiece donde empiece—.
75
+
76
+ Y cuando el pedido sí es relanzar —«de nuevo», «desde cero», «reiniciá»— tampoco se ejecuta derecho:
77
+ primero se entrega el veredicto de lo avanzado y se pregunta si aun así quiere la corrida entera. Puede
78
+ quererla, y hay razones legítimas: el sujeto cambió, lo anterior quedó sospechoso, se busca medir
79
+ varianza. Lo que no puede es tirarse trabajo sin que nadie lo haya decidido.
80
+
81
+ El veredicto existe para que se pueda decidir, así que tiene que traer con qué. Cuatro cosas:
82
+
83
+ - **Qué ya tiene resultado**, elemento por elemento, y cuál es.
84
+ - **Qué quedó a medias y si sirve.** Son dos preguntas distintas y la segunda no se contesta viendo que
85
+ el archivo está.
86
+ - **Cuánto cuesta rehacer cada parte**, con el número de lo que ya se gastó al lado.
87
+ - **Cómo se puede partir.** Casi nunca es todo o nada: si un pedazo cuesta la mitad del total, va
88
+ separado para que se pueda correr uno y decidir el otro después, con el primero a la vista.
89
+
90
+ **Lo hecho no es lo aprovechable, y la diferencia sólo se ve mirando.** Un trabajo interrumpido deja
91
+ artefactos que parecen completos: la etapa que escribió su análisis y murió antes de devolverlo se ve
92
+ igual que la que cerró, y los archivos de dos corridas distintas conviven en el mismo directorio sin
93
+ que nada los distinga salvo la fecha. Comprobar cuál es cuál cuesta minutos; suponerlo cuesta la
94
+ corrida entera y encima produce una medición contaminada — un resultado calculado sobre insumos que ya
95
+ fueron sobrescritos, que es peor que no tenerlo porque se lee igual que uno bueno.
96
+
97
+ Por eso el veredicto puede terminar en «desde cero», y eso no lo invalida. Establecer que no había nada
98
+ rescatable **es** el trabajo de la regla: lo que R21 impide no es relanzar, es relanzar sin saber.
99
+
100
+ Un elemento que ya tiene veredicto no se vuelve a medir por venir en la misma tanda: cuesta lo mismo que
101
+ la primera vez y su resultado no puede cambiar, que es lo que R20 nombra. Si existe un filtro para correr
102
+ sólo lo que falta, usarlo no es una optimización: es la forma correcta de la corrida.
103
+
104
+ Un mecanismo de reanudación se comprueba, nunca se supone —R14 no hace excepción con las herramientas
105
+ propias—. Después de reanudar se mira si efectivamente reutilizó: cuántas unidades de trabajo nuevas
106
+ aparecieron, cuánto se gastó. La sesión que originó esta regla creyó estar reanudando desde caché y
107
+ volvió a correr entero dos veces: siete millones de tokens para un solo veredicto, con los archivos de
108
+ las etapas ya cumplidas a la vista en el directorio de trabajo, y con el filtro que lo evitaba escrito
109
+ por quien reanudaba tres horas antes.
110
+
111
+ ## R22 — Lo que se mide no se toca mientras se mide
112
+
113
+ Mientras una medición corre, el sujeto y todo aquello contra lo que resuelve se quedan quietos. No se
114
+ edita el contrato que se está midiendo, ni el motor que la corrida usa, ni el entorno del que lee.
115
+
116
+ Lo que lo vuelve difícil de ver es que no avisa. La corrida termina, entrega su resultado y **ese
117
+ resultado se lee exactamente igual que uno limpio**: no hay señal que diga «esto midió dos versiones».
118
+ Quien lo reciba va a decidir sobre él sin saber que se movió el piso.
119
+
120
+ Y el camino por el que entra casi nunca es el archivo obvio. Un banco desechable puede resolver la
121
+ herramienta por un enlace al repositorio vivo, así que editar ahí cambia lo que la corrida lee sin que
122
+ nada del banco se haya tocado. La pregunta no es «¿toqué el sujeto?» sino «¿toqué algo que el sujeto
123
+ alcanza?».
124
+
125
+ Si hace falta trabajar igual, se trabaja donde la medición no mira: otra copia, otra rama sin
126
+ materializar, o se espera. Esperar es más barato que descubrir que la tanda no vale.
127
+
128
+ Y si ya pasó, se dice: qué medición, qué cambió y cuándo. Un resultado cuyo entorno se movió es una
129
+ hipótesis, no un veredicto —lo mismo que R21 nombra para lo que quedó a medias—, y guardarlo sin esa
130
+ marca es la forma cara del error, porque el número sobrevive a la sesión que sabía.
131
+
132
+ ## R26 — Una puerta acota su propio costo y no escribe en el árbol que juzga
133
+
134
+ Una puerta existe para medir, y una que se lleva la máquina no mide nada: se apaga. Tres límites, y los
135
+ tres se ganaron con una corrida perdida.
136
+
137
+ **Acota su alcance.** Una puerta opina sobre el repositorio que la declara y no sobre sus vecinos. La
138
+ que juzga a otro frena trabajo que no pidió juzgar y lo hace con reglas que ese equipo no escribió.
139
+
140
+ **Acota su costo, con un tope y con un candado.** Dos revisores lanzando la misma suite son dos corridas
141
+ simultáneas, y ninguna de las dos lo sabe. En la instancia que originó esta regla fueron cuatro en cuatro
142
+ minutos: el sistema operativo mató la sesión entera con un pico de 24,2 GB y se llevó puesta la corrida
143
+ que estaba a punto de terminar. Y lo que ya se midió no se vuelve a medir: si el build dejó su
144
+ resultado, la puerta lo lee en vez de rehacerlo.
145
+
146
+ **No escribe en el árbol que juzga.** Un formateador con `--fix`, un build que limpia su salida, un
147
+ gestor que sincroniza antes de arrancar: los tres parecen inocuos y los tres editan el trabajo de quien
148
+ está commiteando, a veces a mitad de camino. La puerta corre sobre una copia, o corre sin la bandera que
149
+ escribe. Este toolkit lo aprendió así —`verify` materializa el índice en un temporal justamente por
150
+ esto— y la regla existe para que la puerta que escribe **la empresa** no lo vuelva a aprender sola.
151
+
152
+ El remate es la razón de las tres: una puerta que estorba se saltea con la variable de escape, y desde
153
+ ahí no protege de nada. Lo que se negocia es el costo, nunca la exigencia.