Cron multi-perfil finalmente acaba com a interferência cruzada: cada perfil entrega pelo seu próprio bot


Você mantém dois perfis: um assistente pessoal e um bot de equipe, cada um com seu próprio bot de Telegram ou Feishu. Às 3h da manhã, o job agendado do bot de equipe termina — e o resultado é entregue pelo seu bot pessoal. Ou pior: a entrega falha com Bot not in chat — o job foi concluído, mas ninguém nunca viu o resultado. Uma correção mesclada em 31 de agosto (PR #99375) arranca essa classe inteira de interferência cruzada pela raiz: qual bot entrega a mensagem de um cron job é decidido pelo perfil dono do job — não pelo processo que por acaso o executou.

A causa raiz: a identidade de entrega seguia a “pessoa” errada

No design multi-perfil do Hermes, cada perfil tem sua própria configuração, credenciais, banco de sessões e bots de mensageria. Mas antes dessa correção, a entrega de cron tinha uma falha fatal: a identidade de entrega seguia o processo executor em vez do perfil dono do job.

Concretamente: você inicia o gateway a partir do seu perfil principal, e ele hospeda os jobs do perfil B pelo caminho. Quando o job de B roda, o sistema lê as credenciais “do processo atual” — que pertencem ao perfil principal — então o resultado de B sai pelo bot do perfil principal. Entregando no grupo do perfil B? O bot não está naquele grupo, então dá erro. Entregando no chat do perfil principal? A mensagem cai no lugar errado. O job foi concluído, e mesmo assim o resultado desapareceu.

E isso era só metade do problema. O cron status tinha uma mentira correspondente: ele tratava qualquer gateway ativo de qualquer perfil como prova de saúde — mesmo quando o agendador do próprio perfil B não estava rodando. O status parecia verde enquanto os jobs de B nunca disparariam.

A correção: quatro causas raiz, um princípio

O PR #99375 faz cherry-pick de commits de nove contribuidores e conserta cada elo dessa corrente, sob um único princípio: a identidade de entrega deve vir do perfil dono do job. Concretamente:

  • Cada tick de perfil ganha seu próprio mapa de adaptadores: ao multiplexar (_start_multiplex), o tick de cada perfil recebe seu próprio mapa de adaptadores de plataforma; adaptadores compartilhados ficam reservados apenas para o perfil padrão e nunca servem de fallback para perfis secundários desconectados;
  • O escopo de segredos do perfil agora cobre a entrega: antes o escopo era resetado logo depois que o job rodava, então os fallbacks de standalone-send resolviam os tokens de plataforma do processo executor; agora o escopo cobre _deliver_result de ponta a ponta;
  • Os IDs de home chat são resolvidos a partir dos segredos do perfil dono: o chat/thread de destino é resolvido via get_secret no escopo do perfil dono, em vez de variáveis de ambiente cruas;
  • Jobs de perfis gravam sessões no próprio state.db: a SessionDB é construída via contextvars.copy_context(), então as execuções de cron de B param de persistir sessões no banco do perfil padrão;
  • Resgate de preflight para perfis satélite: satélites roteados via gateway.profile_routes leem a config principal diretamente, falham de forma segura (fail-closed) e não vazam nenhum ambiente;
  • cron status diz a verdade: a descoberta de PID do systemd é limitada ao nome de serviço deste perfil, e um heartbeat nunca visto é lido como aviso, não como verde.

Como verificar na sua máquina

Depois de atualizar para a main mais recente, primeiro confira se o status do agendador do seu perfil agora é confiável:

# Status do agendador de um perfil específico — não um sinal verde de "qualquer gateway vivo"
hermes -p work cron status

Depois rode um cron job com entrega e observe se a mensagem vem do bot daquele próprio perfil e cai no home chat daquele perfil. Para quem roda vários perfis em várias plataformas, esta é uma correção de experiência imediatamente visível: os resultados não desaparecem mais, a interferência cruzada acabou e as mensagens fantasma de “job concluído, mas ninguém recebeu” param.

Quando você pode usar

O PR #99375 foi mesclado em 31 de agosto de 2026 e está apenas na main — ainda não saiu em uma release. Ele corrige um conjunto de relatos reais de usuários: #94862, #97909, #99028, #98790, #97476 — todas queixas de “mensagem nunca chegou” / “o status está mentindo”.

Múltiplos perfis são uma das capacidades mais subestimadas do Hermes: cada perfil tem sua própria identidade, memória e bots. Para usá-los bem, comece pelo nosso guia completo de multi-perfil e pelo roteamento de múltiplos perfis no Feishu; o playbook completo de cron vive no guia completo de automação de cron.