Monalisa
Background work

Execuções e auditoria

task_runs, a trilha de eventos e a rota de status.

Cada execução tem um estado atual (task_runs ou platform_task_runs) e uma trilha append-only (task_run_events ou platform_task_run_events). As regras que o banco impõe sobre elas estão em Auditoria das execuções.

Ciclo de vida

A trilha registra cada passo: queued, sent, received, started, progress, retry_scheduled, succeeded, failed, skipped, dead_lettered, released_on_shutdown e redriven.

Status pela API

GET /task-runs/{runId} devolve o status de uma run do tenant de quem chama e exige a permissão access.task_runs.read. A leitura vai primeiro ao Valkey e, numa falta, ao PostgreSQL. Toda transição commitada remove a cópia em cache; uma run ainda em andamento fica em cache por 5 s, e uma run encerrada, por um dia.

Enquanto a autenticação é reconstruída, a rota responde 401 como as outras rotas protegidas.

Tabelas

task_runs

Estado atual de cada execução de tenant, com o mesmo run_id do outbox e do envelope; nunca é apagada.

ColunaTipoNuloObservação
run_iduuidnão
tenant_idbigintnão
nametextnão
queuetextnão
triggertextnão
actor_kindtextnão
actor_labeltextnão
correlation_iduuidnão
causation_iduuidnão
statustextnão
attemptsintegernãopadrão 0
progresssmallintnãopadrão 0
outcomejsonbnãopadrão '{}'::jsonb
queued_attimestamptznãopadrão clock_timestamp()
started_attimestamptzsim
finished_attimestamptzsim
updated_attimestamptznãopadrão clock_timestamp()

Chaves estrangeiras

  • tenant_id → tenants.id

Referenciada por: task_run_events, task_run_user_actors.

Garantido pelo banco

TipoNomeDefinição
CHECKtask_runs_actor_kind_checkCHECK ((actor_kind IN ('user', 'system')))
CHECKtask_runs_actor_label_checkCHECK (((length(actor_label) >= 1) AND (length(actor_label) <= 128)))
CHECKtask_runs_attempts_checkCHECK ((attempts >= 0))
CHECKtask_runs_checkCHECK (((status IN ('succeeded', 'failed', 'skipped')) = (finished_at IS NOT NULL)))
CHECKtask_runs_name_checkCHECK ((name ~ '^[a-z][a-z0-9._-]{1,63}$'))
CHECKtask_runs_outcome_checkCHECK (((jsonb_typeof(outcome) = 'object') AND (octet_length((outcome)::text) <= 2048)))
CHECKtask_runs_progress_checkCHECK (((progress >= 0) AND (progress <= 100)))
CHECKtask_runs_queue_checkCHECK ((queue IN ('critical', 'default', 'bulk', 'maintenance')))
CHECKtask_runs_status_checkCHECK ((status IN ('queued', 'running', 'retrying', 'succeeded', 'failed', 'skipped')))
CHECKtask_runs_trigger_checkCHECK ((trigger IN ('dispatch', 'event', 'redrive')))
PKtask_runs_pkeyPRIMARY KEY (run_id)
Constraint triggertask_runs_user_actor_presentadiada até o commit (DEFERRABLE INITIALLY DEFERRED)
UNIQUEtask_runs_run_id_tenant_id_keyUNIQUE (run_id, tenant_id)
Triggertask_runs_identity_fixedsó colunas de ciclo de vida podem mudar
Triggertask_runs_never_deletedrecusa DELETE (e UPDATE, nas tabelas de origem e ator)
Triggertask_runs_no_truncaterecusa TRUNCATE

Fora do banco

  • actor_kind = 'platform_operator' ainda não existe: runs de operador de plataforma são recusadas até haver tabela de origem própria.

task_run_user_actors

O usuário e a membership de uma run disparada por pessoa (actor_kind = 'user'). Obrigatória na mesma transação.

ColunaTipoNuloObservação
run_iduuidnão
tenant_idbigintnão
user_idbigintnão
membership_idbigintnão

Chaves estrangeiras

  • (membership_id, user_id, tenant_id) → memberships (id, user_id, tenant_id) (mesmo tenant)
  • (run_id, tenant_id) → task_runs (run_id, tenant_id) (mesmo tenant)
  • user_id → users.id

Garantido pelo banco

TipoNomeDefinição
PKtask_run_user_actors_pkeyPRIMARY KEY (run_id)
Triggertask_run_user_actors_never_deletedrecusa DELETE (e UPDATE, nas tabelas de origem e ator)
Triggertask_run_user_actors_no_truncaterecusa TRUNCATE

Fora do banco

  • Nenhuma regra registrada além das constraints acima.

task_run_events

Trilha append-only de uma run de tenant: cada transição (queued, sent, started, retry_scheduled…), com tentativa, contagem de recebimentos e worker.

ColunaTipoNuloObservação
idbigintnãoidentity (GENERATED ALWAYS)
run_iduuidnão
tenant_idbigintnão
eventtextnão
attemptintegernão
receive_countintegernãopadrão 0
queuetextnão
worker_instancetextnão
error_codetextnãopadrão ''
error_typetextnãopadrão ''
detailjsonbnãopadrão '{}'::jsonb
occurred_attimestamptznãopadrão clock_timestamp()

Chaves estrangeiras

  • (run_id, tenant_id) → task_runs (run_id, tenant_id) (mesmo tenant)

Garantido pelo banco

TipoNomeDefinição
CHECKtask_run_events_attempt_checkCHECK ((attempt >= 0))
CHECKtask_run_events_detail_checkCHECK (((jsonb_typeof(detail) = 'object') AND (octet_length((detail)::text) <= 2048)))
CHECKtask_run_events_event_checkCHECK ((event IN ('queued', 'sent', 'received', 'started', 'progress', 'retry_scheduled', 'succeeded', 'failed', 'skipped', 'dead_lettered', 'released_on_shutdown', 'redriven')))
CHECKtask_run_events_receive_count_checkCHECK ((receive_count >= 0))
CHECKtask_run_events_worker_instance_checkCHECK (((length(worker_instance) >= 1) AND (length(worker_instance) <= 128)))
PKtask_run_events_pkeyPRIMARY KEY (id)
Triggertask_run_events_append_onlytrilha append-only: recusa UPDATE e DELETE
Triggertask_run_events_no_truncaterecusa TRUNCATE

Fora do banco

  • Nenhuma regra registrada além das constraints acima.

platform_task_runs

Estado atual das runs sem tenant; o ator é system ou scheduler, e scheduler anda junto com trigger = 'schedule'.

ColunaTipoNuloObservação
run_iduuidnão
nametextnão
queuetextnão
triggertextnão
actor_kindtextnão
actor_labeltextnão
correlation_iduuidnão
causation_iduuidnão
statustextnão
attemptsintegernãopadrão 0
progresssmallintnãopadrão 0
outcomejsonbnãopadrão '{}'::jsonb
queued_attimestamptznãopadrão clock_timestamp()
started_attimestamptzsim
finished_attimestamptzsim
updated_attimestamptznãopadrão clock_timestamp()

Chaves estrangeiras

  • nenhuma

Referenciada por: platform_task_run_events, platform_task_run_schedule_origins.

Garantido pelo banco

TipoNomeDefinição
CHECKplatform_task_runs_actor_kind_checkCHECK ((actor_kind IN ('system', 'scheduler')))
CHECKplatform_task_runs_actor_label_checkCHECK (((length(actor_label) >= 1) AND (length(actor_label) <= 128)))
CHECKplatform_task_runs_attempts_checkCHECK ((attempts >= 0))
CHECKplatform_task_runs_checkCHECK (((actor_kind = 'scheduler') = (trigger = 'schedule')))
CHECKplatform_task_runs_check1CHECK (((status IN ('succeeded', 'failed', 'skipped')) = (finished_at IS NOT NULL)))
CHECKplatform_task_runs_name_checkCHECK ((name ~ '^[a-z][a-z0-9._-]{1,63}$'))
CHECKplatform_task_runs_outcome_checkCHECK (((jsonb_typeof(outcome) = 'object') AND (octet_length((outcome)::text) <= 2048)))
CHECKplatform_task_runs_progress_checkCHECK (((progress >= 0) AND (progress <= 100)))
CHECKplatform_task_runs_queue_checkCHECK ((queue IN ('critical', 'default', 'bulk', 'maintenance')))
CHECKplatform_task_runs_status_checkCHECK ((status IN ('queued', 'running', 'retrying', 'succeeded', 'failed', 'skipped')))
CHECKplatform_task_runs_trigger_checkCHECK ((trigger IN ('dispatch', 'event', 'schedule', 'redrive')))
PKplatform_task_runs_pkeyPRIMARY KEY (run_id)
Constraint triggerplatform_task_runs_origin_presentadiada até o commit (DEFERRABLE INITIALLY DEFERRED)
Triggerplatform_task_runs_identity_fixedsó colunas de ciclo de vida podem mudar
Triggerplatform_task_runs_never_deletedrecusa DELETE (e UPDATE, nas tabelas de origem e ator)
Triggerplatform_task_runs_no_truncaterecusa TRUNCATE

Fora do banco

  • Nenhuma regra registrada além das constraints acima.

platform_task_run_schedule_origins

Origem única de uma run agendada: nome do agendamento e horário previsto, únicos juntos.

ColunaTipoNuloObservação
run_iduuidnão
schedule_nametextnão
execution_idtextnão
scheduled_fortimestamptznão

Chaves estrangeiras

  • run_id → platform_task_runs.run_id

Garantido pelo banco

TipoNomeDefinição
CHECKplatform_task_run_schedule_origins_execution_id_checkCHECK (((length(execution_id) >= 1) AND (length(execution_id) <= 128)))
PKplatform_task_run_schedule_origins_pkeyPRIMARY KEY (run_id)
UNIQUEplatform_task_run_schedule_orig_schedule_name_scheduled_for_keyUNIQUE (schedule_name, scheduled_for)
Triggerplatform_task_run_schedule_origins_never_deletedrecusa DELETE (e UPDATE, nas tabelas de origem e ator)
Triggerplatform_task_run_schedule_origins_no_truncaterecusa TRUNCATE

Fora do banco

  • Nenhuma regra registrada além das constraints acima.

platform_task_run_events

Trilha append-only das runs sem tenant.

ColunaTipoNuloObservação
idbigintnãoidentity (GENERATED ALWAYS)
run_iduuidnão
eventtextnão
attemptintegernão
receive_countintegernãopadrão 0
queuetextnão
worker_instancetextnão
error_codetextnãopadrão ''
error_typetextnãopadrão ''
detailjsonbnãopadrão '{}'::jsonb
occurred_attimestamptznãopadrão clock_timestamp()

Chaves estrangeiras

  • run_id → platform_task_runs.run_id

Garantido pelo banco

TipoNomeDefinição
CHECKplatform_task_run_events_attempt_checkCHECK ((attempt >= 0))
CHECKplatform_task_run_events_detail_checkCHECK (((jsonb_typeof(detail) = 'object') AND (octet_length((detail)::text) <= 2048)))
CHECKplatform_task_run_events_event_checkCHECK ((event IN ('queued', 'sent', 'received', 'started', 'progress', 'retry_scheduled', 'succeeded', 'failed', 'skipped', 'dead_lettered', 'released_on_shutdown', 'redriven')))
CHECKplatform_task_run_events_receive_count_checkCHECK ((receive_count >= 0))
CHECKplatform_task_run_events_worker_instance_checkCHECK (((length(worker_instance) >= 1) AND (length(worker_instance) <= 128)))
PKplatform_task_run_events_pkeyPRIMARY KEY (id)
Triggerplatform_task_run_events_append_onlytrilha append-only: recusa UPDATE e DELETE
Triggerplatform_task_run_events_no_truncaterecusa TRUNCATE

Fora do banco

  • Nenhuma regra registrada além das constraints acima.

Nesta página