El campo description es el único trigger de activación. Palabras clave específicas, tercera persona, sin pasos del workflow.
name: mlops-pipeline-audit
description: "Audits MLOps pipeline repos for structural antipatterns — use when reviewing
a machine learning pipeline for code quality, credential exposure, missing
versioning, monitoring gaps, or CI/CD misconfiguration. Triggers on: audit pipeline,
review mlops, check ml pipeline, pipeline health check, mlops review."
allowed-tools: Read Glob Grep TodoRead TodoWrite
context: fork
argument-hint: "[ruta al repo o directorio raíz del pipeline]"
---
description ≠ workflow stepsLa descripción lista condiciones de activación y sinónimos de keywords, NO describe los 5 pasos del pipeline. Esto evita el antipatrón más común y de mayor impacto.
Árbol de decisión aplicado al brief de mlops-pipeline-audit.
¿Cuántos caminos distintos tiene la skill? │ ├── Un camino, siempre igual │ ├── ¿Realiza acciones destructivas? │ │ ├── SÍ → Safety Gate Pattern │ │ └── NO → Linear Progression Pattern │ └── ¿Pasos con dependencias complejas / tolerancia a fallo parcial? │ ├── SÍ → Sequential Pipeline Pattern ◄ ELEGIDO │ └── NO → Linear Progression Pattern │ ├── Múltiples caminos independientes desde setup compartido │ └── Routing Pattern │ └── Múltiples caminos dependientes en secuencia └── Task-Driven Pattern RAZÓN: La auditoría siempre sigue la misma secuencia (descubrimiento → análisis → antipatrones → scoring → informe). Cada fase depende del output de la anterior. Sin acciones destructivas. → Sequential Pipeline es el patrón correcto.
Cada fase tiene criterios de entrada, acciones numeradas y criterios de salida explícitos.
Ruta al repositorio disponible (argumento o cwd). El directorio existe y es accesible vía Glob.
Mapa de archivos ML clasificados: ingest/, transform/, train/, evaluate/, deploy/. Lista de archivos de config CI/CD.
# Acción 1.1 — Glob para archivos Python del pipeline (NUNCA usar Bash find) Glob: "{rootDir}/**/*.py" → lista todos los .py Glob: "{rootDir}/**/*.yaml" → CI/CD, kubeflow, vertex Glob: "{rootDir}/**/*.json" → configs, schemas # Acción 1.2 — Una sola búsqueda combinada (AP-18: evitar cartesian products) Grep: "(train|fit|predict|transform|ingest|pipeline)" en todos los .py de una sola llamada, luego filtrar # Acción 1.3 — TodoCreate para registrar progreso TodoWrite: [ {id: "discover", text: "Fase 1 Descubrimiento", status: "in_progress"}, {id: "analyze", text: "Fase 2 Análisis", status: "pending"}, ... ]
| Antipatrón MLOps | Regex combinado | Severidad | Tool |
|---|---|---|---|
| Credenciales hardcodeadas | (password|secret|api_key|token)\s*=\s*["'][^"']+["'] |
CRÍTICA | Grep |
| Sin versionado de modelos | mlflow\.(log_model|register_model) ausente |
ALTA | Grep |
| Sin seed reproducible | (random_state|seed|np\.random\.seed) ausente en train |
MEDIA | Read + Grep |
| Data leakage en splitting | train_test_split(?!.*stratify) |
MEDIA | Grep |
| Sin logging estructurado | print\((?!.*log) en archivos de pipeline |
BAJA | Grep |
| Sin health checks CI/CD | pytest|unittest ausente en .yaml de CI |
ALTA | Read |
Un solo Grep con regex alternado cubre N archivos × M patrones en una llamada. Sin este patrón, un repo de 1.000 archivos con 10 patrones generaría 10.000 calls.
6 antipatrones del catálogo evitados explícitamente en mlops-pipeline-audit.
Extracto del informe normalizado que produce la skill al ejecutarse sobre un repo cliente ficticio (cliente-rentabiliza-ia/ml-churn-pipeline).
# Informe de Auditoría MLOps ### CRÍTICO — C1: Credenciales hardcodeadas Archivo: src/ingest/db_connector.py:47 Hallazgo: DB_PASSWORD = "prod_pass_2024!" Riesgo: Exposición en historial de git, logs de CI, pull requests públicos. Fix: Mover a variable de entorno + python-dotenv + .env en .gitignore. # Tiempo estimado: 30 min ### CRÍTICO — C2: Sin versionado de modelos Archivo: src/train/train_churn.py Hallazgo: joblib.dump() sin MLflow.log_model() ni DVC tracking. Riesgo: Modelos en producción no reproducibles. Imposible rollback. Fix: mlflow.sklearn.log_model(model, "churn-classifier") + experimento tracking. # Tiempo estimado: 2h ### ALTO — A1: Sin tests en pipeline CI/CD Archivo: .github/workflows/train.yml Hallazgo: Workflow ejecuta train.py sin pytest previo. Fix: Añadir job "test" antes de "train" con pytest tests/. # Tiempo estimado: 1h ### Plan de remediación — Priorizado Sprint 1 (urgente): C1 credenciales, C2 versionado, C3 secrets CI Sprint 2 (1-2 sem): A1 tests CI/CD, A2 data schema validation Sprint 3 (1 mes): M1-M4 mejoras de monitoring y observabilidad
Verificación de que mlops-pipeline-audit cumple todos los criterios de la skill de diseño.
-
✓Tiene secciones "Cuándo usar" Y "Cuándo NO usar" con alternativas específicas
-
✓Usa patrón reconocible (Sequential Pipeline) correctamente seleccionado via árbol de decisión
-
✓Todas las fases numeradas con criterios de entrada y salida explícitos
-
✓Lista solo herramientas que usa realmente:
Read Glob Grep TodoRead TodoWrite— principio de mínimo privilegio -
✓SKILL.md bajo 500 líneas — detalles de patrones en
references/, flujos enworkflows/ -
✓Sin rutas hardcodeadas — usa
{rootDir}y{baseDir}para todas las referencias internas -
✓Sin reference chains — todos los archivos a un salto desde SKILL.md
-
✓Fase 5 incluye paso de verificación: validar que el informe contiene hallazgos en todos los 6 patrones
-
✓Description activa correctamente con keywords: "audit pipeline", "review mlops", "pipeline health check"
-
✓Ejemplos concretos: input (repo path) → output (informe estructurado con severidades)
-
✓Racionalizaciones rechazadas documentadas: "Bash puede hacer todo", "el LLM inferirá el orden"
-
✓Test de escala 10.000 archivos: Glob + Grep combinado mantiene tool calls acotadas (O(1) no O(N×M))
diseno-skills-flujo-trabajo · CULTIVA IA · 2026-06-18