analise-officers

Log de decisões

Como ler este log. Trilha de auditoria do projeto: cada linha traz a decisão, a alternativa descartada e o motivo.

A marca existe para que fique auditável quem decidiu o quê. As linhas não foram reatribuídas depois.

data decisão alternativa descartada motivo
2026-10-25 (fase 0) Fase 0 (kit do Rafael) — Arquitetura: motor de scoring em Python (pandas, funções puras, pytest) gera solution/app/data.js; interface estática em HTML, CSS e JS puro, sem build, abre por duplo-clique e vai ao GitHub Pages Streamlit (é o default de uma entrega de IA sem supervisão) e interface com fetch de JSON Streamlit é o default de uma entrega de IA sem supervisão (00_fase0, seção 6); data.js abre em file:// sem servidor, por isso não há fetch de JSON (CLAUDE.md, decisão 1)
2026-10-25 (fase 0) Fase 0 (kit do Rafael) — Data de referência (“hoje”) = 2017-12-31, como parâmetro e nunca fixada no código Data de execução (25/10/2026) ou data do último engajamento (2017-12-27) Maior close_date do dataset é 2017-12-31 (process-log/outputs/bloco0_eda.txt); o dataset não tem data de extração (briefing, seção 8)
2026-10-25 (fase 0) Fase 0 (kit do Rafael) — Tese do score: o frescor (idade do deal frente ao ciclo histórico) separa os deals, e não os atributos; o score combina a probabilidade condicionada à idade e ao estágio com o valor do produto Score por atributos (win rate por produto, setor ou porte) Atributos ficam entre 60% e 65% de win rate, com qui-quadrado de produto p=0,37 (process-log/outputs/bloco0_eda2.txt); no corte de 30/09, 50% de ganho até 30 dias e 0% acima de 90 (process-log/outputs/bloco0_snapshot.txt)
2026-10-25 (fase 0) Fase 0 (kit do Rafael) — O vendedor não entra como fator de score; o nome aparece só como contexto Usar o win rate por vendedor como fator de score Qui-quadrado de vendedor p=0,26 (process-log/outputs/bloco0_eda2.txt), compatível com ruído para cerca de 220 deals por pessoa (briefing, seção 5); penalizaria pessoas com base em ruído (CLAUDE.md, decisão 4)
2026-10-25 (fase 0) Fase 0 (kit do Rafael) — Listas de ação: Foque (vivo, com alto valor esperado), Reative (bom, mas esfriando), Limpe (zumbi) e Qualifique (Prospecting, sem data) Lista única priorizada com etiquetas (pergunta 1 do briefing, seção 9) A dor é alocação de tempo: 1.291 Engaging (81%) estão acima de 138 dias, com US$ 3.198.664 de US$ 3.892.229 em valor de tabela (process-log/outputs/bloco0_eda2.txt)
2026-10-25 (fase 0) Fase 0 (kit do Rafael) — Validação sempre fora da amostra e temporal: corte em data passada e desfecho posterior; nenhuma métrica in-sample é reportada como resultado Métrica in-sample, como o target encoding por categoria feito na primeira exploração Target encoding in-sample inflava a AUC: sales_agent 0,54, contra 0,49 a 0,50 nas variáveis numéricas (process-log/outputs/bloco0_eda.txt)
2026-10-25 (fase 0) Fase 0 (kit do Rafael) — Idioma: interface e documentação em PT-BR; nomes de colunas, contas e produtos ficam como no dataset Interface e documentação em inglês (alternativa não discutida na fase 0) Usuário principal é o vendedor não técnico, 30 ativos (CLAUDE.md, Missão); nomes do dataset ficam como estão (CLAUDE.md, decisão 7)
2026-10-25 Bloco 0 — Repositório de trabalho obtido por git clone (decisão autônoma do Claude) gh repo para criar o repositório na conta do Rafael gh não está instalado neste ambiente (Get-Command gh não encontrou o executável)
2026-10-25 Bloco 0 — git não está instalado no sistema: uso do dulwich no venv, em vez de instalar o Git (decisão autônoma do Claude) Instalar o Git no sistema Evita mudar o sistema e aceitar licença sem o Rafael; Get-Command git não encontrou o executável e o pip freeze lista dulwich==1.2.19
2026-10-25 Bloco 0 — Playwright usa o Edge do sistema (channel="msedge"), sem baixar o Chromium (decisão autônoma do Claude) playwright install chromium (download do navegador pela rede) msedge.exe existe em C:\Program Files (x86)\Microsoft\Edge\Application (verificado); playwright==1.64.1 está no venv; o uso será testado no bloco 4
2026-10-25 Bloco 0 — venv em Predictive Analytics for CRM Sales Performance\.venv, fora do repositório (decisão autônoma do Claude) venv dentro de solution/ Fica fora da pasta do projeto, então nunca entra no git; .venv\Scripts\python.exe existe e roda Python 3.11.9 com pandas 3.1.0
2026-10-25 Bloco 0 — PROMPT_AUTONOMO.md copiado junto com o kit, como evidência do pedido (decisão autônoma do Claude) Não copiar o arquivo de instruções Evidência do modo autônomo: o arquivo está na raiz do projeto e manda executar os blocos 0 a 6 (PROMPT_AUTONOMO.md, seção 3)
2026-10-25 Bloco 0 — Sem export de chat por bloco: sessão autônoma única, e o process log narrativo substitui o export (decisão autônoma do Claude) Export de chat após cada bloco Sessão autônoma sem interação do Rafael; o registro fica em process-log/NN_bloco-N.md, em docs/DECISIONS.md e no histórico de commits
2026-10-25 Bloco 0 — Checkpoints “espere meu ok” viram autoverificações registradas no log (pedido do Rafael em PROMPT_AUTONOMO.md, seção 3) Parar em cada checkpoint e esperar aprovação do Rafael (PROMPTS.md) PROMPT_AUTONOMO.md, seção 3, pede isso para 5 blocos com checkpoint (1, 2, 3, 4 e 6)
2026-10-25 Bloco 1 — Pergunta 1 do briefing (seção 9): quatro listas de ação em abas (Foque, Reative, Limpe, Qualifique); cada lista é ordenada pelo score, e Limpe e Qualifique pelo valor de tabela (decisão autônoma do Claude) Lista única priorizada com etiquetas Cada lista pede uma ação diferente. Numa lista única, os 1.291 Engaging parados (81% de 1.589) iriam para o fim e ninguém os limparia, e os 500 Prospecting não têm data, logo não têm score (process-log/outputs/bloco0_eda2.txt)
2026-10-25 Bloco 1 — Pergunta 2: a tela padrão é a do vendedor, com o seletor “Quem é você?” no topo e a escolha salva no endereço (#vendedor=...); o manager vê a mesma tela filtrada por manager ou região, mais uma “Carteira do time” só com contagens por lista, sem taxa de vitória (decisão autônoma do Claude) Tela padrão do manager; duas telas separadas O vendedor é o usuário principal (30 com deals contra 6 managers, CLAUDE.md). A taxa de vitória por vendedor é compatível com ruído (qui-quadrado p=0,26 em bloco0_eda2.txt) e não pode virar ranking de pessoas
2026-10-25 Bloco 1 — Pergunta 3: no Foque vale o maior valor esperado (chance × preço de tabela), e a urgência aparece à parte como “faltam X dias” (decisão autônoma do Claude) Menor idade com valor alto; ordenar só pela chance A idade já está dentro da chance, que cai de 50% para 7% entre os deals de até 30 dias e os de 61 a 90 (foto de 30/09, bloco0_conferencia.txt). O dinheiro é concentrado: 3 produtos dão 83,5% da receita ganha e o MG Special, 0,4% (bloco0_conferencia.txt), então só a idade trataria igual um MG Special e um GTX Pro. A justificativa “a chance é estável enquanto o deal é jovem”, sugerida no plano, não foi usada: a foto de 30/09 mostra queda dentro dos 90 dias
2026-10-25 Bloco 1 — Pergunta 4: o modo teste (backtest na interface) entra no MVP, e a lista Qualifique fica indisponível nele (decisão autônoma do Claude) Deixar o backtest só nos documentos É o que mostra à Head de RevOps o que o score teria recomendado e o que aconteceu, com custo de cerca de 30 minutos (briefing, seção 9). Os 500 Prospecting não têm engage_date, então a fila deles não se reconstrói numa data passada (bloco0_eda.txt)
2026-10-25 Bloco 1 — Fora do escopo: escrever no CRM ou integrar com ele, login, forecast financeiro, avaliação de desempenho de vendedores, score para Prospecting, tempo real, sugestão de preço ou desconto e notificações (decisão autônoma do Claude) Incluir qualquer um deles no MVP A dor é alocação de tempo (briefing, seção 1) e o experimento foi dimensionado para 4 a 6 horas de trabalho. Vendedor fora do score por p=0,26, e Prospecting sem data (500 deals) não tem chance estimável
2026-10-25 Bloco 1 — Prospecting vai para a lista Qualifique, sem score, ordenado por preço de tabela; deal sem conta aparece como “Conta não informada”, sem penalidade, e gera alerta de higiene de CRM (decisão autônoma do Claude) Dar score aos Prospecting por atributos; penalizar ou excluir deals sem conta 500 Prospecting sem data (US$ 1,07 mi de tabela) e 1.425 deals sem conta, todos abertos (1.088 Engaging e 337 Prospecting). Como variável, “sem conta” equivale a “nunca fechou” e vazaria o desfecho (bloco0_eda.txt)
2026-10-25 Bloco 1 — Critérios de sucesso verificáveis, com métrica primária fixada antes do código: receita ganha capturada pelo top 20% do score, que deve superar valor, recência e aleatório nos 4 cortes do backtest, com empate de até 1 ponto percentual contado como empate; AUC e captura de ganhos são reportadas, mas não decidem (decisão autônoma do Claude) AUC como métrica primária; critérios sem número, como “funciona bem” A dor é onde pôr a hora, não só acertar quem ganha. O plano de execução já esperava que a recência vá bem em AUC nos cortes de fim de trimestre, e o SCOPE registra que a métrica não foi escolhida às cegas. O ajuste único e a publicação honesta da falha vêm do pedido do Rafael em PROMPT_AUTONOMO.md, seção 3
2026-10-25 Bloco 1 — A concentração da receita nos 3 principais produtos é citada como 83,5% (decisão autônoma do Claude) Repetir os 83% do briefing A conta exata é 0,8352 (bloco0_conferencia.txt), que arredondada ao inteiro daria 84%; o briefing não foi editado
2026-10-25 Bloco 1 — O SCOPE cita o MG Special como o segundo produto em número de deals, e não o primeiro (decisão autônoma do Claude) Repetir “o maior volume de deals” do briefing (seção 7) Entre os fechados, o GTX Basic tem 1.436 deals e o MG Special 1.223 (bloco0_eda.txt, WIN RATE by product); o briefing não foi editado
2026-10-25 Bloco 1 — O SCOPE não fixa os limiares das listas: as faixas de 90 e 138 dias do briefing (110 Foque, 188 Reative, 1.291 Limpe) são ponto de partida, e os limiares saem dos dados no bloco 3 (decisão autônoma do Claude) Fixar Foque até 90 dias e Limpe acima de 138 138 dias é o maior ciclo fechado e provável artefato do gerador sintético (briefing, seção 8); uma regra “se idade > 138” é o que o briefing manda evitar
2026-10-25 Bloco 2 — 2a: o win rate de 82,1% do 1º trimestre de 2017 é artefato de recorte; o win rate por trimestre só aparece com a ressalva de que esse trimestre tem um mês (decisão autônoma do Claude) Tratar o 1º trimestre como comparável aos demais ou como sinal de sazonalidade As três condições do critério valem (facts.json, evidencia_2a_q1): os 647 fechamentos do 1º trimestre são todos de março; março (82,1%) fica a 1,9 pp da média de jun, set e dez (80,2%); os ciclos mínimos das coortes de out/2016 a fev/2017 (123, 96, 63, 36 e 5 dias) ficam a 2 a 7 dias do piso do recorte. Os trimestres seguintes dão 61,1%
2026-10-25 Bloco 2 — 2a: as fotos de treino começam em 31/03/2017; deals fechados em março/2017 não entram como observação de treino, e os engajados antes e ainda abertos em 31/03 entram; a foto de 28/02/2017 é só sensibilidade no bloco 3 (decisão autônoma do Claude) Começar o treino em 28/02/2017 31/03 é a primeira foto de fim de mês dentro do período observado de fechamentos (o primeiro fechamento é de 01/03/2017); 28/02 depende da hipótese não verificável de que o recorte removeu exatamente os fechados antes de 01/03. Transparência: o planejador (Opus) viu num protótipo que começar em 28/02 piora o modelo do corte de 30/06; a regra foi justificada a priori, mas escolhida depois de ver isso
2026-10-25 Bloco 2 — 2a: na condição (iii) do critério, a tolerância é de 7 dias entre o ciclo mínimo da coorte e o piso do recorte (decisão autônoma do Claude) Tolerância de 5 dias, que reprovaria a coorte de jan/2017 Escolhida depois de uma rodada exploratória que já mostrava folgas de 2 a 7 dias; a maior folga é 7, então a condição vale no limite. Por isso o facts.json traz um reforço sem tolerância (0% de fechamentos de até 14 dias nas coortes com piso de 14 dias ou mais, contra no mínimo 28% nas coortes sem recorte) e a decisão não depende só da condição (iii). Sete dias também é a mediana de ciclo dos fechamentos do 1º mês do trimestre
2026-10-25 Bloco 2 — 2b: os 5 vendedores sem deals aparecem no filtro sob o manager com o sufixo “(sem deals no CRM)” e estado vazio explicativo, e na “Carteira do time” com zeros e alerta; não recebem brief (o índice de briefs os lista); os 3 só com deals fechados mostram “sem deals abertos” (decisão autônoma do Claude) Excluir os 5 dos filtros; mostrá-los sem explicação 35 vendedores no cadastro, 30 com algum deal e 5 sem nenhum (um por time, menos o de Dustin Brinkmann); 27 com deal aberto em 31/12/2017; os 3 só com fechados são Donn Cantrell, Garret Kinder e Reed Clapper (evidencia_2b_vendedores). Excluir esconderia um dado de higiene de CRM
2026-10-25 Bloco 2 — 2c: o valor do deal aberto é sales_price; close_value só serve como desfecho no backtest (decisão autônoma do Claude) Valor do deal a partir da média de close_value por produto Nos 4.238 ganhos, a razão close_value / tabela tem média 0,996 (mín. 0,657, máx. 1,342); a média por produto fica entre 0,985 e 1,004 (faixa aceita: 0,95 a 1,05) e varia 0,5 pp entre trimestres (limite: 3 pp). Os 2.473 perdidos têm close_value 0 e nenhum ganho tem 0 (evidencia_2c_close_value)
2026-10-25 Bloco 2 — Os artefatos do gerador (regra Q/Q+1, fechamentos rápidos no 1º mês do trimestre, teto de 138 dias) ficam documentados no DATA_QUALITY e não são explorados pelo score (decisão autônoma do Claude) Usar mês do ano, posição no trimestre ou “idade > 138” como variável ou regra 3.522 fechados no trimestre do engajamento e 3.188 no seguinte, com 1 exceção; os 1.779 fechamentos do 1º mês do trimestre têm todos ciclo de até 14 dias; nenhum fechado passa de 138 dias em nenhuma coorte. Em CRM real isso não se repetiria (briefing, seção 8)
2026-10-25 Bloco 2 — has_account e qualquer categoria “desconhecido” de setor ou porte são proibidos como variável do score (decisão autônoma do Claude) Usar “sem conta” como sinal de deal parado Os 1.425 deals sem conta estão todos abertos (1.088 Engaging e 337 Prospecting): “sem conta” equivale a “nunca fechou” e seria um detector de deal aberto, sem prever nada (qualidade.sem_conta em facts.json). O bloco 3 testa a guarda
2026-10-25 Bloco 2 — Todo número da prosa de DATA_QUALITY e SCOPE é conferido contra facts.json por tests/test_docs_numbers.py; o teste ignora datas, anos, código, links, numeração de títulos e nomes de produto com dígito (o “500” de “GTK 500”) e só confere inteiros a partir de 100 (decisão autônoma do Claude) Conferir também inteiros pequenos (como “25 deals” e “30 vendedores”); afrouxar o teste para aceitar qualquer número Contagens abaixo de 100 se confundiriam com numeração de listas e constantes de desenho (como “4 cortes”); os fatos que o SCOPE cita abaixo de 100 estão em facts.json e em test_facts.py. Um token vale se algum valor de facts.json ou de ALLOWED_CONSTANTS, arredondado à precisão exibida, bater com ele: o teste prova que o número existe nos fatos, não que está no contexto certo
2026-10-25 Bloco 2 — Os AUCs de target encoding das categóricas ficam em facts.json sob a chave auc_categoricas_target_encoding_na_amostra_inflado, e o SCOPE os chama de inflados (decisão autônoma do Claude) Reportar esses AUCs sem rótulo O cálculo é na própria amostra (0,51 a 0,54, com o vendedor no topo) e contradiz a decisão 6 do CLAUDE.md se lido como resultado; os AUCs das numéricas (0,49 a 0,50) não têm esse problema
2026-10-25 Bloco 2 — age_days e cycle_days são números com NaN (e não inteiros anuláveis), age_days fica NaN quando o engajamento é posterior à data de referência, e deals.csv é gravado para uma única data de referência (decisão autônoma do Claude) Int64 com <NA>; idade negativa Comparações com NaN dão falso e não quebram máscaras booleanas nos blocos 3 e 4; idade negativa não tem sentido. O estado histórico (as_of) é reconstruído no bloco 3 a partir das datas, não de age_days
2026-10-25 Bloco 3 — Checagem de vazamento escrita antes do código (11 riscos, cada um com guarda e teste) e teste de mutação do futuro como prova central (decisão autônoma do Claude) Revisar o código e conferir só o horizonte S+H ≤ T A mutação embaralha tudo o que acontece depois de T e exige modelo e scores idênticos. Das 6 sabotagens, todas foram pegas (2 a 9 testes cada); a sabotagem sem a regra S+H ≤ T não foi pega pela mutação, só pelos testes de horizonte, por isso as duas guardas existem
2026-10-25 Bloco 3 — Curva de chance “platô + queda” com inclinação ≤ 0 e joelho numa grade de 5 em 5 dias (menor NLL; empate: menor joelho) (decisão autônoma do Claude) Logística segmentada sem restrição (protótipo: sobe com a idade); queda linear desde o dia zero Hoje: joelho 95, chance de deal novo 39,9%, meia-vida 11,3 dias. NLL 7.484 contra 7.787 (linear) e 8.323 (sem idade). Joelho identificado com margem de 5 a 10 dias (os vizinhos a ±5 dias custam de 0,6 a 6,9 de NLL)
2026-10-25 Bloco 3 — Limite de Limpe = maior ciclo entre os ganhos fechados até T, nunca menor que o joelho (decisão autônoma do Claude) Fixar 138 dias no código 138 em todos os cortes e hoje; derivado por corte, nunca do arquivo inteiro (sabotagem S3 falha 6 testes)
2026-10-25 Bloco 3 — Score 0 a 100 em escala logarítmica do valor esperado, entre o deal novo mais barato e o mais caro (decisão autônoma do Claude) Escala linear do valor esperado Preços vão de US$ 55 a US$ 26.768 (razão 487). Hoje, no Foque e Reative (298 deals), 220 teriam score ≤ 5 na escala linear (mediana 2) contra 30 na logarítmica (mediana 39)
2026-10-25 Bloco 3 — Preço mínimo e máximo do catálogo tirados de sales_price dos deals, não lidos de products.csv dentro de fit_model (decisão autônoma do Claude) Ler o catálogo dentro da função de ajuste Cada produto tem um único preço (teste) e os extremos são US$ 55 e US$ 26.768, iguais aos do catálogo (teste contra products.csv); a função fica pura e sem acesso a disco
2026-10-25 Bloco 3 — Q3 (bloco 1) respondida: a chance é plana até o joelho no agregado das fotos, mas cai cedo nas fotos de fim de trimestre; ordenação do Foque por valor esperado mantida com a justificativa trocada (decisão autônoma do Claude) Afirmar que a chance é estável em cada data Agregado: 35,5% a 44,8% de 0 a 89 dias, 15,0% em 105–119. Em 30/06 e 30/09: 51% para 22% e 48% para 7% entre 0–30 e 61–90 dias. Hoje, 69 dos 126 deals do Foque têm mais de 60 dias
2026-10-25 Bloco 3 — Explicação do Qualifique sem conta diz “isso não muda a ordem da lista” (nas outras listas, “isso não muda o score”) (decisão autônoma do Claude) Usar a mesma frase nas quatro listas Qualifique não tem score; a frase “não muda o score” soaria estranha ao lado de “Sem score”
2026-10-25 Bloco 3 — score_deals recusa modelo ajustado depois de T e recusa Prospecting antes do fim dos dados; open_at recusa foto depois do as_of da visão (decisão autônoma do Claude) Confiar na disciplina de quem chama Transformam vazamento acidental em erro: Prospecting no passado não é reconstruível (500 deals sem engage_date)
2026-10-25 Bloco 3 — Horizonte H = 90 dias (um trimestre) para o rótulo e para o Brier, sem testar outros valores (decisão autônoma do Claude) Otimizar H no backtest (30, 60, 120 dias) Toda janela de 90 dias contém exatamente um mês de fim de trimestre, o que neutraliza a sazonalidade do gerador (win rate de 49,0% no 1º mês e 80,7% no 3º, facts.json). H foi escolhido conhecendo o protótipo; a sensibilidade a H não foi medida e está nas Limitações do SCORING
2026-10-25 Bloco 3 — Primeira foto de treino em 31/03/2017, mantendo 28/02/2017 só como sensibilidade (decisão autônoma do Claude) Começar em 28/02 Com 28/02 o critério passaria do mesmo jeito (receita média do score 59,0% contra 61,1%), mas o corte de 30/06 perde 7,4 pp e o joelho vai de 70 para 125 dias (backtest_metrics.json, sensibilidade_2017-02-28). A regra foi justificada a priori no bloco 2, mas escolhida depois de o planejador ver o protótipo
2026-10-25 Bloco 3 — Métrica primária: receita capturada no top 20%; o score precisa superar valor, recência e a média e o p95 de 200 aleatórios nos 4 cortes, com empate de até 1 pp (decisão autônoma do Claude) AUC ou captura de ganhos como métrica primária A dor é onde pôr a hora (SCOPE). Resultado: PASSOU, com margem de 9,2 a 17,7 pp sobre o melhor baseline. A recência ganha em AUC (0,70 contra 0,64 na média) e em captura de ganhos (29,8% contra 26,3%) em 3 dos 4 cortes, o que fica registrado no SCORING. O critério foi escrito antes do código do backtest, mas não às cegas (o plano trazia valores do protótipo)
2026-10-25 Bloco 3 — Ajuste único (faixas de 15 dias, pseudo-contagem 20, PAVA) implementado e testado, mas não aplicado (decisão autônoma do Claude) Rodar o ajuste mesmo com o critério aprovado, para comparar A regra pré-registrada só o autoriza se o critério falhar; o critério passou na primeira rodada (criterion.adjustment_applied = false). Rodá-lo por curiosidade abriria uma segunda tentativa não prevista
2026-10-25 Bloco 3 — Nenhum atributo entra no score (produto, região, setor e porte); o teste usa L2 só nos coeficientes do atributo, com uma função de ajuste própria em validate.py (decisão autônoma do Claude) Incluir região (parecia ajudar no treino) ou usar fit_logistic com L2 em todos os coeficientes A regra exige melhora do log-loss em todos os cortes e nenhuma piora da receita. Região melhora o log-loss no treino (Δ de −0,0191 a −0,0305) mas piora em 3 dos 4 cortes fora da amostra (até +0,0645); produto, setor e porte falham em ao menos um corte. fit_logistic penaliza a inclinação da idade também, o que mudaria a base de comparação
2026-10-25 Bloco 3 — Censura: deals ainda abertos em 31/12/2017 contam como “não ganho”; a sensibilidade “só resolvidos” é reportada e a leitura do SCORING diz que a vantagem sobre o valor vem de identificar zumbis (decisão autônoma do Claude) Descartar os abertos do backtest principal; tratar o aberto como desfecho desconhecido Só entre os resolvidos o score não bate o valor (49,7% contra 49,9%, 48,5% contra 48,8%, 48,6% contra 49,1%, 48,2% contra 48,2% de receita no top 20%). Abertos em 31/12 que ainda podem fechar (dentro do limite de Limpe): 0, 0, 81 e 183 nos 4 cortes
2026-10-25 Bloco 3 — Risco do Foque em fim de trimestre medido e reportado sem mexer no modelo: deals do Foque com 61 dias ou mais contra os de até 30 dias, por corte (decisão autônoma do Claude) Corrigir a curva por posição no trimestre Diferença no ganho em 90 dias: −17,4 pp (30/06), +19,2 pp (31/07), +21,3 pp (31/08) e −41,3 pp (30/09), todos com IC fora de zero. Explorar a posição no trimestre é explorar artefato do gerador (decisão do bloco 2). Hoje é fim de trimestre: 69 dos 126 do Foque têm 61 dias ou mais
2026-10-25 Bloco 3 — O verificador de números de scorer.docs passa a entender “pp” e “pontos percentuais” como a fração × 100, e RANDOM_SEEDS - 1 (199) entra em ALLOWED_CONSTANTS (decisão autônoma do Claude) Escrever as diferenças em fração (0,126) ou tirar os pp da prosa As diferenças do backtest estão guardadas como fração, e “12,6 pp” não casaria com nenhum valor. Teste novo: test_checker_reads_percentage_points_as_fraction_times_100
2026-10-25 Bloco 4 — Contrato do data.js fechado em app/data-contract.md: label por snapshot, backtest.{metrics, criterion_text, notes}, outcome_summary só no modo teste, frações (0 a 1) em todo o arquivo (decisão autônoma do Claude) só rows + headline, como no plano a interface não escreve nenhum número à mão (títulos de tabela e ressalvas vêm do build); data.js real com 3.886.606 bytes (meta: menos de 4 MB)
2026-10-25 Bloco 4 — Estado da tela no location.hash (vendedor, manager, regiao, modo, aba) com replaceState (decisão autônoma do Claude) localStorage; um hash novo por clique funciona em file:// e no GitHub Pages, o link é compartilhável e recarregar restaura (checado por Playwright)
2026-10-25 Bloco 4 — Aba padrão = 1ª lista com deals do filtro, não sempre Foque (decisão autônoma do Claude) Foque fixo o vendedor com mais deals abertos (Darcel Schlecht, 194) tem 0 em Foque e 0 em Reative: a tela inicial seria vazia
2026-10-25 Bloco 4 — “Carteira do time” só com contagens, em ordem alfabética, sem taxa de vitória (decisão autônoma do Claude) taxa de vitória por vendedor; ordenar por Limpe decisão 4 do CLAUDE.md: a diferença entre vendedores é compatível com ruído (qui-quadrado p = 0,26)
2026-10-25 Bloco 4 — O resumo de resultado do modo teste é do snapshot inteiro e não muda com os filtros (decisão autônoma do Claude) recalcular por vendedor ou manager evita taxa de ganho por vendedor com poucos deals; o desfecho de cada deal continua visível no card
2026-10-25 Bloco 4 — Vendedor sem deals: a frase de ação vira aviso e as abas e a instrução somem (decisão autônoma do Claude) mostrar 4 abas com zero no PNG da fixture a explicação ficava abaixo da dobra do celular, atrás de 4 zeros
2026-10-25 Bloco 4 — check_app.py com checagens extras além de (a) a (f) e testado por mutação (decisão autônoma do Claude) só as checagens do plano 12 mutantes do app e 4 do data.js, todos reprovados pelo check; a varredura de número à mão sustenta a regra “nenhum número escrito à mão”
2026-10-25 Bloco 4 — Tema escuro por prefers-color-scheme e cores por tokens com contraste AA verificado por script (decisão autônoma do Claude) só tema claro custo baixo; 35 pares de cor acima de 4,5:1 (texto) e 3:1 (bordas), nos dois temas
2026-10-25 Bloco 4 — build.py em funções puras, com o formato do backtest_metrics.json isolado em um bloco adaptador e assert do contrato e das métricas dentro do build (decisão autônoma do Claude) ler o JSON em qualquer ponto; conferir só no teste o resumo de hoje (126 / 172 / 1.291 / 500) e as listas dos cortes de teste precisam bater com backtest_metrics.json, senão o build não grava nada; uma mudança no formato do JSON mexe só no adaptador
2026-10-25 Bloco 4 — Desfecho Perdido sai com close_value nulo e snapshot de teste só existe com data anterior à referência (decisão autônoma do Claude) gravar o 0 do CRM; aceitar corte igual à referência o CRM grava 0 nos perdidos, que não é valor (a receita ganha soma só os Ganho); um corte na própria referência teria a mesma data de “hoje” e quebraria a chave do hash
2026-10-25 Bloco 4 — Briefs só para quem tem deal aberto (27 de 35), com o índice listando os 5 sem deals e os 3 só com fechados; Foque e Reative mostram a 1ª e a 3ª frases (decisão autônoma do Claude) brief vazio para os 8 decisão 2b do bloco 2; as duas frases escolhidas são a chance por idade e o prazo (a 2ª repete o valor, que já está no cabeçalho do item)
2026-10-25 Bloco 4 — As ressalvas do painel “Teste no passado” são calculadas do JSON (recência ganha em AUC em 3 de 4 cortes; entre os já resolvidos o score empata com o valor; Foque com 61 dias ou mais com chance menor nos fins de trimestre), sem número escrito à mão (decisão autônoma do Claude) texto fixo no código os números mudam se o backtest mudar; o texto sai do mesmo arquivo que o SCORING
2026-10-25 Bloco 4 — Três atritos corrigidos na interface depois da passada T1 a T5 (decisão autônoma do Claude): (1) filtros compactos e abas mais baixas no celular, (2) a chance sai da linha do preço e vai para a linha do prazo, (3) card em duas colunas a partir de 900 px só aumentar o espaçamento; esconder filtros num menu com o vendedor escolhido em 390 px, a linha-instrução começava em y ≈ 760 de 844 (1º card fora da tela) e o 1º card passou a começar em y = 692, com a 1ª frase visível; a chance caía sozinha numa linha; em 1280 px a frase corria por 130 caracteres e o detalhe deixava um vazio (PNGs antes_ e depois_ em process-log/screenshots/)
2026-10-25 Bloco 4 — O backtest do build vale para config.DEFAULT_REFERENCE_DATE; com outra data de referência o assert de “hoje contra backtest_metrics.json” acusa a divergência em vez de gerar um data.js incoerente (decisão autônoma do Claude) recalcular o backtest para qualquer data validate.run_backtest fixa 31/12/2017 em hoje e nos “só resolvidos”; parametrizar isso fica para depois (pendência)
2026-10-25 Bloco 5 — README no formato exato do modelo de README do cenário, com “Como rodar (setup)” como subseção de Solução e a ferramenta de verificação opcional (decisão autônoma do Claude) Pôr o setup num título próprio fora da Solução O modelo permite “o formato que melhor comunicar” dentro da Solução; manter os títulos obrigatórios e a ordem permite teste automático (test_readme.py)
2026-10-25 Bloco 5 — Resultados do README e do MODEL_CARD saem de cinco blocos AUTO novos (readme-achados, readme-backtest, readme-hoje, mc-desempenho, mc-recalibracao); os dois arquivos entram em COVERED_DOCS (decisão autônoma do Claude) Digitar os números na prosa Cada número é regenerado do JSON e a prosa passa pelo verificador; a mutação de 5 números reais é acusada
2026-10-25 Bloco 5 — Recalibração por gatilho de X = 10 pp (config.RECALIBRATION_SHIFT_PP), só em faixas com 100 deals ou mais (decisão autônoma do Claude) Recalibrar só a cada trimestre; X = 5 pp No backtest, 7 de 24 faixas (corte x idade) com 100 deals ou mais ficaram a mais de 10 pp da taxa observada; com 5 pp o alerta quase sempre acenderia. X é parâmetro, não resultado
2026-10-25 Bloco 5 — Model card em 8 seções, com “Uso NÃO pretendido” (avaliar vendedores, forecast, encerrar deals automaticamente) e riscos com mitigação (decisão autônoma do Claude) Model card só com métricas O ângulo de governança do Rafael (fase 0) pede limites e responsabilidade, não só desempenho
2026-10-25 Bloco 5 — “Resultados” diz “a recência ganha em AUC em 3 dos 4 cortes”, não “nos fins de trimestre” (decisão autônoma do Claude) Repetir a frase da tarefa 31/08 não é fim de trimestre e a recência também ganha lá (0,66 contra 0,63)
2026-10-25 Bloco 6 — Foque: a 1ª frase do card passa a ser a que diferencia o deal (produto, preço de tabela, valor esperado, dias de janela boa); a frase genérica da curva vai para a 2ª (decisão autônoma do Claude) Mexer na curva ou no score A crítica era de interface; o modelo é congelado pela regra do bloco 6
2026-10-25 Bloco 6 — Limpe: a 2ª frase vira ação concreta (perguntar ao cliente; se não quer, marcar Lost; se quer, atualizar e mover para Reative ou Foque) (decisão autônoma do Claude) Manter “confirme e encerre ou atualize” Sem pergunta nem passo no CRM a lista Limpe virava faxina sem roteiro
2026-10-25 Bloco 6 — Interface: aviso “Escolha seu nome” na primeira tela; aba padrão Qualifique (e frase de ação citando a receita nova) quando Foque e Reative estão vazios e Qualifique > 0; faixa do modo teste explica que os números são do time inteiro (decisão autônoma do Claude) Esconder a visão do manager; mostrar taxa de vitória por vendedor A decisão 4 do CLAUDE.md proíbe taxa por vendedor; a visão do manager continua
2026-10-25 Bloco 6 — Platô do Foque: novo bloco AUTO foque-plato-sinal (README e SCORING seção 10) mostra que a diferença 61+ contra 0 a 30 dias troca de sinal entre cortes; a curva NÃO foi alterada (decisão autônoma do Claude) Inclinar a curva dentro do platô Sem direção estável, inclinar seria ajuste pós-hoc depois de ver o backtest
2026-10-25 Bloco 6 — README: Executive Summary reescrito sem jargão (sem AUC, win rate, bootstrap) e sem a frase “50% contra 0%”; separação “decisões do Rafael (fase 0)” × “execução autônoma do Claude” no Process Log (decisão autônoma do Claude) Manter o resumo técnico Leitura para a Head de RevOps; nenhuma intervenção humana foi inventada
2026-10-25 Bloco 6 — Pós-revisão 2: aviso do Foque com 61+ dias aparece na linha-instrução da aba Foque, a partir de backtest.notes (nota “No Foque, …”), sem número escrito à mão (decisão autônoma do Claude) Frase extra em explain.py por deal A opção do explain.py exigiria passar o JSON de métricas para cada deal e mudar a assinatura de explain_deal; a nota já existe no data.js e deixa o aviso visível na aba de hoje
2026-10-25 Bloco 6 — Pós-revisão 2: card com chance entre 0 e 0,5% mostra “<1%” (derivado de pct0(0.01), porque o check estático proíbe porcentagem literal), coerente com o “menos de 1%” do explain.py (decisão autônoma do Claude) Manter “chance 0%” O card e o texto se contradiziam
2026-10-25 Bloco 6 — Pós-revisão 2: README, linha do revisor em “Ferramentas usadas”, aponta para process-log/06_revisao-independente.md com “nota média entre três e quatro de cinco” por extenso (decisão autônoma do Claude) Escrever “3,6” test_docs_numbers só aceita números que saem dos fatos; 3,6 vem de notas do revisor, não do CSV
2026-10-25 Bloco 7 — Pedido do Rafael: alinhar o Process Log à governança de IA, e reforçar as evidências. A seção “O que eu adicionei” sai do rascunho e passa para a primeira pessoa Manter a narrativa de “execução autônoma” e o rascunho As duas revisões independentes apontaram o process log como o ponto mais fraco; a narrativa omitia quem desenhou as regras e os controles
2026-10-25 Bloco 7 — Export da sessão de orquestração convertido por script (mensagens com horário, sem e-mail e sem saídas de ferramentas) em process-log/chat-exports/ (decisão autônoma do Claude, a pedido do Rafael) Commitar o zip bruto (13 MB, com transcrições de subagentes) ou não ter export Evidência legível das intervenções humanas, sem dado pessoal; o zip completo fica com o Rafael
2026-10-25 Bloco 7 — Mapa de evidências em process-log/README.md, por pergunta sobre o processo (decisão autônoma do Claude) Deixar as evidências espalhadas O enunciado do cenário pede evidência de processo; o mapa liga cada pergunta ao arquivo
2026-10-25 Bloco 7 — Rótulo dos erros da execução trocado de “autocorreção na execução autônoma” para “execução delegada (pego pelos controles)” (decisão autônoma do Claude) Manter o rótulo antigo Descreve o mecanismo real: os erros foram pegos pelos controles exigidos no kit (verificador de números, testes de vazamento, critério pré-registrado), não por acaso
2026-10-26 Correção após revisão do Rafael — Curva de chance v2: faixas de idade de 15 dias, regressão isotônica não crescente (PAVA), interpolação linear, monotônica desde o dia 0; a v1 (platô + queda) fica no código só para comparação (executor Sonnet, a pedido do Rafael) Manter o platô com joelho menor; logística sem platô O Rafael usou a página publicada como vendedor e viu a mesma chance de 0 a 95 dias, o que contradiz o briefing (50%, 34%, 7% e 0% por idade em 30/09). O desenho b0 + b1·max(0, idade − joelho) impõe chance constante antes do joelho; a isotônica deixa os dados dizerem a forma
2026-10-26 Correção após revisão do Rafael — Cada corte T treina só com as fotos da mesma fase do trimestre que T (mês 1, 2 ou 3), todas com S + 90 dias <= T e S >= 31/03/2017; sem foto da fase, cai para todas as fotos elegíveis e registra o caso (não ocorreu) Empilhar todas as fotos, como na v1 Fotos de fim de trimestre (mar, jun, set) e de meio de trimestre têm padrões opostos e se cancelam: 61 a 90 dias ganha 15,9% nas primeiras e 48,3% nas segundas, e juntas dão 37,3% (tabela de diagnóstico no SCORING, seção 0). Custo: três dos quatro cortes ficam com uma foto de treino
2026-10-26 Correção após revisão do Rafael — Sem pseudo-contagem na v2 (config.V2_PSEUDO_COUNT = 0): o PAVA usa a taxa observada e pesos = número de casos. Reaproveitei do ajuste único as faixas de 15 dias, o PAVA e a interpolação, mas não os 20 deals de pseudo-contagem Usar a pseudo-contagem do ajuste único como estava Medido antes de decidir: com 20 deals por faixa a cauda sem nenhum ganho vira 26,9% (30/06) a 13,1% (30/09) aos 730 dias e o Foque dos cortes de 30/06 e 31/07 nunca termina; a AUC cai para 0,54 a 0,59. A sensibilidade fica reportada no SCORING, seção 7
2026-10-26 Correção após revisão do Rafael — Limiares a partir da curva: Foque = até a última idade com chance >= metade da de um deal novo (FOQUE_HALF_FRACTION); Limpe = chance < 2% (LIMPE_MIN_CHANCE, parâmetro novo) ou idade acima do maior ciclo já ganho até T, o que chegar primeiro; Reative = o que fica no meio. Hoje: Foque 60, Reative 66, Limpe 1.463 (antes 126, 172 e 1.291) Manter as faixas fixas do briefing (90 e 138 dias) ou o joelho da v1 O limite precisa sair da curva, não de um “se idade > 138”. O Limpe cresce porque a chance chega a 2% aos 95 dias, antes do teto de 138; os 172 deals que passam de Reative a Limpe têm US$ 392.775 de tabela
2026-10-26 Correção após revisão do Rafael — Métrica nova de ordem dentro do Foque: Engaging abertos em T com idade <= 90 dias, mesma população para score v1, score v2, valor e recência (AUC e receita no top 20%), nos 4 cortes e na média Medir a ordem só dentro da categoria Foque de cada curva Populações diferentes por método tornariam a comparação injusta. Resultado honesto: receita média de 52,5% no v2, 49,7% no v1 e 49,1% no valor, AUC de 0,52; o ganho está só no corte de 30/09
2026-10-26 Correção após revisão do Rafael — O critério pré-registrado (mesma regra, mesmos cortes e baselines) é reportado para a v2 e para a v1, e o texto declara a v2 como mudança pós-backtest pedida pelo Rafael depois de revisar a ferramenta. A v2 passa (62,5% de receita média contra 61,1% da v1), mas não é teste às cegas Tratar a v2 como se fosse o resultado do pré-registro; reabrir o critério A v2 foi desenhada sabendo o que o backtest da v1 mostrou. A melhora está em um corte (30/09), e nos de 30/06, 31/07 e 31/08 a v2 fica menos de um ponto percentual abaixo da v1; está escrito assim no SCORING (seções 6 e 9), no MODEL_CARD e no README
2026-10-26 Correção após revisão do Rafael — Frase principal de cada card (Foque, Reative e Limpe) passa a ser comparativa, com números do modelo do corte: “Deals com 81 dias fecharam 7% das vezes; os novos, 50%.”. A explicação continua com 2 a 4 frases e os números passam por fmt Manter “Aberto há N dias… janela boa por mais M dias” como 1ª frase É o que o vendedor precisa ler para entender por que o deal velho ficou para trás; o prazo e o valor passam para as frases seguintes
2026-10-26 Correção após revisão do Rafael — Interface: sai a caixa “Atenção” do Foque; abas, frase de ação e, no modo teste, os resumos por lista (n, ganhos, receita) seguem os filtros e são recalculados dos deals. Com um vendedor escolhido o resumo mostra só contagens, sem porcentagem Resumos fixos do time inteiro; porcentagem também por vendedor Os números exibidos precisam bater com o filtro ativo, mas a decisão 4 do CLAUDE.md proíbe taxa de vitória por vendedor (diferença compatível com ruído). O seletor já era agrupado por manager (optgroup); só ganhou checagem
2026-10-26 Correção após revisão do Rafael — O teste de atributos (produto, região, setor, porte) não foi repetido sobre a v2 e a auditoria “VAZADO” passou a usar a fase do trimestre do corte (decisão autônoma do Claude) Refazer o teste de atributos com a curva por faixas O desenho do teste usa um joelho fixo, que a v2 não tem; fica como limitação. A auditoria mostra que o vazamento custa mais na v2 (+7,2 pp em 30/09, contra frações de ponto na v1), o que justifica manter a mutação do futuro como prova central
2026-10-26 Visões e design (executor Sonnet, a pedido do Rafael) — Visões por perfil na página estática (opção A): vendedor vê só a própria carteira, manager vê o time. A opção A foi escolhida por fricção zero para quem abre a ferramenta (abre com duplo-clique e no GitHub Pages, sem login, sem servidor e sem banco). A opção B (Supabase com Auth/SSO e Row-Level Security) ficou mapeada, só em documento, em docs/ARQUITETURA_PRODUCAO.md, com SQL marcado “não executado — validar” e migração estimada B desde já (Supabase) ou A sem plano de produção A separação de A é de experiência, não de segurança: o data.js contém todos os deals. Isso está dito na tela de entrada, no “Como funciona”, no README e no model card. B exige login, banco e SSO que quem abre a página pública não teria como usar
2026-10-26 Visões e design (executor Sonnet, a pedido do Rafael) — Tela de entrada “Quem é você?” com perfil no hash (#perfil=vendedor&nome=..., #perfil=manager&nome=...). O localStorage só lembra o último perfil (botão “Continuar como”; abrir sem hash nunca entra sozinho) e tem try/catch. Acrescentei um terceiro destino, “Visão completa (RevOps e avaliação)” (#perfil=revops), que é a tela anterior com todos os filtros; endereços antigos (#vendedor=, #manager=, #regiao=) abrem nela (desvio do pedido, que citava só vendedor e manager) Só duas visões; apagar a tela com filtros A arquitetura de produção fala em três papéis (vendedor, manager, RevOps), quem revisa a ferramenta precisa ver a carteira inteira e o modo teste, e a visão completa preserva as checagens que já existiam sem afrouxá-las
2026-10-26 Visões e design (executor Sonnet, a pedido do Rafael) — Mapa do time do manager: uma linha por vendedor com vivos (Foque), esfriando (Reative) e zumbis (Limpe), mais Qualifique, e o valor de tabela de cada grupo; ordenável por nome e por contagem; ordem padrão alfabética; “higiene de carteira, não desempenho”; nenhuma taxa de vitória nem ranking (decisão 4 do CLAUDE.md). A carteira de um vendedor abre em modo leitura (sem botões de ação), com a pauta do 1:1: 3 deals para empurrar, 3 para resgatar e quantos limpar, com botão “copiar” (clipboard com plano B) Coluna de win rate por vendedor; ranking por zumbis com cor de bom/ruim A diferença entre vendedores é compatível com ruído (p=0,26). Contagem de zumbis é higiene do CRM, que o vendedor resolve confirmando com o cliente. O teste confere que o mapa não tem %
2026-10-26 Visões e design (executor Sonnet, a pedido do Rafael) — Ações do vendedor (“contatei”, “agendei”, “encerrar no CRM”) no localStorage, com o aviso “salvo só neste navegador”; só na foto de hoje (não no modo teste, nem na visão do manager). O progresso conta deals de Foque e Reative tratados. Simulador “e se eu fechar este?”: o valor esperado da semana (soma do valor esperado de Foque e Reative) troca, para cada deal simulado, o valor esperado pelo preço de tabela; a contagem anima (sem animação com prefers-reduced-motion). Tudo derivado do data.js; o motor e o build.py não foram tocados Mandar as ações para o CRM; guardar o simulador Não há backend. A marcação que some ao limpar o navegador é um limite declarado. O simulador mostra o impacto sem prometer receita
2026-10-26 Visões e design (executor Sonnet, a pedido do Rafael) — Identidade visual da primeira versão, marinho e dourado, depois substituída pelo tema atual (ver process-log/09_tema-azul.md) (marinho #001F35/#031A26, dourado #B9915B, off-white #F5F4F3, Manrope, Libre Baskerville itálico, botão primário dourado de raio 10px). NÃO usa logotipo nem marca de terceiros na interface; o nome continua “Lead Scorer”. O dourado é só ação primária e marca, nunca status; os status são verde-sálvia (Foque), cobre (Reative), cinza-azulado (Limpe) e azul-aço (Qualifique), sempre com ícone e rótulo. Contraste AA validado nos dois temas por script (tools/contrast_table.py, tabela em docs/DESIGN.md) Copiar a paleta e o logotipo; dourado como cor de status A ferramenta é do Rafael, não da empresa; copiar marca induziria à ideia de produto oficial. Dourado em status competiria com a ação primária
2026-10-26 Visões e design (executor Sonnet, a pedido do Rafael) — Fontes auto-hospedadas (Manrope variável e Libre Baskerville itálico, OFL, em solution/app/fonts/ com as licenças), @font-face relativo, ícones em sprite SVG dentro do index.html. Sem CDN, sem build; funciona em file:// e no Pages. O axe-core 4.9.1 (MPL-2.0) fica em solution/tools/vendor/, só para os testes Google Fonts por CDN; npm para o axe A regra do projeto é abrir sem internet e sem build. Não há Node na máquina
2026-10-26 Visões e design (executor Sonnet, a pedido do Rafael) — Ferramentas de qualidade: o @axe-core/playwright foi trocado pelo axe.min.js injetado pelo Playwright em Python (tools/check_views.py); Lighthouse não executado (sem Node); skill frontend-design indisponível nesta sessão; Figma: referências usadas só como inspiração, arquivo não lido (não havia link de arquivo duplicado). Registrado como limitação Fingir que rodou o Lighthouse; estimar as notas Nota que não foi medida não entra no relatório
2026-10-26 Visões e design (executor Sonnet, a pedido do Rafael) — tools/check_app.py adaptado às telas novas sem afrouxar nada: por padrão as páginas abrem em perfil=revops (onde ficam filtros e carteira que ele testa); a vista “inicio” passou a ser a tela de entrada; “1:1” (nome do ritual) é a única exceção na checagem de número escrito à mão; a checagem de contraste passou a ler os tokens do tema claro e dos dois blocos do escuro (e exige que sejam iguais) com 56 pares. Os testes novos estão em tools/check_views.py, fora do pytest padrão Reescrever o check_app do zero; relaxar a checagem de números à mão As checagens de console, de totais contra o SCORING e de contagens por filtro continuam valendo e passam
2026-10-26 (versão adaptada) Export integral da conversa de orquestração retirado desta versão pública; chat-exports/LEIA-ME.md reescrito (Claude Sonnet, subagente executor) Editar as falas do Rafael no export para generalizar o contexto Editar as falas alteraria a evidência; o registro do processo fica nos logs por bloco, no DECISIONS e no histórico do git, e os links que apontavam para o export foram ajustados
2026-10-26 (versão adaptada) Contexto original generalizado nos logs, no kit e nos documentos: os termos de avaliação do contexto original viram “revisor independente”, o desafio vira “experimento” e os passos de entrega viram “publicar no repositório” (Claude Sonnet, subagente executor) Apagar ou reescrever episódios; deixar o contexto original Trocar o contexto sem mexer nos fatos: métodos, números, decisões e erros registrados são os mesmos. Citações literais de saídas de ferramentas e caminhos foram generalizadas só nos nomes (ex.: “pasta do projeto”)
2026-10-26 (versão adaptada) README reescrito como README de projeto (aviso, nota, resumo, “Experimente”, “Como rodar”, “Reaproveitamento em outros contextos”, “Sobre o autor”) e test_readme.py reescrito para a nova estrutura, sem afrouxar as checagens (Claude Sonnet, subagente executor) Adaptar o README antigo por troca de palavras A estrutura antiga existia para um formato de entrega que não vale mais; os blocos AUTO e os números ficaram idênticos e continuam conferidos por test_docs_numbers.py
2026-10-26 (versão adaptada) Teste de guarda tests/test_public_repo.py: varre .md, .py, .js, .html e .css e falha se aparecer um termo do contexto original (Claude Sonnet, subagente executor) Conferir na mão, uma vez Um teste impede que o contexto volte em edições futuras. Fora da varredura ficam solution/tools/vendor/ e os dados brutos; o id de deal do dataset que contém as letras do termo curto não conta, porque o teste só pega a palavra inteira em maiúsculas
2026-10-26 (versão adaptada) A constante de configuração com o nome do contexto original foi renomeada para PROJECT_DIR em scorer/config.py e nos testes (Claude Sonnet, subagente executor) Manter o nome antigo O nome só fazia sentido no contexto original; o valor (a raiz do repositório) não mudou
2026-10-26 (versão adaptada) LICENSE (MIT para o código, em nome de Rafael Pereira, 2026, com nota de que os dados são CC0 e as fontes OFL) e .gitignore (__pycache__/, *.pyc, .pytest_cache/) acrescentados (Claude Sonnet, subagente executor) Publicar sem licença Repositório público autônomo precisa dizer sob que termos o código pode ser usado
2026-10-26 Tema visual — tema azul: azul #0021AF para ação e marca, Poppins auto-hospedada (OFL), botões em pílula. Sem logotipo, sem marca de terceiros e sem nada parecido com login; rodapé de aviso obrigatório, conferido por check_aviso_demo (decisão autônoma do Claude, a pedido do Rafael) Copiar logo e elementos institucionais Uma página pública com cara de produto de uma instituição pode ser confundida com canal oficial; o aviso de demonstração deixa claro que não é
2026-10-26 Tema visual — o azul principal fica reservado a ação e marca; os status usam verde (Foque), âmbar (Reative), neutro quente (Limpe) e violeta (Qualifique), sempre com cor, ícone e rótulo (decisão autônoma do Claude) Status em tons de azul Evita que um botão e um status tenham a mesma cara e mantém o status legível sem depender da cor
2026-10-26 Tema visual — o destaque editorial passa a Poppins 700 em #008FF9, usado só sobre o bloco escuro e em elementos gráficos (decisão autônoma do Claude) #008FF9 como cor de texto sobre branco Sobre branco ele fica em cerca de 3,3:1, abaixo do mínimo AA para texto
2026-10-26 Tema visual — no tema escuro, o primário usa um azul clareado derivado (#2D55FF) e o bloco de resumo fica em #101C60 (decisão autônoma do Claude) Usar #0021AF também no escuro #0021AF quase some sobre o marinho #090E29; com os derivados, todos os pares passam em AA
2026-10-26 Tela de entrada — “Visão de demonstração” e “Não é um login: não existe conta nem senha”; o link da visão completa vira “Ver a carteira completa (RevOps)” (decisão autônoma do Claude) Manter o texto anterior Deixa explícito que a escolha de perfil é de experiência, não de autenticação
2026-10-26 Remoção das referências ao banco (versão adaptada, a pedido do Rafael) — aviso reduzido a ‘Projeto pessoal de demonstração com dados públicos e fictícios (dataset CRM Sales Predictive Analytics, Kaggle, CC0).’; log e pasta de screenshots renomeados para tema-azul; paleta descrita só como tema azul, sem citar a origem; teste de guarda passa a proibir o nome do banco Manter o nome do banco só no aviso O público já sabe que o projeto não envolve dados do banco; a menção só gerava ruído