Guías
Experimentos en línea (pruebas A/B)
Su comparación fuera de línea dijo que la nueva versión es mejor. Una prueba A/B en producción hace la misma pregunta a usuarios reales. Su propio enrutador asigna al azar unidades (usuarios o sesiones) entre dos brazos; oloproof experiment lee sus registros y responde con los mismos cuatro estados que cualquier otra regla. El método está admitido por una auditoría independiente en términos declarados: observed_until es su palabra sobre cuándo se extrajo el registro de resultados, las unidades se aleatorizaron de forma independiente, el resultado de ninguna unidad depende del brazo de otra, los resultados no derivaron mientras cambiaba el reparto, y cada mirada lee el registro completo. Fuera de ellos, la respuesta no está cubierta.
Los registros y la declaración
Dos archivos, CSV o JSONL: un registro de asignación con una fila por unidad (la columna de unidad que usted declara, y arm), y un registro de resultados con la unidad y su value.
experiment:
name: checkout-v2
unit: user
allocation: {control: 0.5, treatment: 0.5}
control: control
treatment: treatment
assignments: logs/assignments.csv
outcomes: logs/outcomes.csv
kind: rate
rules:
- {id: lift, kind: superiority}
- {id: no-harm, kind: non_inferiority, margin: 0.01}oloproof experiment experiment.yaml --policy release.yaml --jsonkind: mean toma un range: [low, high] declarado; direction: max lee lo más bajo como mejor. Una unidad asignada sin fila de resultado falta y se acota en su peor valor en cada lado, salvo que missing_outcome: zero diga que ninguna fila significa cero. Registre una fila para cada unidad, ceros incluidos: un registro de conversiones que solo contiene a quienes convirtieron lee cada otra unidad como faltante, y la respuesta se queda en INSUFFICIENT_EVIDENCE. Rellenar con cero supone que la ventana de resultado de cada unidad contada se ha cerrado; una unidad asignada hace una hora aún no ha convertido, y contarla como cero favorece al brazo que convierte más rápido. Declare outcome_window_hours, as_of y observed_until (cuándo se extrajo el registro de resultados), con una columna assigned_at en el registro de asignación, y solo se cuentan las unidades cuya ventana se cerró para as_of; missing_outcome: zero se rechaza sin ellos, sea cual sea el monitoreo. Escriba cada hora con un desfase o Z (2026-10-11T00:00:00Z); una hora sin ninguno se rechaza. as_of no puede ser posterior a observed_until, y ninguno puede estar en el futuro: un resultado posterior a la extracción no está en el registro. La ventana elige la pregunta: una ventana de 48 horas responde «convirtió en 48 horas», así que debe cubrir el retraso del resultado al que se refiere. Los identificadores de unidad se comparan como texto tras quitar espacios, y 42.0 se lee como 42. El código de salida es el de la peor regla: 0 PASS, 1 FAIL, 3 INSUFFICIENT_EVIDENCE, 4 MANUAL_REVIEW.
Qué comprueba primero
- Proporción de la muestra. Los recuentos de unidades de los brazos se contrastan con la asignación declarada (prueba binomial exacta con dos brazos, chi cuadrado con más, umbral 0,001). Un desajuste hace que cada regla sea MANUAL_REVIEW: un reparto roto significa que los brazos ya no son comparables, y más datos del mismo tipo no lo reparan. Encuentre la causa (una redirección que pierde usuarios, un filtro de bots aplicado a un solo brazo) antes de leer cualquier diferencia.
- Una unidad en dos brazos. La asignación se filtró; cada regla se lee MANUAL_REVIEW.
- Varias filas de resultado para una unidad. Se rechaza, porque los eventos de un usuario no son independientes. Declare aggregate: unit_mean para que la media propia de cada unidad sea su resultado: la respuesta trata entonces del usuario promedio, no del evento promedio.
- Un brazo vacío. INSUFFICIENT_EVIDENCE hasta que tenga resultados.
- Filas de resultado que no corresponden a ninguna unidad asignada, con missing_outcome: zero. Los ceros dependen de la unión, así que una unión rota leería unidades reales como ceros; cada regla lee MANUAL_REVIEW hasta que los identificadores coincidan. Por defecto se cuentan y se dejan fuera.
Cómo decide
La media de cada brazo recibe el intervalo que Oloproof ya usa para una ejecución (Clopper-Pearson exacto para una tasa, la media acotada por apuestas en otro caso), cada uno con la mitad del presupuesto de error, y la diferencia se acota con los extremos opuestos de ambos. Se cumple con cualquier tamaño de muestra y es más ancho que un intervalo normal de manual. Una regla de superioridad pasa cuando todo el intervalo está por encima de cero; una regla de no inferioridad pasa cuando su extremo inferior está en o por encima de menos el margen.
monitoring: anytime usa el intervalo por apuestas en ambos brazos, que se cumple por muy a menudo que mire y cuando sea que se detenga. Esto se cumple siempre que cada consulta pase el registro completo hasta ese momento: nunca descarte ni filtre filas por período después de leerlas. El valor por defecto, fixed, se lee una vez con el tamaño de muestra que planificó.
Varios tratamientos
Declare treatments: [b, c] en lugar de treatment: y dé a cada regla el tratamiento que compara (treatment: b). El intervalo de cada brazo se toma a 1 - alpha/m para los m brazos, así que cada tratamiento menos el control queda cubierto a la vez por la cota de la unión: una regla por tratamiento, una afirmación cada una, y la familia se sostiene en conjunto. Cada intervalo es más ancho que con dos brazos, porque cada brazo paga por los demás. Con varios tratamientos, el informe nombra el mejor entre los que pasan todas las reglas que los nombran, y si está separado de cada otro tratamiento que pasa: cada diferencia, acotada por los mismos intervalos simultáneos, excluye el cero. Los empates conservan el orden declarado y nunca se separan. La comprobación de la proporción de la muestra ya lee todos los brazos. La garantía conjunta cubre los brazos de un solo archivo de experimento: repartir los tratamientos entre varios archivos la pierde.
Métricas de razón
Una tasa de clics es clics sobre sesiones, y un usuario con muchas sesiones no es muchos usuarios independientes. Declare la razón sobre una fila por unidad, con rangos en los que estén los valores de cada unidad:
ratio: {numerator: clicks, denominator: sessions, numerator_range: [0, 50], denominator_range: [1, 50]}
aggregate: unit_sum # only if a unit has several rows: they are addedEl estimando es el numerador medio de cada brazo sobre su denominador medio. Ambas medias se acotan con el intervalo admitido, cada una con su parte del presupuesto de error, y la razón dividiendo sus extremos, así que se cumple con cualquier tamaño de muestra sin aproximación normal. Un denominador cuyo intervalo llega a cero no da intervalo. Un valor fuera de su rango es un error de configuración que nombra la unidad, nunca se recorta. El intervalo del método delta, normalmente más estrecho, se muestra al lado y nunca decide.
Una covariable de antes de la prueba
Un resultado que sigue algo medido antes de la prueba (el gasto del mes pasado, las sesiones de la semana pasada) varía menos una vez que eso se descuenta. Aporte el valor de cada unidad de antes de la prueba y un coeficiente fijado antes de leer los resultados de esta prueba:
covariate: {values: logs/pre_period.csv, range: [0, 500], theta_from: logs/history.csv}El resultado decidido es Y - theta (X - c). theta se declara (theta:, con un center: opcional, por defecto el centro del rango), o se ajusta sobre un archivo de historial de un período anterior a la prueba (columnas covariate y outcome), nunca sobre los propios resultados de esta prueba. Como X se midió antes de la asignación, y qué unidades tienen un X también quedó fijado antes de la asignación, la diferencia ajustada tiene el mismo estimando. Una unidad sin valor en el archivo no se ajusta. Un ajuste válido aún puede ser más ancho que ninguno, porque el rango del resultado ajustado es más ancho, así que el informe muestra ambos intervalos y dice cuál es más estrecho; no afirma ningún ahorro.
Novedad e interferencia, mostradas
novelty: {exposure_column: exposed_at, time_column: at, days: 7} lee la primera exposición de cada unidad del registro de asignación y el momento de cada fila de resultado, y muestra la diferencia en los primeros days de exposición y después. Una diferencia temprana decidida con una posterior no decidida u opuesta se nombra "posiblemente un efecto de novedad". La división nunca decide una regla: las unidades sin filas en una franja quedan fuera de ella, no se acotan en su peor valor. Admite un resultado por fila, no una razón ni una covariable.
cluster_column: team cuenta los equipos que contienen unidades de varios brazos y pregunta si el resultado de una unidad puede depender del brazo de otra. Si puede, aleatorice por equipo y declárelo como la unidad.
Los varios tratamientos, las razones y las covariables fueron admitidos por una auditoría independiente y su confirmación el 3 de noviembre de 2026, en los mismos términos que dos brazos.
Fuera de línea y en línea
Nombre la comparación fuera de línea y su métrica (offline_comparison: <id>, offline_metric: pass_rate) y la respuesta informa si las dos direcciones decididas coinciden. Se informa y nunca decide nada: un desacuerdo es una razón para revisar la suite, no un veredicto sobre la versión.
Trampas
- Mirar antes de tiempo. Leer cada día una prueba de horizonte fijo y detenerse en un buen día infla las victorias falsas. Planifique el tamaño de muestra, o declare monitoring: anytime.
- Novedad y aprendizaje. Los usuarios reaccionan a todo lo nuevo y luego se asientan. Una mejora de la primera semana puede desvanecerse; deje correr el tiempo suficiente para cubrir los ciclos de sus usuarios, y declare novelty: para ver la división.
- Interferencia. El intervalo supone que el resultado de una unidad no depende del brazo de otra. Inventario compartido, marketplaces, funciones sociales o una caché calentada por un brazo lo rompen; en ese caso aleatorice por una unidad mayor (una región, un equipo), y declare cluster_column: para ver cuán mezclados están los clústeres.
- Deriva con un reparto cambiante. El intervalo supone que la asignación se mantuvo constante durante la prueba, o que los resultados no derivaron mientras cambiaba. Una rampa del 10 % al 50 %, o 90/10 y luego 10/90 entre un día laborable y un fin de semana, pondera los períodos de forma distinta en cada brazo y mezcla un efecto del tiempo en la diferencia; la comprobación de la proporción de la muestra lee recuentos agregados y no lo ve. Mantenga fijo el reparto, o decida solo sobre el período posterior a la rampa.
- Cambiar la unidad. Aleatorice y analice por la misma unidad. Aleatorizar usuarios y contar sesiones como independientes estrecha el intervalo falsamente.
Lo que esto no puede decirle
- Si el resultado se mantiene para usuarios fuera de la ventana, la región o el tráfico de la prueba.
- Nada sobre una métrica que no declaró antes de la prueba; una métrica elegida a posteriori es una descripción.
- Si su enrutador realmente aleatorizó: la comprobación de proporción de la muestra detecta fallos grandes, no sutiles.
- Cuál tratamiento es el mejor entre los que no pasaron: solo se ordenan los tratamientos que pasan. La asignación estratificada y los diseños switchback no están construidos.