Mensagem da Mãe
Uma frase: transformar um registro de conversa familiar em um número, um rótulo e uma frase pronta para enviar.
O usuário não precisa que uma IA lhe diga que a mãe o ama. Ele precisa de três coisas: ① um número que nunca contou ("você respondeu 'hum' 38 vezes"); ② um degrau ("o software diz que te devo uma ligação" é mais fácil de enviar do que "sinto sua falta"); ③ uma imagem para compartilhar (expor culpa = expor consciência). Cada módulo do relatório serve a esses três objetivos. Não é análise psicológica — a mãe não precisa de um tipo de apego.
Fluxo: obter o registro → confirmar quem são as duas pessoas → converter para messages.json → stats.py calcula → fazer três perguntas → escrever o texto → render.py gera relatório e cartões. Modo prática e modo comparação são entradas adicionais.
Arquivos de suporte neste diretório, leia conforme necessário:
references/metrics.md— como cada número é calculado (se o usuário perguntar "como isso foi calculado", consulte aqui)references/types.md— 10 tipos dela + 6 tipos seus + 5 níveis de classificaçãoreferences/dictionary.md— dicionário base e regras de geração para tabela de tradução de jargõesreferences/writing-rules.md— regras da parte textual, lista negra anti-IA, quando conter-sereferences/report-template.md— modelo de relatório e campos de narrative.jsonreferences/practice.md— modo práticareferences/export-guide.md— guia de exportação/captura por plataforma (se o usuário perguntar "como exportar", veja aqui; recomende captura de tela primeiro)scripts/—parse_export.pyvalidate.pystats.pyrender.pycompare.pyredact.py, apenas biblioteca padrão, sem internetassets/— templates HTML do relatório e dois cartões
Privacidade (acima de tudo)
- Apenas lê as capturas/arquivos fornecidos pelo usuário. Não descriptografa banco de dados do WeChat, não acessa a internet, não armazena registros em nenhum lugar que o usuário não tenha solicitado. Os artefatos dos scripts (messages.json / stats.json / reports/) ficam no diretório atual; informe ao usuário onde estão e que podem ser deletados a qualquer momento.
- O relatório não reproduz o texto integral, apenas cita frases curtas. Transferências: registra apenas o número de vezes, não o valor.
- Se o usuário não ocultou informações: avise uma vez "nomes e conteúdo sensível podem ser removidos com
scripts/redact.pyprimeiro", sem repetir. - Se o usuário perguntar "vai vazar?": responda honestamente — em qual ferramenta você está executando, para ela os registros são enviados; os scripts em si não enviam nada.
Primeiro Passo: Obter o Registro
Pergunte primeiro se ele tem o WeChat no computador. Arquivos exportados são muito melhores que capturas de tela — pega todo o registro de seis meses de uma vez, timestamps completos, sem precisar capturar tela por tela nem transcrever com IA (dezenas de capturas cobrem apenas centenas de mensagens e ainda podem errar).
Prioridade:
- Arquivo exportado (preferencial): Use WeFlow (WeChat 4.0+) ou WeChatMsg/PyWxDump (WeChat 3.x) para exportar o registro dessa pessoa como JSON/CSV/TXT. O
scripts/parse_export.pyreconhece. Os detalhes por plataforma estão emreferences/export-guide.md; responda apenas a parte correspondente à situação do usuário, não leia tudo de uma vez. - Capturas de tela (plano B): Use quando só tem celular, está no Mac, ou não quer instalar nada no computador. Serve para WeChat/QQ/SMS. Android pode usar captura longa.
- Texto colado diretamente.
Se o usuário não deu nada, apenas disse "quero analisar minha conversa com minha mãe", pergunte primeiro:
Você tem o WeChat instalado no computador? Se tiver, eu ensino como exportar o registro com ela — pega tudo de seis meses de uma vez, muito mais preciso que captura. Se só tiver celular, tudo bem — tire capturas de tela, de cima para baixo, uma por tela.
No caminho das capturas, complemente: é melhor que duas capturas adjacentes tenham uma ou duas mensagens sobrepostas; dezenas de capturas geram um relatório, mas de trinta a quarenta os números ficam estáveis; nomes e conteúdo sensível podem ser ocultados primeiro.
Segundo Passo: Confirmar as Duas Pessoas
- Qual lado é o usuário, qual lado é o familiar. Nas capturas do WeChat, o balão verde à direita é o usuário, o branco à esquerda é o outro. Em arquivos exportados, veja o campo de remetente. Se não conseguir distinguir, pergunte uma vez.
- Quem é o outro, como chamá-lo, usar "ela" ou "ele". Se o usuário disser "minha mãe", use "mãe/ela"; se disser "meu pai", use "pai/ele"; se disser "avó", use "avó/ela". O título do relatório, o tipo e o feriado (Dia das Mães/Dia dos Pais) seguem todos a escolha. A skill se chama "Mensagem da Mãe", mas metade dos usuários vai usá-la para analisar o pai.
- Aniversários (opcional): o dela e o do usuário (MM-DD), entram no placar de feriados e na contagem regressiva.
Terceiro Passo: Converter para Planilha de Mensagens
O destino é messages.json:
{"me": "eu", "her": "mãe", "her_pronoun": "ela", "source": "screenshots",
"messages": [
{"ts": "2026-05-12T21:03:14", "sender": "her", "type": "text", "content": "Já comeu?", "dur": null},
{"ts": null, "sender": "me", "type": "text", "content": "Comi", "dur": null},
{"ts": "2026-05-12T21:05:00", "sender": "her", "type": "voice", "content": "", "dur": 23}
]}
type ∈ text / voice / image / video / sticker / transfer / link / call_voice / call_video / recall / location / file. Áudio e chamada escrevem os segundos em dur. link coloca o título no content. transfer escreve apenas "transferência" no content, sem valor.
Caminho das capturas: transcreva uma por uma. Regras:
- Mensagens sobrepostas entre capturas adjacentes são registradas apenas uma vez, alinhadas por conteúdo e posição, sem adivinhação.
- O WeChat só exibe timestamps quando o intervalo é grande. Quando houver timestamp, preencha
ts; quando não, preenchanull(o script conta, mas não participa do cálculo de tempo). Não invente timestamps para mensagens sem. - Áudio: anote a duração em segundos. Stickers: registre como
sticker(emoticons embutidos como [Rosa] coloque nocontent). Transferências: anote apenas o número de vezes. - Se a captura estiver muito borrada ou com lacunas óbvias: transcreva o que for visível e indique na nota de dados. Não complete dados para o relatório ficar bonito.
- Após a transcrição, execute
python scripts/validate.py messages.json: ele verifica formato, ordem cronológica, possíveis duplicatas (sobreposição não removida entre capturas adjacentes), se alguma transferência tem valor, e imprime o número de mensagens e o intervalo de tempo. Mostre esse resumo ao usuário para confirmar, depois calcule.
Caminho da exportação (preferencial):
python scripts/parse_export.py arquivo_exportado --her nome_no_registro --call mãe --out messages.json
# Se não souber como o outro é chamado no registro: execute sem --her primeiro; o script listará os nomes
# Se o registro abranger vários anos: adicione --since 2026-01-01 (ou --last-days 180) para pegar só o período recente, o relatório fica mais focado
Exportação do WeFlow: escolha o formato JSON (já vem com o campo isSend indicando o remetente, não precisa preencher --her; TXT e weclone CSV também são reconhecidos, mas com menos informação). Ferramentas como WeFlow / WeChatMsg exportam o registro completo, que pode ter dezenas de milhares de mensagens. Se o período for muito longo, o relatório fica diluído ("o que ela mais pergunta" vira a média de três anos). Por padrão, recomendo pegar apenas os últimos 6-12 meses. Atenção: WeFlow não exporta a duração de áudios; o campo "áudio mais longo" ficará ausente, o que é normal.
Quarto Passo: Calcular
python scripts/stats.py messages.json --out stats.json --today 2026-08-30 --her-birthday 10-20 --my-birthday 06-03
O terminal imprime um resumo; stats.json contém todos os números. Cada número do relatório vem daqui, não calcule de cabeça. As definições estão em references/metrics.md. Os warnings de stats.json devem ser copiados para a nota de dados no final do relatório.
Se não for possível executar o script (ex: ambiente apenas de conversa): calcule manualmente, seguindo as definições de metrics.md, os itens mais centrais — quem inicia, mediana de resposta, respostas curtas, não respondidas, o que mais pergunta, horários — e marque os demais como "precisa de registro exportado para calcular".
Quinto Passo: Fazer Três Perguntas
Após calcular, mostre primeiro ao usuário os três índices e o resultado da classificação (é a parte mais interessante, mostre primeiro), depois pergunte:
Antes de escrever a última parte, preciso fazer três perguntas; todas podem ser puladas: ① Quanto tempo faz que você não vai para casa? ② Ela teve alguma coisa recentemente — saúde, família? ③ Do que vocês falaram na última ligação?
Sexto Passo: Escrever o Texto
Siga references/writing-rules.md. O que escrever:
- Para cada um dos três índices, uma frase incisiva (número + um detalhe)
- Para o tipo dela e o seu tipo, uma frase cada (cite fala original + número)
- Tabela de tradução de jargões: 6 a 10 itens (falas que ela realmente disse, veja
dictionary.md) - O que ela transferiu para você: uma percepção (o que transferiu, relação com algo que o usuário disse)
- O que ela realmente queria dizer: 120–220 palavras
- Três coisas para fazer hoje à noite
- Três sugestões de resposta
- Três aberturas para ligação
- Uma frase pronta para enviar diretamente a ela: 60–100 palavras, com horário específico
Primeiro, dê o relatório completo no chat usando o template Markdown de report-template.md; ao mesmo tempo, escreva o texto em narrative.json.
Sétimo Passo: Gerar Relatório e Cartões
python scripts/render.py stats.json narrative.json --out reports/
Três arquivos: relatório completo, cartão de conta afetiva (para o usuário postar), cartão para enviar a ela. Diga ao usuário para abrir no navegador e tirar captura de tela; os cartões são no formato vertical (retrato). O cartão para enviar a ela é a verdadeira saída deste produto — se for recomendar apenas um, recomende este.
Entradas Adicionais
Modo prática (usuário disser "praticar", "treinar comigo", "interpretar minha mãe") → leia references/practice.md. A IA conversa no estilo dela com o usuário por 10 rodadas; quando o usuário responder "hum", marque na hora. No final, dê uma nota. Precisa de ≥ 40 registros.
Modo comparação (usuário disser "comparar com amigo", "pra quem eu respondo mais rápido") → peça ao usuário mais um conjunto de capturas com um amigo, siga o mesmo fluxo para gerar friend-stats.json, depois:
python scripts/compare.py stats.json friend-stats.json --labels suaMãe amigo --mode friend
Conclusão em uma linha: "Você responde ao amigo em 3 minutos, à sua mãe em 4 horas e 12 minutos — 84 vezes mais devagar."
Relatório de parcialidade (usuário deu dois conjuntos, pai e mãe) → --labels mãe pai --mode papa.
Só o cartão (usuário disser "faz um cartão", "me dá uma imagem") → se já existirem stats e narrative, renderize direto; senão, siga o fluxo completo — o cartão é um produto do fluxo.
Ajudar a responder (usuário disser "me ajuda a responder ela") → escreva apenas as respostas para a lista de "não respondidas" e as três aberturas de ligação; não gere o relatório completo.
Quando Conter-se
Observe o registro e o tom do usuário; não precisa que ele diga explicitamente. Os detalhes estão no final de writing-rules.md; pontos principais:
- Registro com < 20 mensagens: mostre apenas números, sem interpretação.
- Registro com conflito, insulto, controle, pressão persistente para casar/pedir dinheiro: descreva neutralmente os padrões de ambos os lados; não presuma quem está certo; remova "três coisas para fazer hoje à noite" e "a frase para enviar a ela".
- Se o usuário estiver chateado, com conflito familiar, ou mencionar que a mãe já faleceu: primeiro responda à pessoa, depois pergunte se deseja continuar; se continuar, remova a classificação.
- Se estiver analisando para outra pessoa: mude para terceira pessoa.
Em hipótese alguma rotule o usuário. "Resposta curta" não é "desatenção", "não respondeu" não é "falta de respeito", a classificação é um capítulo, não uma sentença.
Checklist Antes de Entregar o Relatório
- Cada número pode ser encontrado em
stats.json - Cada afirmação em "o que ela realmente queria dizer" aponta para uma fala original ou um número
- A frase do tipo cita uma fala original
- A frase para enviar a ela tem um horário específico
- O texto não contém frases da lista negra, nem "desatenção", "falta de respeito", "deveria", nem pontos de exclamação
- O tratamento (ela/ele) e o feriado estão corretos conforme a pessoa
- Nenhum valor de transferência foi escrito
- A nota de dados menciona lacunas nas capturas e número de mensagens sem timestamp