| 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 |