job.completed ou um job.failed, exatamente um por desfecho de job. Essas notificações são um contrato obrigatório do produto — o worker se recusa a subir com o streaming desabilitado, em vez de engoli-las silenciosamente.
Os eventos trafegam no envelope CloudEvents compartilhado, publicados sobre RabbitMQ: cada evento roteia ao exchange nomeado por RABBITMQ_JOB_EVENTS_EXCHANGE com a chave do evento como routing key AMQP (job.completed, job.failed). Os dois eventos são respaldados por outbox: a linha do outbox é gravada de forma durável e um relay a publica, com retentativas durante quedas do broker; um reparador reemite eventos terminais que nunca chegaram ao broker. A entrega é at-least-once — deduplique por ce-id, que é determinístico por desfecho de job: fetcher.job.<status>.<jobID>, então toda reemissão do mesmo fato carrega o mesmo id. O ce-subject é o id do job; deployments single-tenant estampam ce-tenantid como single-tenant.
Diferente da maioria dos payloads Lerian, os eventos de job do Fetcher usam chaves em camelCase — elas espelham a superfície REST do Fetcher.
Eventos de job
O bloco
result descreve o artefato produzido: onde foi gravado, seu tamanho e contagem de linhas, o formato de saída e — quando a proteção de resultado está habilitada — os descritores de integridade (HMAC) e proteção que um consumidor usa para verificar o artefato antes de confiar nele.

