Communitygithub.com

curiositech/windags-skills

Especialista em processamento de jobs em segundo plano com Bull/BullMQ (Redis), Celery e filas em nuvem. Implementa retentativas, agendamento, filas prioritárias e gerenciamento de workers. Use para processamento assíncrono de tarefas, campanhas de e-mail, geração de relatórios, operações em lote. Ative com "background job", "async task", "queue", "worker", "BullMQ", "Celery". NÃO para comunicação WebSocket em tempo real, chamadas de API síncronas ou operações simples de setTimeout.

O que é windags-skills?

Este skill é um orquestrador de jobs em segundo plano, projetado para ajudar desenvolvedores a construir sistemas robustos de processamento assíncrono de tarefas. Ele fornece orientação sobre quando usar (e quando não usar) filas de background, uma árvore de decisão rápida e seleção de tecnologia para Node.js (BullMQ), Python (Celery) ou soluções nativas em nuvem (AWS SQS, Google Cloud Tasks). O skill detalha anti-padrões comuns, como a falta de filas de mensagens mortas (dead letter queues), processamento síncrono de jobs, falta de idempotência, ausência de limitação de taxa (rate limiting) e escalonamento inadequado de workers, oferecendo correções com exemplos de código em TypeScript. Além disso, inclui padrões de implementação para campanhas de e-mail, relatórios agendados e pipelines de transcodificação de vídeo, métricas essenciais de monitoramento, um checklist de produção e uma tabela comparativa de tecnologias. O skill é útil para qualquer desenvolvedor ou equipe que precise implementar filas de tarefas confiáveis, escaláveis e observáveis, suportando plataformas como BullMQ, Celery e serviços gerenciados de fila.

Funciona com~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/curiositech/windags-skills/tree/HEAD/skills/background-job-orchestrator

Perguntar na sua IA favorita

Abre um novo chat com esta habilidade de agente já pré-carregada.

Documentação

Orquestrador de Jobs em Segundo Plano

Especialista em projetar e implementar sistemas de jobs em segundo plano de nível de produção que lidam com tarefas de longa duração sem bloquear respostas de API.

Quando Usar

✅ Use para:

  • Tarefas de longa duração (envio de e-mails, geração de relatórios, processamento de imagens)
  • Operações em lote (importações em massa, exportações, migrações de dados)
  • Tarefas agendadas (resumos diários, jobs de limpeza, relatórios recorrentes)
  • Tarefas que exigem lógica de retentativa (chamadas de API externas, operações instáveis)
  • Processamento baseado em prioridade (usuários premium primeiro, alertas críticos)
  • Operações com limitação de taxa (cotas de API, limites de serviços de terceiros)

❌ NÃO para:

  • Comunicação bidirecional em tempo real (use WebSockets)
  • Requisitos de latência de submilissegundos (use cache em memória)
  • Atrasos simples (setTimeout é suficiente para <5 segundos)
  • Respostas síncronas de API (mantenha a lógica no manipulador de requisição)

Árvore de Decisão Rápida

Esta tarefa:
├── Leva >5 segundos? → Job em segundo plano
├── Precisa de retentativa em caso de falha? → Job em segundo plano
├── É executada em um agendamento? → Job em segundo plano (padrão cron)
├── Bloqueia a interação do usuário? → Job em segundo plano
├── Processa em lotes? → Job em segundo plano
└── Retorna imediatamente? → Mantenha síncrono

Seleção de Tecnologia

Node.js: BullMQ (Recomendado 2024+)

Quando usar:

  • Projeto TypeScript
  • Redis já na stack
  • Precisa de recursos avançados (limitação de taxa, prioridades, jobs repetíveis)

Por que BullMQ em vez de Bull:

  • Bull (v3) → BullMQ (v4+): Reescrita completa em TypeScript
  • Melhor gerenciamento de conexão com Redis
  • Concorrência e desempenho aprimorados
  • Manutenção ativa (Bull está em modo de manutenção)

Python: Celery

Quando usar:

  • Projeto Python/Django
  • Precisa de execução distribuída de tarefas
  • Fluxos de trabalho complexos (chains, groups, chords)

Alternativas:

  • RQ (Redis Queue): Mais simples, menos recursos
  • Dramatiq: Moderno, ecossistema menor
  • Huey: Leve, bom para projetos pequenos

Nativo em Nuvem: AWS SQS, Google Cloud Tasks

Quando usar:

  • Arquitetura serverless
  • Não quer gerenciar Redis/RabbitMQ
  • Precisa de entrega garantida e filas de mensagens mortas

Anti-Padrões Comuns

Anti-Padrão 1: Sem Fila de Mensagens Mortas

Pensamento iniciante: "Tentar 3 vezes, depois falhar silenciosamente"

Problema: Jobs com falha desaparecem sem visibilidade ou caminho de recuperação.

Abordagem correta:

// BullMQ com fila de mensagens mortas
const queue = new Queue('fila-email', {
  connection: redis,
  defaultJobOptions: {
    attempts: 3,
    backoff: {
      type: 'exponential',
      delay: 2000
    },
    removeOnComplete: 100, // Manter últimos 100 bem-sucedidos
    removeOnFail: false     // Manter todas as falhas para inspeção
  }
});

// Monitorar jobs com falha
const failedJobs = await queue.getFailed();

Linha do tempo:

  • Pré-2020: Tentar e esquecer
  • 2020+: Filas de mensagens mortas se tornam padrão
  • 2024+: Observabilidade para falhas de jobs é obrigatória

Anti-Padrão 2: Processamento Síncrono de Jobs

Sintoma: Endpoint de API espera pela conclusão do job

Problema:

// ❌ ERRADO - Bloqueia a resposta da API
app.post('/enviar-email', async (req, res) => {
  await sendEmail(req.body.para, req.body.assunto);
  res.json({ success: true });
});

Por que está errado: Timeout, UX pobre, desperdício de recursos do servidor

Abordagem correta:

// ✅ CERTO - Enfileirar e retornar imediatamente
app.post('/enviar-email', async (req, res) => {
  const job = await emailQueue.add('enviar', {
    to: req.body.para,
    subject: req.body.assunto
  });

  res.json({
    success: true,
    jobId: job.id,
    status: 'enfileirado'
  });
});

// Worker separado processa o job
worker.process('enviar', async (job) => {
  await sendEmail(job.data.to, job.data.subject);
});

Anti-Padrão 3: Sem Idempotência

Problema: Job é executado duas vezes → cobranças duplicadas, e-mails duplicados

Por que acontece:

  • Conexão Redis cai durante o processamento
  • Worker trava antes da conclusão do job
  • Timeout do job dispara retentativa enquanto ainda está em execução

Abordagem correta:

// ✅ Job idempotente com chave de desduplicação
await queue.add('cobrar-pagamento', {
  userId: 123,
  amount: 50.00
}, {
  jobId: `payment-${orderId}`, // Previne duplicatas
  attempts: 3
});

// No worker: Verificar se já foi processado
worker.process('cobrar-pagamento', async (job) => {
  const { userId, amount } = job.data;

  // Verificar idempotência
  const existing = await db.payments.findOne({
    jobId: job.id
  });
  if (existing) {
    return existing; // Já processado
  }

  // Processar pagamento
  const result = await stripe.charges.create({...});

  // Armazenar registro de idempotência
  await db.payments.create({
    jobId: job.id,
    result
  });

  return result;
});

Anti-Padrão 4: Sem Limitação de Taxa

Problema: Sobrecarregar APIs de terceiros ou esgotar cotas

Sintoma: Erros "Rate limit exceeded" do Sendgrid, Stripe, etc.

Abordagem correta:

// Limitação de taxa no BullMQ
const queue = new Queue('chamadas-api', {
  limiter: {
    max: 100,        // Máximo 100 jobs
    duration: 60000  // A cada 60 segundos
  }
});

// Ou: Limites de taxa baseados em prioridade
await queue.add('enviar-email', data, {
  priority: user.isPremium ? 1 : 10,
  rateLimiter: {
    max: user.isPremium ? 1000 : 100,
    duration: 3600000 // Por hora
  }
});

Anti-Padrão 5: Esquecer o Escalonamento de Workers

Problema: Um único worker não consegue acompanhar a profundidade da fila

Sintoma: Fila acumula, jobs atrasados por horas/dias

Abordagem correta:

// Escalonamento horizontal com múltiplos workers
const worker = new Worker('fila-email', async (job) => {
  await processEmail(job.data);
}, {
  connection: redis,
  concurrency: 5  // Processar 5 jobs simultaneamente por worker
});

// Executar múltiplos processos de worker (PM2, Kubernetes, etc.)
// Cada worker processa concurrency * num_workers jobs

Monitoramento:

// Configurar alertas para profundidade da fila
setInterval(async () => {
  const waiting = await queue.getWaitingCount();
  if (waiting > 1000) {
    alert('Profundidade da fila excede 1000, escalar workers!');
  }
}, 60000);

Padrões de Implementação

Padrão 1: Campanhas de E-mail

// Configuração da fila
const emailQueue = new Queue('campanha-email', { connection: redis });

// Enfileirar lote
async function enviarCampanha(userIds: number[], template: string) {
  const jobs = userIds.map(userId => ({
    name: 'enviar',
    data: { userId, template },
    opts: {
      attempts: 3,
      backoff: { type: 'exponential', delay: 5000 }
    }
  }));

  await emailQueue.addBulk(jobs);
}

// Worker com lógica de retentativa
const worker = new Worker('campanha-email', async (job) => {
  const { userId, template } = job.data;

  const user = await db.users.findById(userId);
  const email = renderTemplate(template, user);

  try {
    await sendgrid.send({
      to: user.email,
      subject: email.subject,
      html: email.body
    });
  } catch (error) {
    if (error.code === 'ECONNREFUSED') {
      throw error; // Tentar novamente
    }
    // E-mail inválido, não tentar novamente
    console.error(`E-mail inválido para o usuário ${userId}`);
  }
}, {
  connection: redis,
  concurrency: 10
});

Padrão 2: Relatórios Agendados

// Relatório diário às 9h
await queue.add('relatorio-diario', {
  type: 'vendas',
  recipients: ['[email protected]']
}, {
  repeat: {
    pattern: '0 9 * * *', // Sintaxe cron
    tz: 'America/New_York'
  }
});

// Worker gera e envia o relatório por e-mail
worker.process('relatorio-diario', async (job) => {
  const { type, recipients } = job.data;

  const data = await generateReport(type);
  const pdf = await createPDF(data);

  await emailQueue.add('enviar', {
    to: recipients,
    subject: `Relatório ${type} Diário`,
    attachments: [{ filename: 'relatorio.pdf', content: pdf }]
  });
});

Padrão 3: Pipeline de Transcodificação de Vídeo

// Job de múltiplos estágios com acompanhamento de progresso
await videoQueue.add('transcodificar', {
  videoId: 123,
  formats: ['720p', '1080p', '4k']
}, {
  attempts: 2,
  timeout: 3600000 // Timeout de 1 hora
});

worker.process('transcodificar', async (job) => {
  const { videoId, formats } = job.data;

  for (let i = 0; i < formats.length; i++) {
    const format = formats[i];

    // Atualizar progresso
    await job.updateProgress((i / formats.length) * 100);

    // Transcodificar
    await ffmpeg.transcode(videoId, format);
  }

  await job.updateProgress(100);
});

// Cliente consulta o progresso
app.get('/videos/:id/status', async (req, res) => {
  const job = await queue.getJob(req.params.jobId);
  res.json({
    state: await job.getState(),
    progress: job.progress
  });
});

Monitoramento e Observabilidade

Métricas Essenciais

// Dashboard de saúde da fila
async function getQueueMetrics() {
  const [waiting, active, completed, failed, delayed] = await Promise.all([
    queue.getWaitingCount(),
    queue.getActiveCount(),
    queue.getCompletedCount(),
    queue.getFailedCount(),
    queue.getDelayedCount()
  ]);

  return {
    waiting,    // Jobs aguardando processamento
    active,     // Jobs em processamento
    completed,  // Concluídos com sucesso
    failed,     // Com falha após retentativas
    delayed,    // Agendados para o futuro
    health: waiting < 1000 && failed < 100 ? 'saudável' : 'degradado'
  };
}

BullMQ Board (Interface)

// Desenvolvimento: Monitorar jobs visualmente
import { createBullBoard } from '@bull-board/api';
import { BullMQAdapter } from '@bull-board/api/bullMQAdapter';
import { ExpressAdapter } from '@bull-board/express';

const serverAdapter = new ExpressAdapter();

createBullBoard({
  queues: [
    new BullMQAdapter(emailQueue),
    new BullMQAdapter(videoQueue)
  ],
  serverAdapter
});

app.use('/admin/queues', serverAdapter.getRouter());
// Visite http://localhost:3000/admin/queues

Checklist de Produção

□ Fila de mensagens mortas configurada
□ Estratégia de retentativa com backoff exponencial
□ Limites de timeout de job definidos
□ Limitação de taxa para APIs de terceiros
□ Chaves de idempotência para operações críticas
□ Concorrência do worker ajustada (núcleos de CPU * 2)
□ Escalonamento horizontal configurado (vários workers)
□ Monitoramento da profundidade da fila com alertas
□ Fluxo de inspeção de jobs com falha
□ Dados do job não contêm PII nos logs
□ Persistência do Redis habilitada (AOF ou RDB)
□ Tratamento de desligamento gracioso (SIGTERM)

Quando Usar vs Evitar

CenárioUsar Jobs em Segundo Plano?
Enviar e-mail de boas-vindas ao se inscrever✅ Sim - pode levar de 2 a 5 segundos
Cobrar cartão de crédito⚠️ Talvez - depende da latência do provedor de pagamento
Gerar relatório PDF (30 segundos)✅ Sim - definitivamente em segundo plano
Buscar perfil de usuário do banco de dados❌ Não - milissegundos, mantenha síncrono
Processar upload de vídeo (5 minutos)✅ Sim - sempre em segundo plano
Validar entrada de formulário❌ Não - validação síncrona
Job cron diário✅ Sim - use jobs repetíveis
Mensagem de chat em tempo real❌ Não - use WebSockets

Comparação de Tecnologias

RecursoBullMQCeleryAWS SQS
LinguagemNode.jsPythonQualquer (HTTP API)
BackendRedisRedis/RabbitMQ/SQSGerenciado
Prioridades✅✅✅
Limitação de Taxa✅❌✅ (via atributos)
Repetição/Cron✅✅ (celery-beat)❌ (use EventBridge)
DashboardBull BoardFlowerCloudWatch
Fluxos de Trabalho❌✅ (chains, groups)❌
Curva de AprendizadoMédiaMédiaBaixa
CustoHospedagem RedisHospedagem Redis$0,40/milhão de requisições

Referências

  • /references/bullmq-patterns.md - Padrões e exemplos avançados de BullMQ
  • /references/celery-workflows.md - Chains, groups e chords do Celery
  • /references/job-observability.md - Monitoramento, alertas e depuração

Scripts

  • scripts/setup_bullmq.sh - Inicializar BullMQ com Redis
  • scripts/queue_health_check.ts - Dashboard de métricas da fila
  • scripts/retry_failed_jobs.ts - Re-tentar em lote jobs com falha

Este skill orienta: Implementação de jobs em segundo plano | Arquitetura de filas | Estratégias de retentativa | Escalonamento de workers | Observabilidade de jobs

Individual skills in this repo

This repo contains 20 individual skills — each has its own dedicated page.

curiositech/windags-skills

Expert in 2000s-era music visualization (Milkdrop, AVS, Geiss) and modern WebGL implementations. Specializes in Butterchurn integration, Web Audio API AnalyserNode FFT data, GLSL shaders for audio-reactive visuals, and psychedelic generative art. Activate on "Milkdrop", "music visualization", "WebGL visualizer", "Butterchurn", "audio reactive", "FFT visualization", "spectrum analyzer". NOT for simple bar charts/waveforms (use basic canvas), video editing, or non-audio visuals.

curiositech/windags-skills

Expert legal research agent for finding and scraping expungement data state by state. Knows authoritative sources, URL patterns, Firecrawl configuration, and 2026 legal landscape.

curiositech/windags-skills

Expert in 3D computer vision labeling tools, workflows, and AI-assisted annotation for LiDAR, point clouds, and sensor fusion. Covers SAM4D/Point-SAM, human-in-the-loop architectures, and vertical-specific training strategies. Activate on '3D labeling', 'point cloud annotation', 'LiDAR labeling', 'SAM 3D', 'SAM4D', 'sensor fusion annotation', '3D bounding box', 'semantic segmentation point cloud'. NOT for 2D image labeling (use clip-aware-embeddings), general ML training (use ml-engineer), video annotation without 3D (use computer-vision-pipeline), or VLM prompt engineering (use prompt-engineer).

curiositech/windags-skills

Implement WCAG 2.2 AA/AAA compliance with automated testing, keyboard navigation, screen reader support, and focus management. Activate on: accessibility audit, WCAG compliance, keyboard navigation, screen reader, aria attributes, axe-core, focus trap. NOT for: design-level accessibility review (use design-accessibility-auditor), color contrast only (use css-in-js-architect).

curiositech/windags-skills

Time-blind friendly planning, executive function support, and daily structure for ADHD brains. Specializes in realistic time estimation, dopamine-aware task design, and building systems that actually work for neurodivergent minds.

curiositech/windags-skills

Designs digital experiences for ADHD brains using neuroscience research and UX principles. Expert in reducing cognitive load, time blindness solutions, dopamine-driven engagement, and compassionate design patterns. Activate on 'ADHD design', 'cognitive load', 'accessibility', 'neurodivergent UX', 'time blindness', 'dopamine-driven', 'executive function'. NOT for general accessibility (WCAG only), neurotypical UX design, or simple UI styling without ADHD context.

curiositech/windags-skills

>- Apply crisis decision-making research to agent routing, uncertainty triage, and coordination failure analysis in time-pressured systems. Use when diagnosing handoff failures, analytical paralysis, or expert judgment under incomplete information. NOT for routine coding, simple CRUD design, or static single-agent tasks with complete information.

curiositech/windags-skills

Extend and modify the admin dashboard, developer portal, and operations console. Use when adding new admin tabs, metrics, monitoring features, or internal tools. Activates for dashboard development, analytics, user management, and internal tooling.

curiositech/windags-skills

Conversation patterns and interaction protocols for multi-agent systems. Covers request/response, pub/sub, blackboard, delegation chains, debate, critique, consensus, fan-out/fan-in, supervisor-worker, and peer negotiation. Deep analysis of AutoGen conversation patterns, CrewAI delegation, LangGraph state passing, and FIPA-ACL performatives. Teaches how to design what agents say to each other and in what order. Activate on: "agent conversation", "agent protocol", "multi-agent debate", "agent delegation", "supervisor worker pattern", "agent voting", "consensus protocol", "fan-out fan-in", "agent negotiation", "blackboard pattern", "agent dialogue", "conversation topology", "agent handoff". NOT for: wire format or serialization (use agent-interchange-formats), orchestration infrastructure (use agentic-infrastructure-2026), single agent behavior (use agentic-patterns).

curiositech/windags-skills

Meta-agent for creating new custom agents, skills, and MCP integrations. Expert in agent design, MCP development, skill architecture, and rapid prototyping. Activate on 'create agent', 'new skill', 'MCP server', 'custom tool', 'agent design'. NOT for using existing agents (invoke them directly), general coding (use language-specific skills), or infrastructure setup (use deployment-engineer).

curiositech/windags-skills

AI-powered calendar management and agent-based scheduling coordination. Covers calendar APIs (Google Calendar, CalDAV/iCal), AI scheduling assistants (Reclaim, Clockwise, Motion, Cal.com), building custom calendar agents with MCP, multi-calendar merging, timezone management, focus block protection, meeting fatigue detection, and agent-to-agent meeting negotiation protocols. Activate on: "calendar agent", "AI scheduling", "calendar coordination", "meeting scheduling", "calendar API", "focus time protection", "calendar optimization", "Google Calendar MCP", "Reclaim", "Clockwise", "Motion", "Cal.com", "smart scheduling", "calendar-aware agent", "timezone scheduling", "agent negotiation meetings". NOT for: manual calendar UI component design (use form-validation-architect), project management scheduling or Gantt charts (use project-management-guru-adhd), general time-tracking or pomodoro apps (use adhd-daily-planner for time-awareness), building the agent itself from scratch (use agent-creator).

curiositech/windags-skills

Build and adopt production AI agent infrastructure in 2026. Covers framework selection (LangGraph, CrewAI, AutoGen, MCP), orchestration patterns, evaluation, observability, memory systems, and tool use. Also covers the SOCIAL dimension: how to sell agent infrastructure internally, change management, measuring ROI, building trust in autonomous systems, and scaling adoption across teams. Activate on: "agent infrastructure", "agent framework comparison", "which agent framework", "sell AI tools internally", "agent adoption", "agent observability", "agent evaluation", "MCP architecture", "agentic mesh", "enterprise AI agents", "AI change management", "agent ROI". NOT for: building specific agents (use ai-engineer), designing agent behavior patterns (use agentic-patterns), prompt tuning (use prompt-engineer).

curiositech/windags-skills

Fundamental patterns for effective agentic behavior. Teaches decomposition, tool orchestration, error recovery, context management, quality self-assessment, and knowing when to stop. Model-agnostic principles that make any agent more effective regardless of domain. Activate on: "how should I structure this agent", "agentic workflow", "agent patterns", "multi-step task", "tool orchestration", "/agentic-patterns", "decompose this", "agent best practices", "chain of actions", "when should the agent stop", "agent loop design". NOT for: creating agent infrastructure (use agent-creator), building DAGs (use windags-architect), specific tool implementation.

curiositech/windags-skills

Automated discovery and matching of agent skills for dynamic task routing and capability assessment

curiositech/windags-skills

Cryptographic security for agentic systems — zero-trust agent networking, signed message envelopes (JWS/JWE), capability-based security (ocaps), Merkle tree audit trails, WASM sandboxing, and formal verification. Covers CLI dev tool security, mTLS between agents, permission boundaries (least privilege for AI agents), and supply chain security for skills/plugins. Activate on: "agent security", "zero trust agents", "secure agent communication", "capability-based security", "ocap", "signed messages between agents", "agent audit trail", "sandbox agent execution", "agent permissions", "mTLS agents", "cryptographic verification", "agent supply chain", "OWASP agentic", "prove agent did X", "tamper-proof agent logs". NOT for: application-level SAST scanning (use security-auditor), network firewall rules (use infrastructure), SOC2/HIPAA compliance (organizational), or prompt injection defense (use prompt-engineer).

curiositech/windags-skills

Data structures and serialization formats for agent-to-agent communication. Covers message envelopes, structured output schemas, capability declarations, task handoff payloads, error/retry signaling, and context windows as data structures. Deep comparison of A2A protocol, MCP, OpenAI function calling, and LangChain message types. Teaches when to use rigid schemas vs free-form with validation, typed vs untyped, streaming vs batch. Activate on: "agent message format", "agent communication schema", "agent-to-agent protocol", "A2A protocol", "MCP message format", "structured output for agents", "agent interop", "interchange format", "agent serialization", "task handoff format", "capability declaration". NOT for: what agents say to each other (use agent-conversation-protocols), orchestration topology (use multi-agent-coordination), building agent infrastructure (use agentic-infrastructure-2026).

curiositech/windags-skills

Logic-based agent programming language implementing BDI architecture for practical autonomous agent development

curiositech/windags-skills

>- Design AgentSpeak(L)-style BDI agents with context-guarded plans, selection functions, and intention stacks. Use for interruptible autonomy, agent policy, and multi-agent orchestration in dynamic environments. NOT for simple rule engines, static planners, or centralized workflows.

curiositech/windags-skills

Foundational concurrent computation model where actors communicate exclusively through asynchronous message passing

curiositech/windags-skills

license: Apache-2.0 NOT for unrelated tasks outside this domain.

Habilidades Relacionadas