Controle de Tarefas Longas (Long Task Control)
Esta versão não se trata apenas de adicionar um monitor, mas de reestruturar a arquitetura de forma limpa:
- Verdade Observada (Observed Truth): proprietário / executor / observação externa preenchem a verdade de volta
- Estado Derivado (Derived State): o script projeta deterministicamente a partir da verdade
- Ações de Controle (Control Actions): monitor / proprietário / entrega voltada ao usuário agem com base no estado derivado
Regra raiz
- Sem verdade observada, não declare
OK STEP_PROGRESSnão é igual aSTEP_COMPLETEDTASK_COMPLETEDsó pode ser acionado pela verdade de conclusão- O monitor não pode usar campos contraditórios para supor "agente ainda está fazendo / pendente externo"
Modelo de eventos
Use estes eventos, sem misturar com CHECKPOINT:
STARTEDSTEP_PROGRESSSTEP_COMPLETEDTASK_COMPLETEDBLOCKED_CONFIRMEDOWNER_RESUMEDOWNER_REPLY_RECORDEDEXTERNAL_OBSERVEDDOWNLOAD_OBSERVEDHEARTBEAT
Resumo da arquitetura
Verdade Observada (Observed Truth)
Preenchida pelo proprietário / executor / observação externa:
observations[]observed.steps.*observed.task_completionobserved.blockobserved.ownerobserved.external_jobsobserved.downloads
Estado Derivado (Derived State)
Derivado por task_ledger.py project_task() / monitor_nudge.py:
derived.workflowderived.current_stepderived.step_statesderived.pending_externalderived.truth_statederived.inconsistencies
Ações de Controle (Control Actions)
TRUTH_INCONSISTENTOWNER_RECONCILENUDGE_MAIN_AGENTBLOCKED_ESCALATESTOP_AND_DELETE
Precedência do monitor
- terminal →
STOP_AND_DELETE - verdade inconsistente / alegação externa suspeita →
TRUTH_INCONSISTENTouOWNER_RECONCILE - bloqueio confirmado → verificação de nova tentativa primeiro →
BLOCKED_ESCALATE - sem delta de progresso material / heartbeat →
NUDGE_MAIN_AGENT/STALE_PROGRESS/HEARTBEAT_DUE - somente então
OK
Contrato de supervisão baseado em progresso
- LTC não é um TTL de tarefa baseado em tempo de parede; não é "parar a tarefa após 20 minutos"
- O monitor só intervém quando não há delta de progresso substancial por um longo período
- O delta de progresso pode vir de:
- Novo
STEP_PROGRESS/STEP_COMPLETED/TASK_COMPLETED - Nova observação de artefato / download
- Mudança no status do job externo/provedor
- Heartbeat bem-sucedido da saúde do executor (ex.:
executor_health.last_success_at)
- Novo
- Enquanto a tarefa longa continuar gerando esses sinais de progresso, mesmo que por horas, não deve ser alvo de stop-loss
timeout_sec/nudge_after_secnesta versão têm o significado semântico de limiar de inatividade de progresso, não um prazo final de eliminação
Contrato de retomada pelo proprietário (Owner-resume)
O que o monitor pede ao proprietário via sessions_send:
- Primeiro observe
- Preencha os dados reais
- Depois retome / conclua / bloqueie
Não escreva estado semi-pronto diretamente para conflitar com a projeção determinística.
Contrato de nova tentativa (Retry-first)
DOWNLOAD_TIMEOUT / DOWNLOAD_INCOMPLETE / TRANSIENT_NETWORK / EXECUTION_ERROR / EXTERNAL_WAIT
Devem vir primeiro da verdade observada; só então o monitor pode usar o contador de tentativas para decidir entre nova tentativa ou escalação.
Comandos principais
python3 scripts/task_ledger.py --ledger state/long-task-ledger.json init <task_id> ...
python3 scripts/task_ledger.py --ledger state/long-task-ledger.json checkpoint <task_id> --event-type STEP_PROGRESS ...
python3 scripts/task_ledger.py --ledger state/long-task-ledger.json checkpoint <task_id> --event-type STEP_COMPLETED ...
python3 scripts/task_ledger.py --ledger state/long-task-ledger.json checkpoint <task_id> --event-type TASK_COMPLETED ...
python3 scripts/task_ledger.py --ledger state/long-task-ledger.json block <task_id> ...
python3 scripts/task_ledger.py --ledger state/long-task-ledger.json external-job <task_id> ...
python3 scripts/task_ledger.py --ledger state/long-task-ledger.json download-observed <task_id> ...
python3 scripts/task_ledger.py --ledger state/long-task-ledger.json owner-reply <task_id> --reply <A|B|C|D|E> ...
python3 scripts/monitor_nudge.py --ledger state/long-task-ledger.json --apply-supervision
Referências
references/task-ledger-spec.mdreferences/monitor-action-spec.mdscripts/task_ledger.pyscripts/monitor_nudge.pyscripts/openclaw_ops.py
Por que esta versão existe
Porque a versão antiga misturava script determinístico com julgamento do agente, resultando em:
CHECKPOINTsignificando tanto progresso quanto conclusão- O monitor usando meia verdade para declarar
OK - Alegações de pendência externa sem evidência sendo levadas a sério
- O estado escrito após retomada do proprietário conflitando com a projeção do script
Esta versão separa a causa raiz e refaz tudo, sem corrigir o modelo antigo e confuso.