| name | python-code-implementation |
| description | Workflow y patrones para añadir funcionalidad sustancial (módulos nuevos, refactor grande, features) a codebases Python existentes. Incluye pitfalls de IDs duplicados, falsos positivos de linter, y reglas de cuándo usar subagentes vs directo. |
Python Implementation — Añadir funcionalidad grande a código existente
Trigger
Cualquier tarea que implique añadir funcionalidad sustancial (500+ líneas, 2+ módulos nuevos, refactor importante) a un código Python existente. No para scripts simples de una pasada.
Workflow numerado
- Audit →
search_files + read_file para entender estructura actual. Cuenta módulos, clases, tests existentes.
- Planificar módulos → listar qué módulos nuevos crear vs qué ficheros existentes patchear.
- Implementar en paralelo →
write_file para nuevos módulos, patch para modificaciones. EVIТАR subagentes en codebases >500 líneas (timeout 9009).
- Verificar importaciones →
python -c "from pkg.module import Class; print('✅')" ANTES de tests.
- Ejecutar tests →
pytest tests/ -v --tb=short
- Debug failures → leer output de test, localizar línea exacta, patchear.
- Repetir 5-6 hasta 0 fallos.
- Commit limpio →
git add -A → git commit -m "feat: title..." → verificar con git status.
Pitfalls críticos
Fallo de IDs duplicados en estructuras múltiples
Cuando un método genera IDs para entidades que se llaman varias veces con los mismos parámetros, los IDs se duplican.
Patrón bug:
def create_structures(self, zones):
for zone_id in zones:
fc_id = f"prefix:FC:{pub}:{zone_id}"
Fix: Añadir suffix o variant al ID:
def add_components(self, parent, zones, suffix=""):
for zone_id in zones:
if suffix:
fc_id = f"prefix:FC:{pub}:{suffix}:{zone_id}"
else:
fc_id = f"prefix:FC:{pub}:{zone_id}"
Señal de alerta: test de assert len(ids) == len(set(ids)) falla → IDs duplicados.
Falso positivo en Pyright con ElementTree
Element.getparent() no existe en tipo Element[str] de pyright pero SÍ en runtime:
grandparent = parent.getparent()
grandparent = parent.getparent() if hasattr(parent, 'getparent') else None
_el() no acepta texto como tercer argumento
_el("Tag", None, "text") pasa "text" como lista de children → TypeError.
Fix correcto:
elem = _el("Tag", None)
elem.text = "text"
Verificación post-implementación
pytest tests/ -v --tb=short → 0 failures
git status --short → solo archivos esperados
wc -l *.py → verificar líneas añadidas
- Commit message detallado: qué módulos nuevos, qué cambios, cuántos tests
Cuando usar subagentes vs directo
| Tamaño códigobase | Enfoque |
|---|
| < 500 líneas | Directo con patch/write_file |
| 500-2000 líneas | Directo, 1-2 subagentes max |
| > 2000 líneas | Directo (subagentes timeout en 9009) |
| Múltiples módulos interdependientes | Directo (evita conflictos de write) |