Modo Refactor
El modo Refactor gobierna cambios en la estructura interna del código (simplificación, desacoplamiento, rendimiento, eliminación de deuda técnica) garantizando que los contratos externos y el comportamiento observable se mantengan idénticos.
Con el shortcut /rapid-refactor
/rapid-refactor separar el cálculo de comisiones del formato de salida
(En Codex: $rapid-refactor ….) El shortcut conduce el run completo; la instalación y la invocación por harness están en la guía de shortcuts.
Qué hace su playbook (templates/modes/refactor.json y las reglas del Conductor):
- La baseline es obligatoria (
gate.baseline): es la referencia de no regresión. - Arquitectura: si el proyecto tiene
.rapid-os/standards/architecture.json(lo escribe el onboarding con el stack elegido), el contrato incluye el gate de máquinagate.architecture(obligatorio, no dispensable) yrapid nextproponerapid check --gate gate.architecture -- rapid arch check --new-only. Una violación de capas o de contrato público esRAPID1420yrapid finishno daPASShasta que se corrija el código. Solo cuentan las violaciones que el run añade: las que el proyecto ya tenía cuando el run empezó son deuda, se informan y no bloquean, y un refactor es donde esa deuda se paga: en este modo, un archivo que el run toca y que aún tiene una violación antigua cuenta como fallo, así que no se puede tocar un archivo y dejarlo violando. Cuandoapi/(o la capa de entrada del stack) importainfrastructure/, el mensaje dice dónde va la composición para ese stack (enpython-fastapi,app/main.pyo elpublic.pydel módulo). Detalle en Arquitectura por stack. - Cuando todas las tareas terminan, si el último
test_resulttiene menos tests pasados que la baseline,rapid nextdevuelveblockedcon la diferencia: un refactor no puede reducir los tests que pasan. La comparación nunca se omite en silencio: desde que el run está activo, un refactor cuyogate.baselineno tiene una ejecución de tests con conteo (la baseline se grabó como comando suelto, o la salida no tenía un resumen que Rapid OS pueda leer) quedablockedcon la instrucción de repetirla (rapid check --gate gate.baseline -- <comando de test>), y la comprobación de cobertura perdida también se aplica a mitad de run. Un check ligado a la baseline o a una tarea cuenta como ejecución de tests cuando su salida tiene resumen, sea cual sea su argv. Si la baseline y la última ejecución de tests usaron comandos distintos,rapid nextyrapid finishavisan de que sus conteos no son comparables. Antes de aprobar,rapid approveyrapid finish, el código debe ser el que vio el último check degate.tests(RAPID1423), así que no se puede borrar un test después del último check. - Es una regla del Conductor (
rapid_os/orchestration/conductor.py), no del evaluador.
El resto de esta guía describe el mismo ciclo con comandos v3 (Modo avanzado), útil para CI, depuración y auditoría.
Reglas de oro del Refactor en RAPID OS
- Invarianza de comportamiento: Si los tests funcionales existentes requieren modificaciones de aserción para pasar, no es un refactor puro; es un cambio funcional encubierto.
- Baseline obligatorio: Debe existir una foto verificada del estado de las pruebas antes de modificar la primera línea de código.
- Paridad de suite: La misma suite de pruebas debe ejecutarse antes y después con 0 fallos.
Flujo paso a paso
flowchart LR
Scan["rapid scan --write"] --> Spec["rapid spec create --mode refactor"]
Spec --> Run["rapid run create --risk medium"]
Run --> Base["1. Registrar Baseline"]
Base --> Exec["2. Refactorizar código"]
Exec --> Verify["3. Verificar Paridad"]
Verify --> Eval["4. rapid eval run --require-pass"]
1. Especificación del Refactor
Registra los límites exactos de la reestructuración:
rapid spec create \
--title "Desacoplar capa de persistencia en pagos" \
--mode refactor \
--objective "Extraer repositorio abstracto para aislar la base de datos de la lógica de dominio" \
--scope "Módulo payments/ y adapters/db/" \
--acceptance "0 cambios en firmas públicas de servicios y suite de 150 tests pasando al 100%" \
--task "1. Definir PaymentRepositoryProtocol" \
--task "2. Implementar PostgresPaymentRepository" \
--task "3. Inyectar dependencia en PaymentService" \
--status ready
2. Iniciar el Run y registrar el Baseline
Crea el run en RAPID OS:
rapid run create \
--spec desacoplar-capa-de-persistencia-en-pagos \
--harness codex \
--classification bounded \
--risk medium
Captura de Evidencia Baseline
Ejecuta la suite completa sobre el código original y añade la evidencia:
{
"kind": "test_result",
"producer": "pytest-baseline",
"summary": "Baseline de 150 tests aprobados en código original",
"gate_ids": ["baseline_check"],
"payload": {
"suite": "all-tests-baseline",
"exit_code": 0,
"passed": 150,
"failed": 0,
"skipped": 0
}
}
rapid evidence add \
--run desacoplar-capa-de-persistencia-en-pagos-r1-run-001 \
--input baseline-evidence.json
Acredita la compuerta de baseline en el estado del run:
rapid run gate \
desacoplar-capa-de-persistencia-en-pagos-r1-run-001 \
baseline_check \
acknowledged \
--reason "Baseline ejecutado y verificado en 150 tests verdes"
3. Ejecución del Refactor en el Harness
Entrega las instrucciones a tu agente o asistente de código asegurando que no toque los archivos de pruebas de contrato existentes.
4. Captura de Evidencia Posterior y Diff
Evidencia de paridad de pruebas
{
"kind": "test_result",
"producer": "pytest-post-refactor",
"summary": "150 tests aprobados post-refactor con cero fallos",
"gate_ids": ["implementation_tests"],
"payload": {
"suite": "all-tests-post-refactor",
"exit_code": 0,
"passed": 150,
"failed": 0,
"skipped": 0
}
}
rapid evidence add \
--run desacoplar-capa-de-persistencia-en-pagos-r1-run-001 \
--input post-evidence.json
Evidencia de cambios de archivos (file_change)
{
"kind": "file_change",
"producer": "git-inspector",
"summary": "Reestructuración confinada al módulo payments sin tocar tests",
"payload": {
"paths": [
"payments/service.py",
"payments/repositories.py"
]
}
}
rapid evidence add \
--run desacoplar-capa-de-persistencia-en-pagos-r1-run-001 \
--input files-evidence.json
5. Evaluación de Comportamiento
rapid eval run \
--run desacoplar-capa-de-persistencia-en-pagos-r1-run-001 \
--write \
--require-pass
El motor de evaluación confirmará que la compuerta de baseline y las pruebas de implementación están verificadas con evidencia matemática idónea.