FreshWomen · Season 3

Fontes e método

De onde vem cada número deste painel, quem leu o quê, e o quanto dá para confiar em cada coisa. Esta página é gerada pelos próprios arquivos de dado: as contagens abaixo são lidas na hora em que ela é montada, não digitadas.

Por que este painel existe

A pergunta que veio antes de qualquer gráfico, e o que ele mudou de decisão até agora.

As decisões caras da S3 precisam ser tomadas antes do lock de conteúdo, e vinham de opinião. Três coisas cobravam preço alto e nunca tinham sido medidas: se a dublagem compra alguma coisa, já que elenco e mixagem custam meses de calendário; por que a estreia da S2 tirou a pior nota da temporada, 74,2%, justamente na quinzena que concentrou metade do dinheiro do trimestre; e o que fazer com o fato de que review negativa é permanente, fica na vitrine e cobra o preço nas vendas seguintes.
Por que virou site e não planilha. Cada número anda junto do método que o produziu, a página é consultável no momento da decisão, os dados vêm de script que pode rodar de novo, e a decisão fica registrada com a data em que foi tomada. Esta página de fontes é gerada pelos próprios arquivos de dado justamente para que o painel não envelheça mentindo.
PáginaQue decisão ela serve
Plano de lançamentoVenda e review da S1 e da S2, e o plano da S3 construído em cima das duas
Relevância da DLC de vozSe a dublagem compra alguma coisa, medido em dinheiro, em nota e em conversa, dentro e fora de casa
ComunidadeQuem é o público: volume, até onde chega no jogo, idioma, aprovação por idioma
Report dos updatesO que a comunidade respondeu no Typeform a cada update: nota por critério, volume de resposta e idioma
Descrição da lojaEscrever e revisar o texto da S3 no lugar em que o comprador vai ler
Cronograma de postsSeis posts até a estreia, cada um desarmando um motivo de negativa antes da compra
Fontes e métodoDe onde vem cada número e quanto dá para confiar em cada um
O que já mudou por causa dele. A voz saiu do caminho crítico do lançamento e virou acabamento e material de comunicação. A nota do dia 1 virou a meta número 1 do plano. Conteúdo grátis cedo entrou como calendário combinado, e não como socorro, porque foi o único movimento que mexeu na nota da S2, de 74,6% para 90,7%. O desconto virou raso e cedo, já que os 68% de junho renderam menos que os 28% de março. E a projeção deixou de ser chute: com as duas temporadas lidas na mesma fonte, o multiplicador passou a ter referência medida, 75% do ritmo diário de unidades da S1 na janela de lançamento.
O que este painel não é: não é relatório de resultado, não é dashboard ao vivo (é um retrato com data, e por isso toda tela de número de vida inteira carrega a data da leitura), não substitui o Steamworks para wishlist e rodada de visibilidade, e não mede causa.

A versão longa, com o histórico de organização e como manter, fica no arquivo POR-QUE-ESTE-PAINEL-EXISTE.md, na pasta do projeto.

As duas origens, e elas não têm o mesmo peso

Metade deste painel eu apurei do zero e dá para auditar linha a linha. A outra metade veio pronta.

Reviews: apuradas aqui. Tudo que é review, nota, volume, idioma e citação saiu da API pública da Steam, baixada por script para arquivo local, e está conferível. O endereço é store.steampowered.com/appreviews/<appid>, paginado por cursor, 100 por requisição, sempre com language=all e purchase_type=all — sem esses dois parâmetros a Steam devolve só inglês e só compra direta, que é cerca de 15% do total e daria um retrato falso. Datas de update saem de ISteamNews/GetNewsForApp e a ficha da loja de api/appdetails.
Faturamento: não é meu. Nenhum valor em dólar deste painel foi apurado por mim. $72.527/dia, $9.084/dia, $18.804/dia e a projeção inteira vieram dos CSVs do Steamworks, entregues prontos. Não tenho acesso ao Steamworks: o que fiz com esses números foi reagrupar por bloco e dividir por dias. Se o CSV estiver errado, o painel repete o erro. É por isso que a projeção da aba 03 é cenário declarado e não previsão.
Unidades de vida inteira: também não são minhas. A tabela que compara S1 e S2 na aba 03 (unidades, devolução, receita, usuários únicos, wishlist, mediana de tempo jogado) foi lida no painel de app do Steamworks de cada appid em 17/ago/2026. O que fiz com ela foi somar, dividir por dias no ar e comparar as duas colunas. A comparação entre temporadas, que antes estava fora do painel por misturar fontes, voltou por causa disso: agora os dois lados saem da mesma tela, com a mesma definição de unidade e de devolução. Continua valendo o aviso de cima: número entregue pronto, sem como conferir, e ele é um retrato de uma data, não uma série.
Uma figura mistura as duas origens de propósito, e é a única. O calendário de vendas e eventos da aba 01 põe no mesmo eixo de tempo o $/dia por bloco, que é Steamworks, e as reviews por dia, que são da API. São dois desenhos separados, empilhados, justamente para ninguém ler uma curva como se fosse a outra: a série de dinheiro não existe em resolução diária, só agregada por bloco de preço.

O que foi baixado, e quanto disso é o total

Cobertura de cada coleta contra o número que a própria API declara. Coleta parcial está marcada e explicada.

BaseAppColetadasAPI declaraCoberturaArquivoColeta
Season 1135065018.67818.679100%19.1 MB13/08/2026
Season 234786502.6412.641100%3.0 MB13/08/2026
Season 340058700--0 KB13/08/2026
Playtest S3450914099100%13 KB13/08/2026
Pentiment12055209.6879.687100%830 KB14/08/2026
SlayThePrincess198927033.46033.465100%3.9 MB14/08/2026
YsFelghana2073202.1292.129100%213 KB14/08/2026
Wasteland22407608.1008.100100%732 KB14/08/2026
SunlessSkies5969703.4683.468100%315 KB14/08/2026
Disco Elysium632470112.193129.92086%10.7 MB14/08/2026
Disco Elysium é a única coleta parcial de propósito. A paginação vai da review mais nova para a mais velha, e eu parei em 01/06/2020 porque o que interessa é a janela de 183 dias em volta de 30/03/2021, que está 100% coberta. O que falta é anterior a junho de 2020 e não entra em conta nenhuma.

Quem leu as reviews

Nenhum script classificou nada. O papel do regex foi achar candidatas e despejar o texto num arquivo; a decisão de classe é leitura, entrada por entrada.

Candidatas da S1 lidas
1.018
904 da rede inicial + 114 recuperadas
Candidatas da S2 lidas
235
de 2.641 reviews
Negativas da S1 lidas
908
todas, inteiras
Negativas da S2 lidas
461
todas, inteiras
Classificação feita à mãoReviewsOnde aparece
S1 · pedido explícito de voz211aba 01 do plano e a página da DLC de voz
S1 · reclamação da ausência221aba 01 do plano e a página da DLC de voz
S1 · total que pede voz432o 3,1% da aba 01
S2 · elogia a voz111aba 02
S2 · critica a voz18aba 02
S2 · diz que a voz custou conteúdo9aba 02
S2 · pede mais voz9aba 02
S2 · cita sem julgar20aba 02
S2 · falso positivo do filtro69descartadas
S1 · negativas lidas inteiras908os motivos da aba 01
S2 · negativas lidas inteiras461os motivos da aba 02
O que NÃO foi lido à mão, e está assim escrito nas abas: o percentual “citam voz” dos jogos da página Relevância da DLC de voz (122 mil reviews, casamento de termo puro) e a contagem por motivo das negativas — das 908 da S1 e das 461 da S2. Ali os temas saíram da leitura, mas a contagem de cada linha é por lista de termos, para aplicar o mesmo critério em todas.

Como o filtro foi testado

Rede ampla de propósito: falso positivo o olho descarta na leitura, falso negativo some para sempre. Por isso o filtro é auditado contra uma amostra de fora dele.

Na S1 o teste rodou e pegou erro. Sorteei 200 reviews que o filtro não tinha pego e li uma a uma: 3 falavam de voz, todas por termo que faltava — ses em turco, 声音 em chinês e voces em espanhol. Com o filtro ampliado entraram 114 candidatas novas, das quais 67 realmente pediam voz: a contagem inicial estava 15% baixa. Contra o filtro final, a mesma amostra tem zero escapes.
Na S2 esse teste ficou pela metade. A amostra de 200 rodou e achou 3 escapes, o filtro foi ampliado e recuperou 11 candidatas — mas não refiz uma amostra nova contra o filtro corrigido. É a lacuna de método que sobrou neste painel. Barata de fechar, e até que feche, os números de voz da S2 são piso.

Quanto dá para confiar em cada número

Não existe um percentual único de confiabilidade, porque os números não foram produzidos do mesmo jeito. São quatro níveis.

Tipo de númeroNívelPor quê
Aprovação, volume, idioma, datacensoNão é amostra, é contagem: 18.678 de 18.679 na S1, 2.641 de 2.641 na S2. O erro possível é de coleta, não de estatística
Pedido de voz na S1, elogio na S2alta, e é pisoLeitura integral das candidatas, com o filtro auditado por amostra de fora. Erra para baixo, nunca para cima
Motivos das 461 negativasranking sim, linha nãoA ordem é robusta — roteiro com 54,9% está muito à frente de tudo. O valor exato de cada linha muda conforme o termo escolhido
“Citam voz” nos casos da DLC de vozmédiaSó termo, sem leitura. Vale para o antes contra o depois, porque o critério é o mesmo dos dois lados; não vale como número absoluto
Tabela dos 22 concorrentesmetadado exato, amostra nãoA marcação de áudio completo é da própria Steam. Mas a escolha dos 22 títulos é minha e não é aleatória: essa é a parte fraca dessa página
Faturamento e projeçãonão verificadoVem do Steamworks, entregue pronto. Não tenho como conferir
Unidades e devoluções de vida inteiranão verificadoPainel de app do Steamworks, lido em 17/ago/2026. Mesma origem do faturamento, e é retrato de uma data: reler depois muda os valores
Três limites que valem repetir. Review editada conta como o texto de hoje, e cerca de 8% das reviews da S1 foram editadas depois de publicadas — existe review de 2022 que hoje diz “atualizaram com voz, ficou ótimo” e cujo pedido original sumiu do texto. Review apagada ou de conta banida não está no arquivo. E nada aqui prova causa: quando duas coisas acontecem juntas, as abas dizem que aconteceram juntas, não que uma causou a outra.

Os scripts, na ordem em que o dado passa por eles

Todos ficam na pasta do projeto e podem ser rodados de novo. A descrição de cada um é lida do cabeçalho do próprio arquivo.

c:\Users\PC\Desktop\Pessoal\Projetos\oppaiman\lancamentos\painel-s3\
ScriptAlimentaO que fazTamanho
coletar_todos.pyabas 01, 02, 04 e /communityMesmos parametros do coletar_1350650.py (json=1, filter=recent, language=all, purchase_type=all, num_per_page=100, cursor). Um arquivo por app em _dados/. Sem os defaults abertos a API esconde ~85% das reviews, entao language=all e3 KB
coletar_1350650.pyaba 01Coleta pura: nao filtra janela, nao analisa, nao resume. A analise le o arquivo depois, para que qualquer numero do relatorio possa ser reconferido no bruto. Parametros exigidos na tarefa: json=1, filter=recent, language=all,4 KB
reviews.pyaba 01Alimenta a analise de reviews do painel (freshwomen-s3.pages.dev). Nao publica nada: so coleta e imprime o resumo, alem de gravar o JSON bruto para conferencia. Como a API se comporta (verificado em 11/08/2026, nao e de memoria):9 KB
analisar_dublagem.pyabas 01 e 04Le o bruto de reviews_1350650.json (nunca chama a API: assim todo numero do relatorio pode ser reconferido no mesmo arquivo) e escreve um relatorio markdown. Janelas, atribuidas pela data de CRIACAO da review (timestamp_created, UTC):18 KB
pedido_de_voz.pyabas 01 e 04Etapa 1 (--dump): rede ampla por regex sobre as 18.677 reviews e despejo dos candidatos em lotes de texto, para leitura humana. Review curta sai inteira; review longa sai como janela em volta do termo, que e o barato que da contagem7 KB
voz_s2.pyaba 02A S2 nasceu dublada, entao aqui nao existe "antes e depois": a unica pergunta respondivel e QUANTO da conversa da S2 e sobre voz, e se e elogio ou queixa. O metodo e o mesmo da S1 (pedido_de_voz.py): rede ampla por regex, despejo dos5 KB
coletar_caso.pyDLC de vozServe para a aba de casos: para cada jogo que ganhou voz depois de lancado, o que interessa e a data, o polegar, o idioma e se o texto fala de voz. Guardar a review inteira de um jogo com 130 mil reviews nao cabe e nao serve para nada,4 KB
categoria_voz.pyDLC de vozPara cada titulo de uma lista de VNs adultas e jogos do mesmo balcao na Steam, pega da API da loja: se algum idioma esta marcado como AUDIO COMPLETO, o total de reviews e o percentual positivo. Sem isso, "voz e diferencial" e opiniao.4 KB
metricas_community.py/communityLe _dados/reviews_.json (gerado por coletar_todos.py) e escreve _dados/community.json com tudo que a pagina desenha. A pagina nao calcula nada: so plota o que sai daqui, para que todo numero seja reconferivel no bruto.8 KB
gerar_community.py/communityA pagina nao calcula nada: recebe o payload pronto e so desenha. Assim todo numero do grafico pode ser reconferido no bruto de reviews_.json. Paleta dos graficos: slots 1 e 2 da paleta categorica de referencia, passo dark7 KB
graficos_s1.pyaba 01Duas figuras no mesmo eixo de tempo (out/2023 a abr/2024), para dar para ler uma em cima da outra: A) $/dia por bloco de venda, com as promocoes destacadas e o dia da DLC marcado7 KB
graficos_s2.pyaba 02Quatro figuras, cada uma com UM eixo (nunca dois no mesmo desenho): A) reviews por mes, barra empilhada positiva/negativa -> volume B) % de recomendo por mes, linha -> recepcao10 KB
graficos_casos.pyDLC de vozCada caso e um jogo que ganhou voz depois de lancado. Sao duas medidas diferentes, entao sao dois desenhos, nunca dois eixos no mesmo: A) quanto da conversa passou a ser sobre voz (antes x depois)3 KB
amostrar_ccu.py/communityRoda de hora em hora pela tarefa do Windows "FreshWomen - CCU horario". Cada passada acrescenta uma linha em _dados/ccu.json, regenera site/community.html e publica. Um retrato solto de CCU nao vale nada; a serie ao longo das semanas ate2 KB
gerar_fontes.pyesta páginaA pagina de metodo nao pode ter numero digitado a mao, senao ela envelhece mentindo. Tudo aqui e lido na hora: cobertura de cada coleta, quantas reviews foram lidas a mao, o que cada script faz (a primeira linha do docstring dele) e27 KB
publicar.pytodasProjeto Pages proprio (freshwomen-s3), na conta da OPPAIMAN. Nao divide projeto com o LocStudio nem com o voice-oppaiman: cada deploy do Pages substitui a pasta inteira, entao juntar projetos so cria a chance de um apagar o outro.2 KB
Onde fica o resto: _dados/ guarda o bruto das coletas, _dados/casos/ os jogos de referência da página da DLC de voz, _lotes/ e _lotes_s2/ os despejos de texto que eu li, e classificacao.json e classificacao_s2.json a decisão de cada review por índice — é por aí que se audita qualquer número de leitura deste painel, review por review.
Como refazer tudo do zero: python coletar_todos.py baixa as reviews de novo, pedido_de_voz.py --contar e voz_s2.py --contar refazem as contagens em cima da classificação salva, graficos_s2.py e graficos_casos.py redesenham as figuras, gerar_fontes.py refaz esta página e publicar.py põe no ar. Nenhuma etapa depende de número digitado à mão.

Página gerada em 20/08/2026 a partir dos arquivos do projeto.