Skip to content

feat(cockpit): a manchete do herói passa a falar do card que o dono abriu - #37

Merged
BarryBits merged 1 commit into
mainfrom
feat/cockpit-leitura-por-metrica
Jul 29, 2026
Merged

feat(cockpit): a manchete do herói passa a falar do card que o dono abriu#37
BarryBits merged 1 commit into
mainfrom
feat/cockpit-leitura-por-metrica

Conversation

@BarryBits

Copy link
Copy Markdown
Owner

O que estava errado

Com Receita EM RISCO e Resultado NA ROTA, clicar no card Resultado trocava o gráfico, o valor e o gap — mas o chip continuava vermelho e o texto continuava falando da receita. A tela se contradizia.

Não era wiring esquecido: montarPacing produz um veredito, da pior dimensão, e o herói o imprimia fixo junto com pacing.zonaGeral, enquanto tudo abaixo lia pacing[selecionada]. Veredito global responde "como vai o conjunto?" — que não é a pergunta de quem acabou de escolher uma métrica.

lerMetrica — leitura da métrica + amarração com as outras

Puro e determinístico, no motor. Sem IA: nenhum número novo nasce ali.

  • Manchete — onde esta métrica está contra o plano e onde o ano fecha no ritmo dela. O chip passa a ser a zona dela; o sinal do conjunto vira marca discreta ao lado (conjunto: EM RISCO) e só aparece quando difere.
  • Amarração — as 4 metas não são independentes (margem é resultado÷receita; DL/EBITDA depende do EBITDA). A relação receita×resultado dá 4 histórias e cada card a lê do seu ponto de vista.

Copy real da Vertímetal (números dos prints):

Card Manchete + amarração
Receita (risco) A receita soma R$ 3.142.570 em 6 meses fechados, R$ 285.261 abaixo do que o plano de virada previa até aqui. No ritmo atual, o ano fecha em R$ 17.967.411, R$ 1.630.959 abaixo da meta.
Vender abaixo do plano não derrubou o fim da linha: o resultado está R$ 397.000 acima do previsto e a margem, 14.2 p.p. acima. A perda é de volume, não de eficiência.
Resultado (na rota) O resultado soma R$ 331.347 em 6 meses fechados, R$ 397.000 acima do que o plano de virada previa até aqui.
Este resultado foi feito com MENOS receita do que o plano previa — o ganho está vindo de eficiência, não de volume.
Margem (na rota) A margem está em 10.5%, 14.2 p.p. acima do nível previsto. Mantendo este nível, o ano fecha em 10.5% — dentro da meta de -2.0%.
Esta margem veio de eficiência, não de volume: a receita está R$ 285.261 abaixo e mesmo assim o resultado está R$ 397.000 acima.

Não termina em "o que fazer" de propósito: pela Régua R4 (v1.2) a ação-raiz mora só no HTR.

Bug achado no caminho: projeção com sinais opostos

projecaoFim projetava o fim do ano pela razão realizado/esperado, sem guarda. Em recuperação isso quebra: esperar −R$ 65.653 e realizar +R$ 331.347 dá razão −5,05, e o objetivo (−R$ 392.673) vira +R$ 1,98 mi. Sinal invertido, apresentado como certeza — e não só no texto: o gráfico desenhava a curva pontilhada até esse ponto e escrevia "no ritmo R$ 1,98 mi". Já era alcançável em produção abrindo o card Resultado da Vertímetal.

projecaoAnoFim agora devolve null quando a razão não tem sentido, e os três consumidores calam junto: a manchete, a curva do gráfico e as colunas "no ritmo"/"faltam". De quebra a conta deixa de estar duplicada entre motor e tela.

Validação

  • 150 arquivos, 1390/1390 (12 novos) · tsc limpo · eslint 0 · zero migration
  • A projeção da receita bate com a tela: engine devolve R$ 17.967.411, o Cockpit em produção mostra R$ 17.967.409.

🤖 Generated with Claude Code

…briu

Visto ao vivo na Vertímetal: com Receita EM RISCO e Resultado NA ROTA, clicar
no card Resultado trocava o gráfico, o valor e o gap — mas o chip continuava
vermelho e o texto continuava falando da receita. A tela se contradizia.

Não era wiring esquecido: `montarPacing` produz UM `veredito`, da pior dimensão
(P1-A), e o herói o imprimia fixo (`CockpitPacingView.tsx:487`) junto com
`pacing.zonaGeral` no chip, enquanto tudo abaixo lia `pacing[selecionada]`.
Veredito global é a resposta certa pra "como vai o conjunto?" — só que essa não
é a pergunta de quem acabou de escolher uma métrica.

## lerMetrica — leitura da métrica + amarração com as outras

Puro, determinístico, no motor (`pacing-core.ts`). Sem IA: nenhum número novo
nasce aqui, só se lê o que o `montarPacing` já calculou.

- MANCHETE: onde ESTA métrica está contra o plano e onde o ano fecha no ritmo
  dela. O chip passa a ser a zona dela; o sinal do conjunto vira uma marca
  discreta ao lado ("conjunto: EM RISCO"), e só aparece quando difere — o dono
  não perde o alerta geral por estar olhando uma métrica boa.

- AMARRAÇÃO: as 4 metas não são independentes (margem É resultado÷receita;
  DL/EBITDA depende do EBITDA), e o cruzamento é onde mora a leitura de
  consultor. A relação receita×resultado dá 4 histórias, e cada card a lê do
  SEU ponto de vista. Na Vertímetal a mesma relação vira, no card Receita,
  "vender abaixo do plano não derrubou o fim da linha — a perda é de volume,
  não de eficiência"; e no card Margem, "esta margem veio de eficiência: a
  receita está R$ 285.261 abaixo e mesmo assim o resultado está R$ 397.000
  acima". Isso não aparecia em métrica nenhuma isolada.

Não termina em "o que fazer" de propósito: pela Régua R4 (v1.2) a ação-raiz
mora SÓ no HTR, e uma superfície de acompanhamento cumpre sua função ao
informar com clareza. Quatro sugestões vagas, uma por card, seriam exatamente o
que a régua chama de falha.

## Bug achado no caminho: projeção com sinais opostos

`projecaoFim` projetava o fim do ano pela razão realizado/esperado, sem guarda.
Em recuperação isso quebra: esperar −R$ 65.653 e realizar +R$ 331.347 dá razão
−5,05, e o objetivo (−R$ 392.673) vira +R$ 1,98 mi. Número grande, sinal
invertido, apresentado como certeza — e não só no texto: o gráfico desenhava a
curva pontilhada até esse ponto e escrevia "no ritmo R$ 1,98 mi".

Já era alcançável em produção: bastava abrir o card Resultado da Vertímetal.

`projecaoAnoFim` agora devolve `null` quando a razão não tem sentido (esperado
zerado ou sinais opostos) e os TRÊS consumidores calam junto — a frase da
manchete, a curva de projeção do gráfico e as colunas "no ritmo"/"faltam" da
síntese. Preferir não dar número a dar número falso é I8. De quebra a conta
deixa de estar duplicada entre motor e tela: a tela agora só desenha.

Validação: 150 arquivos, 1390/1390 (12 novos travando "cada métrica fala de si",
as 4 relações do par receita×resultado, e o silêncio da projeção) · tsc limpo
(os 2 restantes são validators velhos em .next/) · eslint 0 · zero migration.

Pontuado contra a Constituição: passa R1 (a tela deixa de se contradizer), R3
(causa→efeito entre metas correlatas — o maior ganho), R5 e R9; R4 por cumprir
a função de acompanhamento sem invadir o HTR; R2/R7/R8 não se aplicam ao herói.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@vercel

vercel Bot commented Jul 29, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
atr-os Ready Ready Preview, Comment Jul 29, 2026 6:24pm

@supabase

supabase Bot commented Jul 29, 2026

Copy link
Copy Markdown

This pull request has been ignored for the connected project tdlxqqgechxhkygdmsxq because there are no changes detected in supabase directory. You can change this behaviour in Project Integrations Settings ↗︎.


Preview Branches by Supabase.
Learn more about Supabase Branching ↗︎.

@BarryBits
BarryBits merged commit 89c89f7 into main Jul 29, 2026
4 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant