17.Z whatsmeow Sync — Atualização Automatizada da Fork (Superadmin)#
Job diário (systemd timer biazap-whatsmeow-claude-update.timer, 04:30 UTC)
que mantem third_party/whatsmeow/ sincronizada com tulir/whatsmeow main
sem perder os patches da nossa fork. Pipeline: workspace isolado em git
worktree -> agente Claude Code headless faz merge + audit + build + test +
patch pin + smoke isolado -> se smoke green e agente confirma Auto promote: yes, orquestrador faz ff merge em main + push + deploy worker. Caso
contrario, branch fica pushed para review humano (status=pending_review).
Detalhes do design: .claude/rules/whatsmeow-claude-update.md.
Endpoint base: /v1/admin/whatsmeow-sync/*. Todos requerem JWT de
superadmin. Retorna o envelope padrão de erros (error_code, trace_id).
GET/v1/admin/whatsmeow-sync/runs#
Lista execuções passadas (mais recentes primeiro, padrão 50).
Query: limit (1..200).
Resposta 200:
{
"data": [
{
"id": 7, "trigger": "scheduled", "started_at": "2026-04-21T04:30:00.000Z",
"finished_at": "2026-04-21T04:34:12.500Z", "duration_ms": 252500,
"before_sha": "9e93da2...", "after_sha": "5b88861...",
"upstream_sha": "5b88861...", "tag_name": "biazap-sync-2026-04-21-043000",
"baked_before": "2.3000.1034566421", "baked_after": "2.3000.1037753511",
"status": "success", "worker_deployed": true,
"worker_health_ok": true, "e2e_test_ok": true, "log_monitor_ok": true,
"push_ok": true, "archive_pre_path": "/usr/workspace/biazap-archives/whatsmeow/2026-04-21-043000-pre.tar.gz",
"archive_post_path": "/usr/workspace/biazap-archives/whatsmeow/2026-04-21-043000-post.tar.gz",
"log_path": "/usr/workspace/biazap/data/logs/whatsmeow-sync/2026-04-21-043000.log",
"created_at": "2026-04-21T04:30:00.100Z"
}
],
"total": 1, "limit": 50
}
GET/v1/admin/whatsmeow-sync/runs/{id}#
Detalhe de uma execução especifica. Mesmo shape de item em /runs, com
campos extra quando aplicavel: failed_phase, failure_reason,
conflict_files (array).
404 se id não existe.
GET/v1/admin/whatsmeow-sync/latest#
Última execução (qualquer status). Se nenhuma rodou ainda:
{ "status": "pending_first_run" }
GET/v1/admin/whatsmeow-sync/status#
Resumo p/ o hero card do dashboard — mistura estado live do git com histórico do DB:
{
"current_baked": "2.3000.1037753511",
"current_fork_sha": "5b88861abc...",
"last_run_ok": true,
"last_run_status": "success",
"last_run_id": 7,
"last_success_at": "2026-04-21T04:34:12Z",
"last_success_tag_name": "biazap-sync-2026-04-21-043000",
"last_known_upstream_sha": "5b88861abc...",
"hours_since_last_run": 6,
"hours_since_last_success": 6,
"pending_first_run": false,
"timer_healthy": true,
"timer_health_message": ""
}
timer_healthy=false se hours_since_last_success > 30 (yellow) ou
> 48 (red). Usado pelo card como sinal principal.
POST/v1/admin/whatsmeow-sync/run#
Dispara manualmente. Resposta 202:
{
"run_id": 8,
"status": "queued",
"unit": "biazap-whatsmeow-claude-update-manual-8",
"poll": "/v1/admin/whatsmeow-sync/runs/8"
}
Rejeita com 409 SYNC_IN_PROGRESS se já existe um run com
status=running. Pre-aloca a linha no DB antes de spawn.
POST/v1/admin/whatsmeow-sync/runs/{id}/rollback#
Reverte para o archive preservado de uma execução histórica. Requer
que a target run tenha archive_post_path existente no disco.
Resposta 202:
{
"run_id": 9, "target_id": 7,
"status": "queued", "unit": "biazap-whatsmeow-claude-update-rollback-9",
"poll": "/v1/admin/whatsmeow-sync/runs/9"
}
Erros:
404— target run não existe400 NO_ARCHIVE— target não gravou archive_post (ex. skipped_up_to_date)410 ARCHIVE_MISSING— tarball foi removido do disco (retencao 30d)409 SYNC_IN_PROGRESS— outro run em andamento
Metricas#
biazap_whatsmeow_sync_runs_total{status,trigger}— counterbiazap_whatsmeow_sync_last_run_ok— gauge 0/1biazap_whatsmeow_sync_last_success_timestamp_seconds— gaugebiazap_whatsmeow_sync_days_behind_upstream— gaugebiazap_whatsmeow_sync_phase_duration_seconds{phase}— histogram
Arquivos no disco#
- Logs:
/usr/workspace/biazap/data/logs/whatsmeow-sync/YYYY-MM-DD-HHMMSS.log - Archives:
/usr/workspace/biazap-archives/whatsmeow/YYYY-MM-DD-HHMMSS-{pre,post}.tar.gz - Retencao de archives: 30 dias (configuravel via
WHATSMEOW_SYNC_ARCHIVE_DAYS) - Retencao de rows em
whatsmeow_sync_runs: permanente no momento (eventual cleanup via TODO).