Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Dividir cambios en unidades semánticas y hacer commit. Se activa con "commit", "dividir y commit", "commit semántico".
| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-02 | ✗→✓ | ▲ Improved | 579% | 0% |
| case-05 | ✗→✓ | ▲ Improved | 319% | 0% |
| case-07 | ✗→✓ | ▲ Improved | 463% | 0% |
| case-08 | ✗→✓ | ▲ Improved | 306% | 0% |
| case-09 | ✗→✓ | ▲ Improved | 429% | 0% |
Divide cambios grandes en commits pequeños y significativos con mensajes apropiados. Usa solo comandos git estándar.
bash/semantic-commit [opciones]
--dry-run: Mostrar divisiones de commit propuestas sin hacer commit realmente--lang <idioma>: Forzar idioma para mensajes de commit (en, es)--max-commits <número>: Especificar número máximo de commits (por defecto: 10)bash# Analizar cambios actuales y hacer commit en unidades lógicas /semantic-commit # Verificar propuesta de división únicamente (sin commit real) /semantic-commit --dry-run # Generar mensajes de commit en inglés /semantic-commit --lang en # Generar mensajes de commit en español /semantic-commit --lang es # Dividir en máximo 5 commits /semantic-commit --max-commits 5
git diff HEADDividimos cuando vemos:
bash# Analizar escala de cambios CHANGED_FILES=$(git diff HEAD --name-only | wc -l) CHANGED_LINES=$(git diff HEAD --stat | tail -1 | grep -o '[0-9]\+ insertions\|[0-9]\+ deletions' | awk '{sum+=$1} END {print sum}') if [ $CHANGED_FILES -ge 5 ] || [ $CHANGED_LINES -ge 100 ]; then echo "Cambio grande detectado: se recomienda dividir" fi
bash# Identificar unidades funcionales desde estructura de directorios git diff HEAD --name-only | cut -d'/' -f1-2 | sort | uniq # → src/auth, src/api, components/ui, etc.
bash# Archivos nuevos vs modificaciones de archivos existentes git diff HEAD --name-status | grep '^A' # Archivos nuevos git diff HEAD --name-status | grep '^M' # Archivos modificados git diff HEAD --name-status | grep '^D' # Archivos eliminados
bash# Detectar cambios de relación de imports git diff HEAD | grep -E '^[+-].*import|^[+-].*require' | \ cut -d' ' -f2- | sort | uniq
bash# Obtener lista de archivos cambiados git diff HEAD --name-only # Analizar cambios de cada archivo individualmente git diff HEAD -- <archivo> # Determinar tipo de cambio para archivos git diff HEAD --name-status | while read status file; do case $status in A) echo "$file: Nueva creación" ;; M) echo "$file: Modificación" ;; D) echo "$file: Eliminación" ;; R*) echo "$file: Renombrado" ;; esac done
src/auth/ → Autenticacióncomponents/ → Componentes UItest:docs:chore:bash$ /semantic-commit Analizando cambios... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ Cambios detectados: • src/auth/login.ts (modificado) • src/auth/register.ts (nuevo) • src/auth/types.ts (modificado) • tests/auth.test.ts (nuevo) • docs/authentication.md (nuevo) Divisiones de commit propuestas: ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ Commit 1/3 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ Mensaje: feat: implementar sistema de registro y login de usuario Archivos incluidos: • src/auth/login.ts • src/auth/register.ts • src/auth/types.ts ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ Commit 2/3 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ Mensaje: test: agregar pruebas exhaustivas para sistema de autenticación Archivos incluidos: • tests/auth.test.ts ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ Commit 3/3 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ Mensaje: docs: agregar documentación del sistema de autenticación Archivos incluidos: • docs/authentication.md ¿Ejecutar commit con este plan de división? (y/n/edit):
y: Ir con la división propuestan: Cancelar todoedit: Cambiar mensajes de commitmerge <número1> <número2>: Combinar commitssplit <número>: Dividir más un commitbash$ /semantic-commit --dry-run Analizando cambios... (DRY RUN) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ [Visualización de propuesta de división de commit] ℹ️ Modo DRY RUN: No se ejecutarán commits reales 💡 Para ejecutar, ejecutar nuevamente sin opción --dry-run
bash# Detectar patrones de corrección de errores - Palabras clave como "fix", "bug", "error" - Adición de manejo de excepciones - Correcciones de ramas de condición # Detectar patrones de nuevas características - Creación de archivos nuevos - Adiciones de nuevos métodos - Adiciones de endpoints API
bash# Resetear cambios unstaged si los hay git reset HEAD git status --porcelain > /tmp/original_state.txt # Verificar rama de trabajo CURRENT_BRANCH=$(git branch --show-current) echo "Rama de trabajo: $CURRENT_BRANCH"
bash# Leer plan de división while IFS= read -r commit_plan; do group_num=$(echo "$commit_plan" | cut -d':' -f1) files=$(echo "$commit_plan" | cut -d':' -f2- | tr ' ' '\n') echo "=== Ejecutando commit $group_num ===" # Stage solo archivos relevantes echo "$files" | while read file; do if [ -f "$file" ]; then git add "$file" echo "Staged: $file" fi done # Verificar estado de staging staged_files=$(git diff --staged --name-only) if [ -z "$staged_files" ]; then echo "Advertencia: No hay archivos staged" continue fi # Generar mensaje de commit (análisis LLM) commit_msg=$(generate_commit_message_for_staged_files) # Confirmación de usuario echo "Mensaje de commit propuesto: $commit_msg" echo "Archivos staged:" echo "$staged_files" read -p "¿Ejecutar este commit? (y/n): " confirm if [ "$confirm" = "y" ]; then # Ejecutar commit git commit -m "$commit_msg" echo "✅ Commit $group_num completado" else # Cancelar staging git reset HEAD echo "❌ Commit $group_num omitido" fi done < /tmp/commit_plan.txt
bash# Manejar fallos de pre-commit hook commit_with_retry() { local commit_msg="$1" local max_retries=2 local retry_count=0 while [ $retry_count -lt $max_retries ]; do if git commit -m "$commit_msg"; then echo "✅ Commit exitoso" return 0 else echo "❌ Commit falló (intento $((retry_count + 1))/$max_retries)" # Incorporar correcciones automáticas de pre-commit hooks if git diff --staged --quiet; then echo "Cambios corregidos automáticamente por pre-commit hook" git add -u fi retry_count=$((retry_count + 1)) fi done echo "❌ Falló el commit. Por favor verificar manualmente." return 1 } # Recuperar de interrupciones resume_from_failure() { echo "Proceso de commit interrumpido detectado" echo "Estado de staging actual:" git status --porcelain read -p "¿Continuar procesamiento? (y/n): " resume if [ "$resume" = "y" ]; then # Reanudar desde último commit last_commit=$(git log --oneline -1 --pretty=format:"%s") echo "Último commit: $last_commit" else # Reset completo git reset HEAD echo "Proceso reseteado" fi }
bash# Verificar todos los cambios committed remaining_changes=$(git status --porcelain | wc -l) if [ $remaining_changes -eq 0 ]; then echo "✅ Todos los cambios committed" else echo "⚠️ Cambios sin commit permanecen:" git status --short fi # Mostrar historial de commits echo "Commits creados:" git log --oneline -n 10 --graph
bash# Nota: Sin push automático echo "📝 Nota: Push automático no realizado" echo "Si es necesario, hacer push con el siguiente comando:" echo " git push origin $CURRENT_BRANCH"
bash# Obtener y clasificar todos los archivos cambiados git diff HEAD --name-status | while read status file; do echo "$status:$file" done > /tmp/changes.txt # Estadísticas de cambios por directorio funcional git diff HEAD --name-only | cut -d'/' -f1-2 | sort | uniq -c
bash# Agrupación basada en directorios GROUPS=$(git diff HEAD --name-only | cut -d'/' -f1-2 | sort | uniq) for group in $GROUPS; do echo "=== Grupo: $group ===" git diff HEAD --name-only | grep "^$group" | head -10 done
bash# Analizar tipo de cambio para cada archivo git diff HEAD --name-only | while read file; do # Detectar adiciones de nueva función/clase NEW_FUNCTIONS=$(git diff HEAD -- "$file" | grep -c '^+.*function\|^+.*class\|^+.*def ') # Detectar patrones de corrección de errores BUG_FIXES=$(git diff HEAD -- "$file" | grep -c '^+.*fix\|^+.*bug\|^-.*error') # Determinar si es archivo de test if [[ "$file" =~ test|spec ]]; then echo "$file: TEST" elif [ $NEW_FUNCTIONS -gt 0 ]; then echo "$file: FEAT" elif [ $BUG_FIXES -gt 0 ]; then echo "$file: FIX" else echo "$file: REFACTOR" fi done
bash# Analizar relaciones import git diff HEAD | grep -E '^[+-].*import|^[+-].*from.*import' | \ while read line; do echo "$line" | sed 's/^[+-]//' | awk '{print $2}' done | sort | uniq > /tmp/imports.txt # Agrupar archivos relacionados git diff HEAD --name-only | while read file; do basename=$(basename "$file" .js .ts .py) related=$(git diff HEAD --name-only | grep "$basename" | grep -v "^$file$") if [ -n "$related" ]; then echo "Archivos relacionados: $file <-> $related" fi done
bash# Ajustar tamaño de grupo MAX_FILES_PER_COMMIT=8 current_group=1 file_count=0 git diff HEAD --name-only | while read file; do if [ $file_count -ge $MAX_FILES_PER_COMMIT ]; then current_group=$((current_group + 1)) file_count=0 fi echo "Commit $current_group: $file" file_count=$((file_count + 1)) done
bash# Verificar resultados de división for group in $(seq 1 $current_group); do files=$(grep "Commit $group:" /tmp/commit_plan.txt | cut -d':' -f2-) lines=$(echo "$files" | xargs git diff HEAD -- | wc -l) echo "Commit $group: $(echo "$files" | wc -w) archivos, $lines líneas cambiadas" done
text<tipo>[ámbito opcional]: <descripción> [cuerpo opcional] [pie(s) opcional(es)]
Tipos Requeridos:
feat: Nueva característica (adición de característica visible al usuario)fix: Corrección de errorTipos Opcionales:
build: Cambios en sistema de build o dependencias externaschore: Otros cambios (sin impacto en release)ci: Cambios en archivos y scripts de configuración CIdocs: Cambios solo en documentaciónstyle: Cambios que no afectan el significado del código (espacios, formato, punto y coma, etc.)refactor: Cambios de código sin correcciones de errores o adiciones de característicasperf: Mejoras de rendimientotest: Agregando o modificando pruebasIndica el área afectada del cambio:
textfeat(api): agregar endpoint de autenticación de usuario fix(ui): resolver problema de alineación de botón docs(readme): actualizar instrucciones de instalación
Cuando hay cambios disruptivos de API:
textfeat!: cambiar formato de respuesta de API de usuario
o
textfeat(api)!: cambiar flujo de autenticación
Importante: Si existen convenciones específicas del proyecto, tienen prioridad.
Detectar automáticamente configuración de los siguientes archivos:
commitlint.config.jscommitlint.config.mjscommitlint.config.cjscommitlint.config.ts.commitlintrc.js.commitlintrc.json.commitlintrc.yml.commitlintrc.yamlcommitlint en package.jsonbash# Verificar archivos de configuración de ejemplo cat commitlint.config.mjs cat .commitlintrc.json grep -A 10 '"commitlint"' package.json
Ejemplo de tipos específicos del proyecto:
javascript// commitlint.config.mjs export default { extends: ["@commitlint/config-conventional"], rules: { "type-enum": [ 2, "always", [ "feat", "fix", "docs", "style", "refactor", "test", "chore", "wip", // Trabajo en progreso "hotfix", // Corrección de emergencia "release", // Release "deps", // Actualización de dependencias "config", // Cambio de configuración ], ], }, };
javascript// Cuando el proyecto usa mensajes en español export default { rules: { "subject-case": [0], // Deshabilitar para soporte de español "subject-max-length": [2, "always", 72], // Ajustar límite de caracteres para español }, };
bash find . -name "commitlint.config.*" -o -name ".commitlintrc.*" | head -1
bash git log --oneline -50 --pretty=format:"%s"
bash git log --oneline -100 --pretty=format:"%s" | \ grep -oE '^[a-z]+(\([^)]+\))?' | \ sort | uniq -c | sort -nr
textfeat(scope): agregar nueva característica fix(scope): corregir bug docs(scope): actualizar documentación
text✨ feat: agregar registro de usuario 🐛 fix: resolver problema de login 📚 docs: actualizar docs de API
textfeat: agregar funcionalidad de registro de usuario fix: resolver bug del proceso de login docs: actualizar documentación de API
Cómo determinamos tu idioma:
bash # Determinar español si regla subject-case está deshabilitada grep -E '"subject-case".*\[0\]|subject-case.*0' commitlint.config.*
bash # Analizar idioma de últimos 20 commits git log --oneline -20 --pretty=format:"%s" | \ grep -E '^[\x{3040}-\x{30ff}]|[\x{4e00}-\x{9fff}]' | wc -l # Modo español si más del 50% son en español
bash # Verificar idioma de README.md head -10 README.md | grep -E '^\x{3040}-\x{30ff}]|\x{4e00}-\x{9fff}]' | wc -l
# Verificar descripción de package.json grep -E '"description".\x{3040}-\x{30ff}]|\x{4e00}-\x{9fff}]' package.json
bash # Verificar idioma de comentarios en archivos cambiados git diff HEAD | grep -E '^[+-].*//.*[\x{3040}-\x{30ff}]|[\x{4e00}-\x{9fff}]' | wc -l
bash# Calcular puntuación de idioma SPANISH_SCORE=0 # 1. Configuraciones CommitLint (+3 puntos) if grep -q '"subject-case".*\[0\]' commitlint.config.* 2>/dev/null; then SPANISH_SCORE=$((SPANISH_SCORE + 3)) fi # 2. Análisis de git log (máx +2 puntos) SPANISH_COMMITS=$(git log --oneline -20 --pretty=format:"%s" | \ grep -cE '[\x{3040}-\x{30ff}]|[\x{4e00}-\x{9fff}]' 2>/dev/null || echo 0) if [ $SPANISH_COMMITS -gt 10 ]; then SPANISH_SCORE=$((SPANISH_SCORE + 2)) elif [ $SPANISH_COMMITS -gt 5 ]; then SPANISH_SCORE=$((SPANISH_SCORE + 1)) fi # 3. Verificación de README.md (+1 punto) if head -5 README.md 2>/dev/null | grep -qE '[\x{3040}-\x{30ff}]|[\x{4e00}-\x{9fff}]'; then SPANISH_SCORE=$((SPANISH_SCORE + 1)) fi # 4. Verificación de contenido de archivos cambiados (+1 punto) if git diff HEAD 2>/dev/null | grep -qE '^[+-].*[\x{3040}-\x{30ff}]|[\x{4e00}-\x{9fff}]'; then SPANISH_SCORE=$((SPANISH_SCORE + 1)) fi # Determinar: modo español si puntuación >= 3 if [ $SPANISH_SCORE -ge 3 ]; then LANGUAGE="es" else LANGUAGE="en" fi
Verificamos archivos de configuración en este orden:
bash # Buscar en este orden, usar primer archivo encontrado commitlint.config.mjs commitlint.config.js commitlint.config.cjs commitlint.config.ts .commitlintrc.js .commitlintrc.json .commitlintrc.yml .commitlintrc.yaml package.json (sección commitlint)
bash # Aprender patrones de uso de commits recientes git log --oneline -100 --pretty=format:"%s" | \ head -20
git push tú mismogit stash por seguridadAl hacer mensajes de commit, seguimos este orden:
commitlint.config.*package.json → proyecto Node.jsCargo.toml → proyecto Rustpom.xml → proyecto Javacommitlint.config.mjs estándar:
javascriptexport default { extends: ["@commitlint/config-conventional"], rules: { "type-enum": [ 2, "always", ["feat", "fix", "docs", "style", "refactor", "perf", "test", "chore"], ], "scope-enum": [2, "always", ["api", "ui", "core", "auth", "db"]], }, };
Configuración compatible con español:
javascriptexport default { extends: ["@commitlint/config-conventional"], rules: { "subject-case": [0], // Desactivado para español "subject-max-length": [2, "always", 72], "type-enum": [ 2, "always", ["feat", "fix", "docs", "style", "refactor", "test", "chore"], ], }, };
Configuración con tipos personalizados:
javascriptexport default { extends: ["@commitlint/config-conventional"], rules: { "type-enum": [ 2, "always", [ "feat", "fix", "docs", "style", "refactor", "test", "chore", "wip", // Trabajo en progreso "hotfix", // Corrección urgente "release", // Preparación de release "deps", // Actualización de dependencias "config", // Cambios de configuración ], ], }, };
Cuando no se encuentra archivo de configuración:
git logbash # Extraer tipos de los últimos 100 commits git log --oneline -100 --pretty=format:"%s" | \ grep -oE '^[a-z]+(\([^)]+\))?' | \ sort | uniq -c | sort -nr
feat, fix, docs, style, refactor, perf, test, chore, build, ci
Detección automática de scope en Monorepo:
bash# Inferir scope desde carpeta packages/ ls packages/ | head -10 # → api, ui, core, auth se sugieren como scopes
Convenciones específicas de framework:
javascript// Proyecto Angular { 'scope-enum': [2, 'always', [ 'animations', 'common', 'core', 'forms', 'http', 'platform-browser', 'platform-server', 'router', 'service-worker', 'upgrade' ]] } // Proyecto React { 'scope-enum': [2, 'always', [ 'components', 'hooks', 'utils', 'types', 'styles', 'api' ]] }
Convenciones específicas de equipo/empresa:
javascript// Patrón común en empresas hispanohablantes { 'type-enum': [2, 'always', [ 'feat', 'fix', 'docs', 'style', 'refactor', 'test', 'chore', 'wip', // Trabajo en progreso (para pull requests) 'hotfix', // Corrección urgente 'release' // Preparación de release ]], 'subject-case': [0], // Soporte para español 'subject-max-length': [2, 'always', 72] // Configurado más largo para español }
Antes (1 commit gigante):
bash# Archivos cambiados (15 archivos, 850 líneas cambiadas) src/auth/login.js # Nuevo archivo src/auth/register.js # Nuevo archivo src/auth/password.js # Nuevo archivo src/auth/types.js # Nuevo archivo src/api/auth-routes.js # Nuevo archivo src/middleware/auth.js # Nuevo archivo src/database/migrations/001_users.sql # Nuevo archivo src/database/models/user.js # Nuevo archivo tests/auth/login.test.js # Nuevo archivo tests/auth/register.test.js # Nuevo archivo tests/api/auth-routes.test.js # Nuevo archivo docs/authentication.md # Nuevo archivo package.json # Dependencias agregadas README.md # Instrucciones de uso agregadas .env.example # Variables de entorno de ejemplo # Commit problemático tradicional feat: implementar sistema completo de autenticación de usuario con login, registro, restablecimiento de contraseña, rutas API, modelos de base de datos, tests y documentación
Después (dividido en 5 commits con sentido):
bash# Commit 1: Fundación de base de datos feat(db): agregar modelo de usuario y esquema de autenticación Archivos incluidos: - src/database/migrations/001_users.sql - src/database/models/user.js - src/auth/types.js Razón: La estructura de BD es la base para otras características # Commit 2: Lógica de autenticación feat(auth): implementar funcionalidad core de autenticación Archivos incluidos: - src/auth/login.js - src/auth/register.js - src/auth/password.js - src/middleware/auth.js Razón: Lógica de negocio central de autenticación agrupada # Commit 3: Endpoints API feat(api): agregar rutas API de autenticación Archivos incluidos: - src/api/auth-routes.js Razón: Capa API depende de lógica de autenticación # Commit 4: Tests comprehensivos test(auth): agregar tests completos de autenticación Archivos incluidos: - tests/auth/login.test.js - tests/auth/register.test.js - tests/api/auth-routes.test.js Razón: Tests agregados después de implementación completa # Commit 5: Configuración y documentación docs(auth): agregar documentación y configuración de autenticación Archivos incluidos: - docs/authentication.md - package.json - README.md - .env.example Razón: Documentación y configuración agrupadas al final
Antes (commit problemático mezclado):
bash# Archivos cambiados (8 archivos, 320 líneas cambiadas) src/user/service.js # Corrección de bug + refactorización src/user/validator.js # Nuevo archivo (refactorización) src/auth/middleware.js # Corrección de bug src/api/user-routes.js # Corrección de bug + mejora de manejo de errores tests/user.test.js # Tests agregados tests/auth.test.js # Tests de corrección de bug agregados docs/user-api.md # Documentación actualizada package.json # Dependencias actualizadas # Commit problemático fix: resolver bugs de validación de usuario y refactorizar lógica de validación con mejor manejo de errores
Después (dividido por tipo en 3 commits):
bash# Commit 1: Corrección urgente de bugs fix: resolver bugs de validación de usuario y autenticación Archivos incluidos: - src/user/service.js (solo parte de corrección de bug) - src/auth/middleware.js - tests/auth.test.js (solo tests de corrección de bug) Razón: Bugs que afectan producción tienen prioridad máxima # Commit 2: Refactorización de lógica de validación refactor: extraer y mejorar lógica de validación de usuario Archivos incluidos: - src/user/service.js (parte de refactorización) - src/user/validator.js - src/api/user-routes.js - tests/user.test.js Razón: Mejoras estructurales agrupadas por unidad funcional # Commit 3: Actualización de documentación y dependencias chore: actualizar documentación y dependencias Archivos incluidos: - docs/user-api.md - package.json Razón: Mantenimiento del entorno de desarrollo agrupado al final
Antes (commit gigante cruzando características):
bash# Archivos cambiados (12 archivos, 600 líneas cambiadas) src/user/profile.js # Nueva característica A src/user/avatar.js # Nueva característica A src/notification/email.js # Nueva característica B src/notification/sms.js # Nueva característica B src/api/profile-routes.js # API para característica A src/api/notification-routes.js # API para característica B src/dashboard/widgets.js # Nueva característica C src/dashboard/charts.js # Nueva característica C tests/profile.test.js # Tests para característica A tests/notification.test.js # Tests para característica B tests/dashboard.test.js # Tests para característica C package.json # Dependencias para todas las características # Commit problemático feat: agregar gestión de perfil de usuario, sistema de notificaciones y widgets de dashboard
Después (dividido por característica en 4 commits):
bash# Commit 1: Característica de perfil de usuario feat(profile): agregar gestión de perfil de usuario Archivos incluidos: - src/user/profile.js - src/user/avatar.js - src/api/profile-routes.js - tests/profile.test.js Razón: Característica de perfil es unidad funcional independiente # Commit 2: Sistema de notificaciones feat(notification): implementar notificaciones por email y SMS Archivos incluidos: - src/notification/email.js - src/notification/sms.js - src/api/notification-routes.js - tests/notification.test.js Razón: Característica de notificación es unidad funcional independiente # Commit 3: Widgets de dashboard feat(dashboard): agregar widgets interactivos y gráficos Archivos incluidos: - src/dashboard/widgets.js - src/dashboard/charts.js - tests/dashboard.test.js Razón: Característica de dashboard es unidad funcional independiente # Commit 4: Actualización de dependencias e infraestructura chore: actualizar dependencias para nuevas características Archivos incluidos: - package.json Razón: Actualizaciones de dependencias comunes agrupadas al final
| Elemento | Antes (Commits Gigantes) | Después (División Apropiada) | | ----------------------- | ------------------------------------------ | --------------------------------------------------- | | Revisabilidad | ❌ Muy difícil | ✅ Cada commit es pequeño y revisable | | Rastreo de bugs | ❌ Difícil identificar problemas | ✅ Identificación inmediata del commit problemático | | Revertir | ❌ Necesita revertir todo | ✅ Revertir solo la parte problemática | | Desarrollo paralelo | ❌ Propenso a conflictos | ✅ Fácil merge por características | | Despliegue | ❌ Despliegue de todas las características | ✅ Despliegue gradual posible |
--max-commitsedit manualOther measured skills in the registry, with their headline benchmark lift.