Conta Chatbot id -4: por que não é possível excluir via admin e quais são as alternativas

Anotações de trabalho após análise via Admin API e código do kernel do Discourse (ramo Cursor no repositório hoee).

Objeto

Na instância, a cartão administrativo: /admin/users/-4/chatbot (Chatbot na administração).

O que retornou o JSON administrativo (captura de verificação)

  • id: -4 (este é um bot conforme regras do kernel: user_id > 0 apenas para usuários “vivos”)
  • username: Chatbot
  • admin: true
  • moderator: false
  • post_count: 0
  • can_be_deleted: false
  • can_be_anonymized: false

Por que can_be_deleted: false mesmo com zero posts

No Guardian#can_delete_user?, a exclusão é proibida se o usuário-alvo for admin. Isso não está relacionado ao número de posts no nosso caso.

Por que, manualmente via UI e HTTP administrativo, frequentemente “não dá”

Para operações como revoke admin / destroy, não passa Guardian#can_administer? em identificadores negativos: há uma condição de que o identificador do alvo deve ser positivo (obj.id.positive?). Portanto, requisições aos roteiros member no formato “como um username comum” retornam 404, enquanto com o segmento -4 é possível obter 403 invalid_access, mesmo quando o ator API é staff.

Resultado: remover admin e excluir a conta via Admin API padrão, com o mesmo UX usado para usuários normais, não é possível — é necessário outro caminho (abaixo).

Caminho suave, sem excluir a linha no banco de dados

Desative o módulo de bot de IA nas configurações do site: parâmetro ai_bot_enabled (false — comportamento do bot GPT e UI associada no chat/heads será desativado; a linha do usuário permanecerá).

Na máquina com checkout do repositório hoee e arquivo discourse.env adicionado, há um helper:

  • scripts/discourse-ai-chatbot-operator.sh audit — dump breve dos campos de /admin/users/-4/list.json
  • ai-bot-disable / ai-bot-enable — PUT em ai_bot_enabled (chaves system do discourse.env, não publicar)

Caminho rígido: excluir realmente o usuário

Apenas no host do aplicativo Discourse, com cópia do banco de dados antes das alterações: na console Rails, remova o flag admin da linha (por exemplo, usando update_columns), depois use UserDestroyer de um admin vivo com id > 0 e delete_posts: true se necessário. O texto do bloco para cópia: scripts/discourse-ai-chatbot-operator.sh rails-destroy-snippet.

Riscos: o plugin discourse-ai pode recriar bots em atualizações; podem ocorrer mensagens sobre bot user missing enquanto o módulo não corrigir o estado.

Links no código upstream

Se necessário, nas respostas é possível extrair uma instrução separada sobre como verificar o valor atual de ai_bot_enabled via Admin → Configurações → plugin discourse-ai, sem API.

Atualização: Conta excluída

A operação no host foi realizada não via Admin API (ainda não permite o Guardian acessar com id negativo), mas sim através de rails runner dentro do contêiner de produção app, pelo usuário discourse:

  • o flag admin foi removido do usuário User.find(-4) via update_columns + reload;
  • em seguida, o UserDestroyer foi executado por um administrador ativo com id > 0, com a opção delete_posts: true (no nosso caso, não havia posts).

Verificação externa: GET /u/chatbot.json já não retorna o usuário, e GET /admin/users/-4/list.jsonnot_found.

Lembrete: ao reativar o módulo discourse-ai, o plugin pode recriar a conta do bot, se necessário.