--- name: job_cleanup kind: function lang: go domain: infra version: "1.0.0" purity: impure signature: "func JobCleanup(q *JobQueue, olderThan time.Duration) (int64, error)" description: "Elimina jobs en estados terminales (completed, failed, dead) cuyo created_at sea mas antiguo que olderThan. Retorna el numero de filas eliminadas. Util para mantener la tabla compacta en apps de larga duracion." tags: [job, queue, cleanup, delete, maintenance, sqlite, async, background, infra] uses_functions: [] uses_types: [job_queue_go_infra] returns: [] returns_optional: false error_type: "error_go_core" imports: [fmt, time] params: - name: q desc: "cola de jobs creada con JobQueueCreate" - name: olderThan desc: "duracion maxima de retension; jobs mas viejos que esto se eliminan (ej: 24*time.Hour)" output: "numero de filas eliminadas" tested: true tests: - "job_cleanup_removes_old_terminal_jobs" - "job_cleanup_keeps_recent_jobs" test_file_path: "functions/infra/job_queue_test.go" file_path: "functions/infra/job_cleanup.go" --- ## Ejemplo ```go // Limpiar jobs terminados hace mas de 7 dias n, err := JobCleanup(q, 7*24*time.Hour) fmt.Printf("eliminados: %d jobs\n", n) ``` ## Notas Solo elimina jobs en estados terminales: completed, failed, dead. Los jobs pending y running nunca se eliminan. El cutoff se calcula en UTC. Llamar periodicamente con CronTicker u otro scheduler para mantener la tabla compacta.