원클릭으로
cron-chunked-batch
Patrón para dividir tareas batch masivas en chunks procesados por cron jobs individuales con tracking de progreso.
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
메뉴
Patrón para dividir tareas batch masivas en chunks procesados por cron jobs individuales con tracking de progreso.
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
SOC 직업 분류 기준
Catálogo de Addy Osmani de skills engineering para AI coding agents — 8 slash commands mapeados al SDLC (spec → plan → build → test → review → ship).
Generación de informes y documentos profesionales mediante LLM. Arquitectura prompt→LLM→HTML capítulo, plantillas por sección, integración con datos de appState, y patrón demo interactivo. Aplicable a PMST, informes técnicos, auditorías, y cualquier documento estructurado.
AI Engineering Hub — catálogo de proyectos y tutoriales de ingeniería de IA con Jupyter notebooks.
AI Website Cloner — genera clonaciones de sitios web completas con IA desde una URL.
AutoScraper — scraping web automático con IA, aprende patrones de selección y extrae datos sin código.
Baidu Unlimited OCR — OCR gratuito de alta calidad sin límites de uso.
| name | cron-chunked-batch |
| version | 1.0.0 |
| description | Patrón para dividir tareas batch masivas en chunks procesados por cron jobs individuales con tracking de progreso. |
| tags | ["cron","batch","chunking","progress-tracking","automation"] |
Cuando una tarea batch (descarga, scraping, procesamiento) tarda demasiado para ejecutarse de una vez (horas, timeout), dividirla en chunks pequeños (país, archivo, entidad) y procesar un chunk por ejecución de cron. Cada ejecución lee el progreso, procesa un chunk, guarda progreso y termina.
project/
├── scripts/
│ ├── batch-worker.py # Procesa UN solo item/chunk
│ └── batch-wrapper.sh # Lee progreso, determina chunk siguiente, llama al worker
├── data/
│ ├── batch_index.json # Índice de todos los items (URLs, metadatos)
│ └── batch_progress.json # Estado de progreso (chunk actual, completado)
El worker debe:
--item XX o --pais CC)Ejemplo mínimo:
# batch-worker.py
import sys
import json
from pathlib import Path
ITEM_ID = sys.argv[1] if len(sys.argv) > 1 else None
INDEX = json.load(open("batch_index.json"))
DATA_DIR = Path("data")
if ITEM_ID not in INDEX:
print(f"❌ {ITEM_ID} no está en el índice")
sys.exit(1)
# Procesar solo este item
for año, urls in INDEX[ITEM_ID].items():
dir_path = DATA_DIR / ITEM_ID / año
dir_path.mkdir(parents=True, exist_ok=True)
for url in urls:
dest = dir_path / url.split("/")[-1]
if dest.exists():
continue # Saltar si ya existe
# Descargar/procesar...
El wrapper:
batch_progress.json para saber qué chunk tocaEjemplo mínimo:
#!/usr/bin/env bash
# batch-wrapper.sh
set -euo pipefail
cd "$(dirname "$0")/.."
PROGRESS_FILE="data/batch_progress.json"
WORKER="scripts/batch-worker.py"
# Cargar progreso
if [ -f "$PROGRESS_FILE" ]; then
CURRENT=$(python3 -c "import json; print(json.load(open('$PROGRESS_FILE')).get('actual', 0))")
DONE=$(python3 -c "import json; print(json.load(open('$PROGRESS_FILE')).get('completado', False))")
else
CURRENT=0
DONE=False
fi
# Verificar completado
if [ "$DONE" = "True" ]; then
echo "✅ Todo completado"
exit 0
fi
# Leer lista de chunks del índice
CHUNKS=($(python3 -c "import json; print('\n'.join(sorted(json.load(open('data/batch_index.json').keys()))))"))
TOTAL=${#CHUNKS[@]}
# Verificar índice
if [ "$CURRENT" -ge "$TOTAL" ]; then
echo "⚠️ Índice fuera de rango, reiniciando"
CURRENT=0
fi
CHUNK="${CHUNKS[$CURRENT]}"
NEXT=$((CURRENT + 1))
echo "▶️ Chunk: $CHUNK ($NEXT/$TOTAL)"
# Verificar si ya completo
EXISTENTES=$(find "data/$CHUNK" -name "*.pdf" 2>/dev/null | wc -l)
TOTAL_INDICE=$(python3 -c "import json; d=json.load(open('data/batch_index.json')); print(sum(len(v) for v in d.get('$CHUNK',{}).values()))")
if [ "$EXISTENTES" -ge "$TOTAL_INDICE" ] && [ "$TOTAL_INDICE" -gt 0 ]; then
echo "✅ $CHUNK ya completo"
else
# Ejecutar worker
python3 "$WORKER" "$CHUNK"
fi
# Guardar progreso
cat > "$PROGRESS_FILE" <<EOF
{
"chunks": [$(printf '"%s",' "${CHUNKS[@]}" | sed 's/,$//')],
"actual": $NEXT,
"completado": $([ "$NEXT" -ge "$TOTAL" ] && echo "True" || echo "False"),
"ultima_ejecucion": "$(date -u '+%Y-%m-%d %H:%M UTC')",
"chunk_procesado": "$CHUNK"
}
EOF
echo "💾 Progreso: $NEXT/$TOTAL"
no_agent: true # Ejecuta directo, sin LLM
schedule: "every 1h" # Frecuencia entre chunks
repeat: N # Máximo de ejecuciones (>= número de chunks)
deliver: local # Resultados a archivos
script: batch-wrapper.sh # El wrapper
Importante con no_agent: true:
/hermes-home/scripts/ (no el workspace)cd al directorio del proyecto al inicio{
"chunks": ["AT", "BE", "BG", "CH", "CZ", "DE"],
"actual": 3,
"completado": false,
"ultima_ejecucion": "2026-07-08T12:30:00Z",
"chunk_procesado": "BG",
"pdfs_existentes": 57,
"status": "SUCCESS"
}
no_agent: true cambia el working directory: El cron ejecuta desde /hermes-home/scripts/, no desde el workspace. Siempre usar paths absolutos y hacer cd al inicio del wrapper.scripts/descargar_todos_era.py (worker), scripts/eravisor-wrapper.sh (wrapper), Data/indice_era.json (índice), Data/eravisor_progress.json (progreso)