Skip to content

fix(avatares): o cron pede a foto pelo wa_lid antes do telefone - #737

Open
HigorLira wants to merge 1 commit into
melgarafael:mainfrom
HigorLira:fix/avatar-nono-digito
Open

fix(avatares): o cron pede a foto pelo wa_lid antes do telefone#737
HigorLira wants to merge 1 commit into
melgarafael:mainfrom
HigorLira:fix/avatar-nono-digito

Conversation

@HigorLira

Copy link
Copy Markdown

O que este PR faz

Faz a foto de perfil do contato aparecer no Inbox para números brasileiros cujo wa_id não tem o nono dígito — hoje ela nunca aparece, e o cron nem registra erro.

Closes #728

O defeito

app/api/v1/cron/contact-avatars/route.ts monta o chatId com uma função local que lê wa_identity:

if (identity.startsWith("phone:")) return `${identity.slice(6).replace(/\D/g, "")}@c.us`;

wa_identity é gerada com o telefone antes do lid — o comentário de chatIdOf (session-reconciler) já nomeia isso como "o motivo da 0122". Em linha BR antiga, o telefone gravado tem 13 dígitos e o wa_id real tem 12. O endereço derivado não existe, o provider devolve profilePictureURL: null, e o job cai no ramo que ele mesmo comenta como "contato sem foto ou com privacidade fechada: estado normal, não erro".

O resultado é um defeito silencioso: {"scanned":1,"updated":0,"no_picture":1,"failed":0}. Nada em log, nada em failed.

Medição em instalação real

Mesmo contato, mesma sessão, três identificadores:

contactId enviado ao provider resposta
<13 dígitos>@c.us — o que o cron monta {"profilePictureURL": null}
<12 dígitos>@c.us — o wa_id real a URL da foto
<wa_lid>@lid a URL da foto

E o próprio provider aponta o certo:

GET /api/contacts/check-exists?phone=<13 dígitos>
→ {"numberExists": true, "chatId": "<12 dígitos>@c.us"}

A linha em contacts já tinha o wa_lid preenchido. Era só não consultá-lo.

Depois da correção, o mesmo cron no mesmo contato: {"scanned":1,"updated":1,"no_picture":0,"failed":0}, com o arquivo gravado no bucket (37,7 KB, image/jpeg).

A correção

A função local passa a seguir a mesma ordem de resolveWahaChatId (lib/waha/send.ts) e de chatIdOf (session-reconciler.ts): wa_lidwa_identity → telefone. O SELECT passa a trazer wa_lid e phone_number, que ele nem pedia.

Optei por manter a função local em vez de importar resolveWahaChatId: o import acrescentaria menção de provider num arquivo que a doutrina de canal só tolera por ler a coluna waha_session_name. pnpm lint:channels segue com "62 arquivos de dívida conhecida, nenhum novo".

Teste

tests/unit/cron-contact-avatars-chatid.test.ts (novo, 3 casos): com wa_lid pede pelo @lid; sem ele cai no wa_identity; wa_identity no formato lid: também resolve para @lid.

Verifiquei que ele pega o defeito — revertendo só o código, a asserção falha com a mensagem que descreve o bug:

AssertionError: expected [ '<13 dígitos>@c.us' ] to deeply equal [ '<wa_lid>@lid' ]

Checklist (Definition of Done)

  • pnpm typecheck zerado
  • pnpm lint zerado (0 errors; os 349 warnings são pré-existentes, nenhum nos arquivos tocados)
  • pnpm lint:channels ok — nenhuma dívida nova
  • Testes relevantes existem e passam (pnpm test:unit)
  • Sem console.log esquecido
  • Fragmento em .changes/ — não escrevi; sigo a orientação do template de que isso fica com vocês
  • Mudança de schema — não se aplica, nenhuma migration

Sobre a suíte completa: tests/unit/leads-import-route.test.ts falha 11 testes na main sem este PR — confirmei com git stash. Não mexi nesse caminho.

`wa_identity` é GERADA com o telefone antes do lid (migration 0122). Num
número BR cujo `wa_id` não tem o nono dígito — comum em linhas antigas —
derivar o chatId dela produz um endereço que não existe no WhatsApp: o
provider responde `profilePictureURL: null`, o cron carimba "sem foto" e
o avatar nunca aparece no Inbox.

Medido numa instalação real: para o mesmo contato, `check-exists`
devolveu `{"numberExists":true,"chatId":"<12 dígitos>@c.us"}` enquanto o
cron perguntava por `<13 dígitos>@c.us`; o `@lid` do mesmo contato
devolvia a foto na hora, e a linha em `contacts` já tinha o `wa_lid`.

A função local passa a seguir a MESMA ordem de `resolveWahaChatId`
(lib/waha/send.ts) e de `chatIdOf` (session-reconciler): wa_lid,
wa_identity, telefone. Fica local de propósito — importar de `lib/waha/`
acrescentaria menção de provider que a doutrina de canal desencoraja, e
`lint:channels` segue sem dívida nova.

O SELECT passa a trazer `wa_lid` e `phone_number`, que ele nem pedia.
@vercel

vercel Bot commented Sep 12, 2026

Copy link
Copy Markdown

@HigorLira is attempting to deploy a commit to the rafael-maudibrasil's projects Team on Vercel.

A member of the Team first needs to authorize it.

@ecc-tools

ecc-tools Bot commented Sep 12, 2026

Copy link
Copy Markdown
Contributor

ECC Tools / Security Evidence

Commit: 12df1408e6d4855f67d4aa9060c4e9312e9564c5

Security evidence gate passed (success)

No security-sensitive scanner-evidence gap detected.

Mode: enforce

Scanned 2 changed file(s). No missing scanner-evidence signal was detected.

Check publication was denied or unavailable. An app owner must enable Checks: read and write, and the installation owner must approve the updated permission.

@ecc-tools

ecc-tools Bot commented Sep 12, 2026

Copy link
Copy Markdown
Contributor

ECC Tools / PR Risk Taxonomy

Commit: 12df1408e6d4855f67d4aa9060c4e9312e9564c5

PR taxonomy review recommended (neutral)

Detected 1 PR taxonomy bucket(s): CI/CD Recommendation.

Scanned 2 changed file(s).

Roadmap taxonomy buckets:

CI/CD Recommendation

CI, dependency, coverage, and contract signals should be routed into follow-up checks or verification work.

Signals:

  • API contract changes may ship without integration coverage
  • API implementation changes may ship without contract artifact updates
  • Async job or webhook changes may ship without reliability coverage
  • 1 CI or workflow path(s) changed

Paths:

  • tests/unit/cron-contact-avatars-chatid.test.ts
  • app/api/v1/cron/contact-avatars/route.ts

Check publication was denied or unavailable. An app owner must enable Checks: read and write, and the installation owner must approve the updated permission.

@ecc-tools

ecc-tools Bot commented Sep 12, 2026

Copy link
Copy Markdown
Contributor

ECC Tools / Reference Set Readiness

Commit: 12df1408e6d4855f67d4aa9060c4e9312e9564c5

Reference set readiness gaps detected (neutral)

Reference evidence present for 0/7 areas (0%) across 2 changed file(s).

This check is based on files changed in this PR. Repository-level readiness is still reported by /ecc-tools analyze comments and generated manifests.

Area Status Evidence / Next Step
Deep analyzer corpus Missing Add analyzer fixture, golden, benchmark, or reference-set files that can catch analyzer regressions.
RAG/evaluator comparison Missing Add retrieval or evaluator reference-set comparison fixtures with expected ranking behavior.
PR salvage/review corpus Missing Add stale-PR, review-thread, reopen-flow, or salvage reference cases for queue cleanup automation.
Discussion triage corpus Missing Add public discussion triage fixtures, golden cases, or reference sets for informational, answered, and no-response classifications.
Harness compatibility Missing Add cross-harness, adapter-compliance, or harness-audit evidence for Claude, Codex, OpenCode, Zed, dmux, and agent surfaces.
Security evidence Missing Attach security evidence such as SBOMs, SARIF, audit reports, or AgentShield evidence packs.
CI failure-mode evidence Missing Add captured CI failure logs, dry-run fixtures, or troubleshooting docs for common workflow failure modes.

Check publication was denied or unavailable. An app owner must enable Checks: read and write, and the installation owner must approve the updated permission.

@github-actions

Copy link
Copy Markdown

Recebido, @HigorLira — obrigado por isto.

Duas coisas que vão parecer erro seu e não são:

  • O check Vercel vermelho ("Authorization required to deploy") é esperado em PR de fork. A
    main faz deploy de produção e a Vercel se recusa a construir código de fora, o que está
    certo. Ele não entra no gate de merge.
  • No primeiro PR de quem nunca contribuiu aqui, os workflows ficam parados esperando
    liberação
    — política do GitHub, não sua. Enquanto isso o PR parece não ter check nenhum
    (nem o gh pr checks mostra os que estão nesse estado). Quem tria libera; você não precisa
    fazer nada.

Um mantenedor vai revisar de verdade — rodando os gates e reproduzindo o comportamento, não só
lendo o diff — e responde aqui em até um dia útil, com a medição junto, nunca com um "acho
que".

Esta mensagem é automática e não diz nada sobre o seu PR: ela é sobre o processo. O que vem
depois é pessoa.

@ecc-tools

ecc-tools Bot commented Sep 12, 2026

Copy link
Copy Markdown
Contributor

ECC Tools / Hosted Promotion Readiness

Commit: 12df1408e6d4855f67d4aa9060c4e9312e9564c5

Hosted promotion readiness passed (success)

No hosted promotion evidence gaps detected across 2 changed file(s); 0 corpus scenarios had matching evidence.

This check compares PR file changes against the evaluator/RAG promotion corpus in src/analyzers/fixtures/evaluator-rag-corpus.ts.
Hosted output scoring inspected 0 completed cached hosted job results.

No evaluator corpus scenarios matched this PR.

Check publication was denied or unavailable. An app owner must enable Checks: read and write, and the installation owner must approve the updated permission.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

cron/contact-avatars não resolve o nono dígito BR nem consulta wa_lid — avatar fica vazio para contatos cujo wa_id não tem o nono dígito

1 participant