Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions DATA.md
Original file line number Diff line number Diff line change
Expand Up @@ -186,9 +186,9 @@ Por tempo (`data_emprestimo`) e por cliente (`DECISOES.md`, seção 4):

**Abertas:**

- [ ] Campo da referência de mercado: desenho proposto pela Maria (campo opcional `bc_credito_pessoal_aa` na entrada e `contexto_mercado` na saída, frase escrita pelo código, conversão para nominal; seção 9). Falta a Yasmin passar o valor da view e mostrar o campo, e avisar todos da mudança de formato.
- [ ] Registro de decisões (seção 13): a Yasmin faz as rotas da API, a conexão com o banco e o uso da tabela no painel. Confirmar com ela que a justificativa é obrigatória, que as taxas vão em fração ao ano e que o JSON gravado é só a resposta do `prever()` e o parecer (sem a solicitação, que tem gênero e idade).
- [ ] Todos: quem já tem o banco montado aplica `db/05_decisoes_analista.sql` uma vez (seção 13).
- [x] Campo da referência de mercado: desenho proposto pela Maria (campo opcional `bc_credito_pessoal_aa` na entrada e `contexto_mercado` na saída, frase escrita pelo código, conversão para nominal; seção 9). Feito (Yasmin, 09/11): a API busca a taxa do mês na `bc_credito_pessoal_mensal` (ou na view, pelo contrato) e o painel mostra o bloco "Referência de mercado (Brasil)" no parecer.
- [x] Registro de decisões (seção 13): feito (Yasmin, 09/11). Rotas `POST /decisoes`, `GET /decisoes` e `GET /decisoes/atuais`; justificativa obrigatória; taxas em fração ao ano; o JSON gravado é só a resposta do `prever()` e o parecer (sem a solicitação, que tem gênero e idade); revisão manual grava nulos.
- [x] Todos: quem já tem o banco montado aplica `db/05_decisoes_analista.sql` uma vez (seção 13). O `iniciar.ps1` aplica sozinho a cada subida.
- [ ] Samuel (08 e 09/11): `carteira_auditoria.csv` e `equidade.json`; o backtest do retorno realizado usa a `vw_retorno_realizado` como está, com as recuperações já dentro dos pagamentos (seção 14).
- [ ] Marcos e Samuel (14/11): ROI em euros da carteira.
- [ ] Marcos (14/11): datasheet dos dados.
Expand Down
2 changes: 1 addition & 1 deletion docs/DECISOES.md
Original file line number Diff line number Diff line change
Expand Up @@ -232,7 +232,7 @@ Resíduo = juro cobrado − juro justo, controlando por PD, faixa, país × ano,
- [X] Baseline (adiantado de 01/11 para 31/10)
- [X] Preencher os resultados da v3
- [X] Maria: proposta da v1.2 aceita (acima do justo → `revisar_preco`; `REGRAS_PARECER.md` v1.2)
- [ ] Yasmin: aprovar o formato para as telas
- [X] Yasmin: formato do `prever()` aprovado para as telas (API e painel usam os contratos de `genai/src/checagem.py`)
- [X] Marcos: Euribor e taxas do BC até 01/11; view das coortes
- [X] 03/11: XGBoost + calibração + SHAP
- [X] **04/11: entregar o `prever()`**
Expand Down
69 changes: 0 additions & 69 deletions docs/RODAR_EM_QUALQUER_PC.md

This file was deleted.

7 changes: 4 additions & 3 deletions docs/ROTEIRO_DEMO.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,19 +8,20 @@ Demo ao vivo de cerca de **8 minutos**, no dia 15/11, seguida da mesma sequênci

## 1. Antes de começar (no dia, 30 min antes)

- [ ] Docker Desktop aberto; rodar `.\iniciar.ps1` e esperar o "Pronto".
- [ ] Docker Desktop aberto; rodar `.\iniciar.ps1`, ou `docker compose up -d` e esperar o "Pronto".
- [ ] Em http://localhost:8000/: `modelo_carregavel: true` e `banco_disponivel: true`.
- [ ] Fazer **uma auditoria de aquecimento** pelo formulário: a 1ª chamada ao Gemini e à busca nas normas é a mais lenta.
- [ ] Preencher "Analista responsável" no topo da seção de auditoria.
- [ ] Navegador em tela cheia, zoom em 90% a 100%, abas abertas: painel (8501) e documentação da API (8000/docs).
- [ ] Vídeo gravado aberto em outra janela, pronto para o plano B.
- [ ] Print do `terraform plan` ("Plan: 5 to add") num slide, para mostrar a infraestrutura na nuvem sem depender da internet da sala.

## 2. Sequência

| # | Tempo | Na tela | Frase-chave | Prova |
|---|---|---|---|---|
| 1 | 0:00 | Capa do painel | "Para cada contrato: qual o risco, se o juro é justo para esse risco e se clientes de mesmo risco pagam diferente. Quem decide é o analista." | Ideia e enquadramento |
| 2 | 0:45 | Aba **Revisão de contrato** → formulário (3 etapas) → **Executar auditoria** | "Gênero e idade ficam registrados só para auditoria: não entram no modelo nem no parecer." | Governança: atributos sensíveis só auditam |
| 2 | 0:45 | Aba **Revisão de contrato** → formulário (3 etapas, cada uma só abre depois de "Confirmo que revisei") → **Executar auditoria** (libera com as 3 caixas) | "Ninguém audita sem conferir os dados. E gênero e idade ficam registrados só para auditoria: não entram no modelo nem no parecer." | Governança: atributos sensíveis só auditam |
| 3 | 1:45 | Cartões, régua e motivos do resultado | "O juro justo vem do fluxo de caixa: custo do dinheiro da época, perda esperada e margem da safra, com margem de incerteza do bootstrap." | Modelo e juro justo |
| 4 | 2:45 | Parecer "Gerado por IA", fontes e referência de mercado do BC | "A IA só escreve. Recomendação e números vêm do código, e cada número do texto é conferido; se falhar, entra o template." | GenAI com checagem |
| 5 | 3:45 | **Caso de exemplo → Acima do justo · 98ffaaa4-0b86** (faixa D: cobrado 39,0%, justo 34,0%, margem 31,7%–36,8%) | "Indício a investigar, não conclusão." | Linguagem de indício |
Expand Down Expand Up @@ -58,4 +59,4 @@ Demo ao vivo de cerca de **8 minutos**, no dia 15/11, seguida da mesma sequênci

| Versão | Data | Mudança |
|---|---|---|
| 1.0 | 10/11/2026 | Primeira versão do roteiro. |
| 1.0 | 11/11/2026 | Primeira versão do roteiro. |
6 changes: 0 additions & 6 deletions iniciar.bat

This file was deleted.

10 changes: 8 additions & 2 deletions iniciar.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,9 @@ if ($Parar) {
exit 0
}

# Portas livres? (5432 banco, 8000 API, 8501 painel). Outro container ou programa nelas impede a subida.
# Portas livres? 8000 (API) e 8501 (painel) precisam estar livres para o navegador.
# A 5432 so gera aviso: a API fala com o banco pela rede interna do Docker, entao um PostgreSQL
# instalado no Windows (comum em PC de laboratorio) nao atrapalha.
$nossos = @("auditor_postgres", "auditor_api", "auditor_streamlit")
$programas_docker = @("com.docker.backend", "wslrelay", "vpnkit", "com.docker.proxy", "dockerd", "docker")
foreach ($porta in 5432, 8000, 8501) {
Expand All @@ -63,7 +65,11 @@ foreach ($porta in 5432, 8000, 8501) {
if ($con) {
$proc = Get-Process -Id $con.OwningProcess -ErrorAction SilentlyContinue
if ($proc -and ($programas_docker -notcontains $proc.ProcessName)) {
Parar "A porta $porta esta ocupada pelo programa '$($proc.ProcessName)'. Feche-o com: Stop-Process -Id $($proc.Id) e rode de novo."
if ($porta -eq 5432) {
Aviso "A porta 5432 tambem tem um '$($proc.ProcessName)' do Windows. Tudo bem: a API usa o banco do Docker pela rede interna."
} else {
Parar "A porta $porta esta ocupada pelo programa '$($proc.ProcessName)'. Feche-o com: Stop-Process -Id $($proc.Id) e rode de novo."
}
}
}
}
Expand Down
3 changes: 1 addition & 2 deletions skills/regras_negocio/painel/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -84,8 +84,7 @@ Tema do Streamlit (`.streamlit/config.toml`): `base="dark"`, `primaryColor="#D4A

- **[PRONTO]** as três abas, formulário, casos reais, valores legíveis dos motivos, decisão na sessão.
- **[A CONFIRMAR] (Marcos)** rótulos dos códigos de escolaridade, moradia e verificação (`CODIGOS` em `componentes.py`, tirados do dicionário do Bondora).
- **[PENDENTE] (Yasmin)** mostrar "a.a. nominal" ao lado dos juros.
- **[PENDENTE] (depende de outras frentes)** `juro_pares_mediana` como referência ao lado do juro justo ("Mediana dos pares: X%", oculto quando `null`; até 09/11); `contexto_mercado` do BC no parecer; decisões gravadas no banco e marcação "já decidido" na fila; dados reais da carteira (08/11 e 09/11).
- **[PRONTO] (09/11)** "a.a. nominal" ao lado dos juros; mediana dos pares ao lado do juro justo; `contexto_mercado` do BC no parecer; decisões gravadas no banco com "Decisão atual" na fila; dados reais da carteira.

## Estado em 10/11/2026

Expand Down
42 changes: 33 additions & 9 deletions src/app/estilo.css
Original file line number Diff line number Diff line change
Expand Up @@ -94,10 +94,29 @@ body { background-color: var(--dark-bg); color: var(--text-light); font-family:
[data-testid="stButton"] button:hover, [data-testid="stDownloadButton"] button:hover {
transform: translateY(-3px); border-color: var(--gold-light) !important; box-shadow: 0 12px 28px rgba(200, 154, 88, 0.12);
}
/* botão principal (Revisar preço, Revisar, Abrir caso...): dourado da paleta */
[data-testid="stButton"] button[data-testid="stBaseButton-primary"],
[data-testid="stButton"] button[kind="primary"] {
background: linear-gradient(135deg, #d7b9b8 0%, #c8a2a0 100%) !important;
color: #171315 !important; border: 1px solid #e5c5c3 !important; font-weight: 700 !important;
background: linear-gradient(135deg, #c89a58 0%, #e4bd7d 100%) !important;
color: #171315 !important; border: 1px solid #e4bd7d !important; font-weight: 700 !important;
}
[data-testid="stButton"] button[data-testid="stBaseButton-primary"] p,
[data-testid="stButton"] button[kind="primary"] p { color: #171315 !important; }
[data-testid="stButton"] button[data-testid="stBaseButton-primary"]:hover,
[data-testid="stButton"] button[kind="primary"]:hover {
filter: brightness(1.06); box-shadow: 0 12px 28px rgba(200, 154, 88, 0.25);
}

/* EXECUTAR AUDITORIA DE PREÇO: branco com borda dourada */
.st-key-audit_execute button, .st-key-audit_execute button[kind="primary"],
.st-key-audit_execute button[data-testid="stBaseButton-primary"] {
background: #ffffff !important; color: #171315 !important;
border: 2px solid var(--gold) !important; font-weight: 700 !important; letter-spacing: .06em;
}
.st-key-audit_execute button p, .st-key-audit_execute button [data-testid="stIconMaterial"] { color: #171315 !important; }
.st-key-audit_execute button:hover:not(:disabled) {
background: #fbf6ee !important; border-color: var(--gold-light) !important; filter: none;
box-shadow: 0 12px 28px rgba(200, 154, 88, 0.28);
}

.audit-workspace-label { color: var(--gold-light); font-size: .68rem; font-weight: 700; letter-spacing: .16em; text-transform: uppercase; margin: .15rem 0 .4rem 0; }
Expand Down Expand Up @@ -176,18 +195,23 @@ body { background-color: var(--dark-bg); color: var(--text-light); font-family:
}
[data-testid="stTabs"] [data-baseweb="tab"] {
height: 104px !important; min-height: 104px; width: 100%; justify-content: center; align-items: center;
padding: .55rem .35rem !important; border-radius: 10px !important;
border: 1px solid rgba(200, 154, 88, 0.34) !important;
background: linear-gradient(145deg, #202126 0%, #17181c 100%) !important;
color: var(--text-light) !important; transition: transform .2s ease, border-color .2s ease;
padding: .55rem .35rem !important; border-radius: 16px !important;
border: 1.5px solid rgba(200, 154, 88, 0.55) !important;
background: linear-gradient(145deg, #25262c 0%, #1a1b20 100%) !important;
color: var(--gold-light) !important; box-shadow: 0 10px 26px rgba(0, 0, 0, 0.32);
transition: transform .2s ease, border-color .2s ease, box-shadow .2s ease;
}
[data-testid="stTabs"] [data-baseweb="tab"] p {
font-size: .74rem !important; font-weight: 700 !important; letter-spacing: .1em; color: inherit !important;
font-size: .82rem !important; font-weight: 700 !important; letter-spacing: .12em; color: inherit !important;
}
[data-testid="stTabs"] [data-baseweb="tab"]:hover {
transform: translateY(-3px); border-color: var(--gold-light) !important;
box-shadow: 0 14px 30px rgba(200, 154, 88, 0.18);
}
[data-testid="stTabs"] [data-baseweb="tab"]:hover { transform: translateY(-3px); border-color: var(--gold-light) !important; }
[data-testid="stTabs"] [aria-selected="true"] {
background: linear-gradient(135deg, #c89a58 0%, #e4bd7d 100%) !important;
color: #171315 !important; border: 1px solid #e4bd7d !important;
color: #171315 !important; border: 1.5px solid #f0d29b !important;
box-shadow: 0 14px 34px rgba(200, 154, 88, 0.35);
}
[data-testid="stTabs"] [data-baseweb="tab-highlight"], [data-testid="stTabs"] [data-baseweb="tab-border"] { display: none !important; }

Expand Down
8 changes: 0 additions & 8 deletions src/app/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -87,7 +87,6 @@ def md(bloco: str) -> None:
st.session_state.setdefault("audit_active_step", "personal")
st.session_state.setdefault("audit_last_result", None)
st.session_state.setdefault("audit_last_contexto", {})
st.session_state.setdefault("audit_last_payload", None)
st.session_state.setdefault("audit_last_error", None)
st.session_state.setdefault("historico", []) # contratos auditados nesta sessão
st.session_state.setdefault("decisoes", []) # decisões registradas pelo analista
Expand Down Expand Up @@ -683,12 +682,6 @@ def render_revisao(r: dict, ctx: dict) -> None:
st.markdown("<div style='height:1rem'></div>", unsafe_allow_html=True)
bloco_decisao(r)

with st.expander("Dados técnicos da consulta"):
if st.session_state.audit_last_payload and not ctx.get("ilustrativo"):
st.markdown("**Enviado à API**")
st.json(st.session_state.audit_last_payload)
st.markdown("**Resposta da API**")
st.json(r)


# ------------------------------------------
Expand All @@ -701,7 +694,6 @@ def render_revisao(r: dict, ctx: dict) -> None:
if modo == "Novo contrato (formulário)":
if formulario():
payload = montar_payload()
st.session_state.audit_last_payload = payload
with st.spinner("Calculando risco, juro justo e parecer..."):
resposta, erro = chamar_api("/prever", payload)
if erro:
Expand Down
Loading