# C# frente a pyRevit 7, programando Revit 2027 con Claude Code

Material de libre uso (eder3232.com). Medición del 2026-10-30.

**Cómo se midió.** 12 tareas, cada una resuelta con los dos stacks: 24 sesiones nuevas de Claude Code (`claude-opus-5-5`, esfuerzo `high`), sin ayuda humana salvo diálogos de Windows o de seguridad. Cada sesión recibió el mismo enunciado, sin pistas de implementación, y una copia limpia del modelo en un Revit recién abierto. Un verificador independiente decidió si la tarea quedó resuelta leyendo el modelo (y pulsando la interfaz en las tareas de botones).

- **C#:** .NET 10, un runner que carga cada compilación en Revit sin reiniciarlo e inventario de la API sacado de las DLL de Revit 2027.1.
- **pyRevit:** 7.0.0.26278 con su runtime de agente (política `auto`, IronPython 2.7.12) y su servidor MCP, más el mismo inventario.

## Resultados por tarea

| # | Tarea | C# min | C# USD | pyRevit min | pyRevit USD | Notas |
|---|---|---|---|---|---|---|
| 01 | Add-in con un botón en la cinta | 5,8 | 0,90 | 0,7 | 0,42 | C# tuvo que reiniciar Revit y aceptar el aviso de add-in sin firma |
| 02 | Muro recto | 0,7 | 0,26 | 0,9 | 0,49 | |
| 03 | Parámetros | 0,9 | 0,27 | 1,0 | 0,40 | |
| 04 | Plano 2×2 con vistas | 1,8 | 0,49 | 2,1 | 0,79 | En los dos, la vista 3D sin recortar se solapó |
| 05 | Puerta alojada en un muro | 1,0 | 0,31 | 0,8 | 0,34 | |
| 06 | Tabla de planificación | 0,8 | 0,32 | 0,8 | 0,37 | |
| 07 | Ventana no modal (WPF) | 4,8 | 0,92 | 4,3 | 1,10 | C#: aviso de seguridad |
| 08 | IUpdater | 1,9 | 0,49 | 1,3 | 0,46 | |
| 09 | Cotas entre caras | 0,8 | 0,28 | 0,9 | 0,36 | |
| 10 | Familia paramétrica | 2,4 | 0,63 | 4,3 | 1,15 | pyRevit: Revit se cayó con el primer script; la IA lo reabrió y rehízo por etapas |
| 11 | Escalera en U | 1,7 | 0,48 | 1,9 | 0,64 | C#: `Railing.Create` falla porque Revit ya crea las barandillas |
| 12 | Cambiar el código sin reiniciar | 8,3 | 1,40 | 2,3 | 0,64 | pyRevit lo hace de serie; en C# hubo que construir un cargador con Roslyn |

Las 24 sesiones quedaron resueltas según el verificador.

## Totales

| | C# | pyRevit |
|---|---|---|
| Resueltas | 12/12 | 12/12 |
| APIs inventadas | 0 | 0 (1 API retirada: `ElementId.IntegerValue`) |
| Minutos, las 10 tareas de modelo (02–11) | 16,8 | 18,3 |
| Coste, las 10 tareas de modelo | 4,44 USD | 6,10 USD |
| Ejecuciones fallidas, las 10 tareas de modelo | 4 de 30 | 11 de 64 |
| Compilaciones fallidas | 0 de 27 | — |
| Ciclo por iteración (mediana) | 1,1 s compilar + 0,7 s ejecutar | 0,16 s |
| Veces que hizo falta una persona | 3 (aviso de seguridad de add-in sin firma) | 0 |

pyRevit cuesta más por tarea porque lleva más contexto en cada turno (las herramientas de su servidor MCP) y necesita más llamadas.

## Fallos por causa (sesiones en que apareció)

| Causa | C# | pyRevit |
|---|---|---|
| API inventada | 0 | 0 |
| API de otra versión | 0 | 1 |
| Lenguaje (IronPython 2.7: `.Name`, sobrecargas de `ElementId`, codificación) | 0 | 5 |
| Geometría | 1 | 1 |
| Rarezas de la API de Revit | 3 | 2 |
| Entorno (pyRevit: no deja guardar desde el script, 8 de 8 sesiones que guardaban; un crash) | 1 | 9 |
| Fallo silencioso dado por bueno | 0 | 0 |

## Convivencia

- pyRevit 7 convive con Dynamo 4.0.2 (un nodo Python con PythonNet3 siguió funcionando) y con otros add-ins.
- `pyRevitLoader.dll` está compilado para Revit 2025 (.NET 8). Revit 2027 anota un conflicto de versiones en el journal y lo carga igual.
- El instalador por usuario funcionó. Según los issues #3302 y #3441 de pyRevit, el de administrador deja Revit 2027 sin cinta (no se probó).

## Límites

- 12 tareas y una sesión por tarea y stack: el resultado es indicativo, no estadístico.
- El C# medido incluye un runner y un inventario que hay que construir. Sin runner, cada prueba es un reinicio de Revit (~37 s) y, al cambiar el add-in, el aviso de seguridad.
- El runtime de agente de pyRevit es experimental; su comportamiento (en especial, el bloqueo al guardar) puede cambiar.
- Un solo modelo, un solo esfuerzo y una sola versión de Revit (2027.1).
- El coste en USD sale de los transcripts de Claude Code.
