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_filepara 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_filepara nuevos módulos,patchpara 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 congit 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:
# Este ID se repite en cada llamada del método
fc_id = f"prefix:FC:{pub}:{zone_id}" # ← siempre el mismo
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}" # único por estructura
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:
# Pyright se queja, runtime funciona
grandparent = parent.getparent() # ERROR pyright
# Fix: check attribute primero
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" # asignar .text, no pasar en constructor
Verificación post-implementación
pytest tests/ -v --tb=short→ 0 failuresgit status --short→ solo archivos esperadoswc -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) |