{
    "name": "inicial-bradesco",
    "version": "1.0.0",
    "description": "Gera petição inicial contra o BANCO BRADESCO S.A. em ações declaratórias de inexistência de relação jurídica c/c repetição do indébito e danos morais. Cobre 5 famílias de tese (Tarifas, Mora+Encargo, Aplic.Invest, Título de Capitalização, PG ELETRON com terceiro), com 6 templates no vault Obsidian e seleção automática conforme as cobranças detectadas no extrato Bradesco. Use quando o usuário pedir para gerar inicial Bradesco, processar pasta de cliente Bradesco, fazer petição inicial bancária Bradesco, ou disser \"faz a inicial do/da [nome do cliente]\".",
    "system_prompt": "name inicial-bradesco description Gera petição inicial contra o BANCO BRADESCO S.A. em ações declaratórias de inexistência de relação jurídica c/c repetição do indébito e danos morais. Cobre 5 famílias de tese (Tarifas, Mora+Encargo, Aplic.Invest, Título de Capitalização, PG ELETRON com terceiro), com 6 templates no vault Obsidian e seleção automática conforme as cobranças detectadas no extrato Bradesco. Use quando o usuário pedir para gerar inicial Bradesco, processar pasta de cliente Bradesco, fazer petição inicial bancária Bradesco, ou disser \"faz a inicial do/da [nome do cliente]\". Skill: inicial-bradesco Geração automatizada de petições iniciais contra o Banco Bradesco em ações declaratórias de inexistência de relação jurídica c/c repetição do indébito em dobro e danos morais. Atende ao escritório De Azevedo Lima & Rebonatto (Maués/AM). Regras críticas (não esquecer) 1. Renda da parte autora — SEMPRE do extrato real NUNCA hardcode. A renda mensal usada no parágrafo da Justiça Gratuita ( {{valor_remuneração}} e {{valor_remuneração_extenso}} ) é EXTRAÍDA do extrato bancário Bradesco do próprio cliente, no último crédito identificado das rubricas: INSS CREDITO DE SALARIO TRANSF SALDO C/SAL P/CC (típico de servidor público que recebe via conta-salário) BENEFICIO PREVIDENCIARIO PAGTO BENEFICIO INSS APOSENTADORIA PENSAO Se NÃO houver crédito identificável no extrato, NÃO inventar valor padrão : alertar no relatório paralelo \"RENDA NÃO IDENTIFICADA NO EXTRATO — preencher manualmente\" e deixar [A CONFIRMAR] no DOCX. 2. Ementa (QUESTÃO/RATIO/SOLUÇÃO) — TEXTO LITERAL DO MODELO A QUESTÃO/RATIO/SOLUÇÃO de cada template é literal do modelo do escritório . NUNCA reescrever ou parafrasear; apenas substituir placeholders dinâmicos (rubricas, ordinais) quando aplicável. 3. Valores monetários — SEMPRE da tabela ou do extrato Os valores {{total_descontos}} , {{dobro_descontos}} , {{valor_causa}} são calculados a partir das tabelas (PDF 7) ou do parsing direto do extrato . NUNCA usar o \"TOTAL: R$ X\" impresso no rodapé da tabela como valor de uma tese isolada — esse total agrega todas as cobranças de todos os terceiros. 4. Documentos do cliente — SEMPRE fora da pasta KIT Pasta KIT/ , 0. Kit/ ou variantes é ignorada por padrão . Ler apenas documentos da pasta principal. Exceção: se NENHUMA outra fonte trouxer a qualificação (ex.: caso Elinaldo — sem notificação extrajudicial), pode usar o KIT como fallback com alerta explícito no relatório paralelo . 5-bis. Tipografia do modelo — preservar fontes dos TÍTULOS REGRA CRÍTICA : o modelo do escritório usa Cambria APENAS no corpo. Os títulos e subtítulos preservam suas fontes próprias do template (Segoe UI, Segoe UI Semibold, Franklin Gothic Book). NÃO sobrescrever. Estilo (styleId) Fonte original Categoria 2Ttulo , 2TtuloChar Segoe UI TÍTULO — preservar 3Subttulo , 3SubttuloChar Segoe UI Semibold SUBTÍTULO — preservar 31Subttulointermedirio , 31SubttulointermedirioChar Segoe UI Semibold SUBTÍTULO — preservar 31Subttulosecundrio Franklin Gothic Book SUBTÍTULO — preservar 1Pargrafo , 4Citao , 5Listaalfabtica , CORPOHOMERO , PargrafodaLista , Estilo1 (+ Char) Cambria CORPO — forçar Normal Cambria CORPO — forçar helpers_docx.py mantém duas listas separadas: ESTILOS_CORPO → recebem Cambria via forcar_cambria_global ESTILOS_TITULO_PRESERVAR → nunca tocar forcar_cambria_global também NÃO mexe em <a:majorFont> do theme1.xml (usado pelos títulos), apenas em <a:minorFont> (usado pelo corpo). 5-bis-2. Extratos como PDF imagem (scan/foto) — OCR automático REGRA CRÍTICA : extratos Bradesco frequentemente vêm como PDF de imagem (digitalizados, fotografados pelo cliente). page.get_text() retorna vazio nesses casos e silenciosamente perde lançamentos. A skill agora usa _ler_texto_pdf() em extrator_documentos.py para todas as extrações: Tenta text-layer primeiro (rápido) Se a página não tem texto (≤50 chars), aplica OCR easyOCR Detecta landscape (largura > altura × 1.2) e roda 270° antes do OCR Cacheia resultado por path para evitar reprocessar o mesmo PDF Funções afetadas (todas usam _ler_texto_pdf internamente): extrair_renda_real(extrato_path) — Justiça Gratuita extrair_conta_agencia(extrato_path) — qualificação da conta parsear_lancamentos_extrato(extrato_path, rubrica) — auditoria parsear_tabela_descontos(tabela_path, filtro_rubrica) — base da tese Para detectar antecipadamente: from extrator_documentos import detectar_pdf_imagem if detectar_pdf_imagem(extrato_path): print ( 'Extrato é imagem; OCR vai rodar (~30s/página)' ) Limitações do OCR: 5-15s por página em PDF imagem Pode confundir 0/O, 1/I, valores R$ com pontuação ruim Se severidade da auditoria tabela↔extrato vier CRITICO , sempre revisar manual 5-quater. Tabela do NotebookLM incompleta — auto-completa via extrato digital REGRA CRÍTICA : Para teses TARIFAS, sempre que houver na pasta do cliente um extrato digital com text-layer (geralmente em 0. Kit/EXTRATO - <NOME>.pdf baixado do app Bradesco), a skill DEVE rodar auditor_tarifas_completo.auditar_e_completar_tarifas() ANTES de montar a tese. A tabela XLSX gerada pelo NotebookLM com frequência ignora rubricas adjacentes que também envolvem TARIFA: VR.PARCIAL CESTA (parcelas), TARIFA EMISSÃO EXTRATO, etc. Procuração genérica de TARIFA BANCÁRIA cobre TODAS — não impugnar apenas a CESTA cheia significa subdimensionar a inicial em 50-100%. Caso paradigma — CELIA RODRIGUES DA SILVA (09/05/2026) : Tabela do NotebookLM: 32 lançamentos / R$ 1.324,02 (só CESTA cheia) Extrato digital parseado posicionalmente: 112 lançamentos / R$ 2.434,35 (CESTA + VR.PARCIAL + EMISSÃO EXTRATO) Diferença: 80 lançamentos perdidos se usasse só a tabela Como invocar: from auditor_tarifas_completo import auditar_e_completar_tarifas, lancamentos_para_tese audit = auditar_e_completar_tarifas( pasta_cliente=PASTA_CLIENTE, # raiz do cliente (onde está '0. Kit/') tabela_xlsx_path=TABELA_NOTEBOOKLM, # XLSX original (opcional, p/ comparar) cliente_nome= 'CELIA RODRIGUES DA SILVA' , conta_label= 'Agência: 3706 | Conta: 16649-9' , procuracao_label= 'TARIFA BANCÁRIA - CESTA B.EXPRESSO' , gerar_planilha_v2= True , # cria '<...> - v2.xlsx' substituta ) # audit['severidade'] ∈ {'OK', 'INCOMPLETO', 'CRITICO'} # audit['lancamentos'] = lista completa do extrato (todos com 'TARIFA') # audit['planilha_v2_path'] = path da planilha gerada (substitui a do NotebookLM) # audit['recomendacao'] = texto humano para o relatório paralelo LANCAMENTOS = lancamentos_para_tese(audit[ 'lancamentos' ]) tese = { 'rubrica' : 'TARIFA BANCÁRIA - CESTA B.EXPRESSO' , 'lancamentos' : LANCAMENTOS} O que a rotina faz por baixo dos panos: Procura extrato digital com text-layer (em 0. Kit/ , raiz do cliente, etc.) via parser_extrato_posicional.encontrar_extrato_digital_no_kit Faz parsing posicional preciso (estrutura DATA/RUBRICA/DOCTO/VALOR/SALDO) via parser_extrato_posicional.parsear_extrato_digital — superior ao OCR para extratos digitais Filtra TODOS os lançamentos com TARIFA na descrição (não só CESTA) Lê a tabela do NotebookLM (se fornecida) e compara Se a tabela está incompleta (>5 lançamentos a mais no extrato OU divergência >R$ 50), gera planilha XLSX v2 com todas as categorias separadas (CESTA / VR.PARCIAL / EMISSÃO EXTRATO) na pasta do cliente Retorna lançamentos + relatório textual para anexar ao _RELATORIO_PENDENCIAS_*.docx Bug do template \"R$ R$\" duplicado — após aplicar_template , sempre rodar pós-fix: import re from docx import Document d = Document(DOCX_OUT) for p in d.paragraphs: if re.search( r'R\\$\\s*R\\$' , p.text): full = '' .join(r.text for r in p.runs) novo = re.sub( r'R\\$\\s*R\\$' , 'R$' , full) p.runs[ 0 ].text = novo for r in p.runs[ 1 :]: r.text = '' d.save(DOCX_OUT) (O bug está no template — R$ {{total_descontos}} + placeholder já formatado com \"R$\" → R$ R$ X,YY . Editar o template no vault removendo o R$ antes de cada placeholder monetário resolve permanente.) 5-quinquies. Renda não identificada — REMOVER parágrafo da Justiça Gratuita REGRA : quando extrair_renda_real() retornar None (nenhum crédito INSS/SALARIO/etc. ≥ R$ 500 nos extratos), NÃO deixar [A CONFIRMAR] no DOCX nem renda zerada — REMOVER os parágrafos da Justiça Gratuita. Parágrafos a remover (2 normalmente): \"Frisa-se que a parte autora recebe ... no valor líquido de apenas R$ ... conforme se comprova pelo extrato anexo, restando cristalina a sua fragilidade econômica.\" \"Para fazer frente às despesas fixas com alimentação, vestuário ... pugna, expressamente, pelo beneplácito da gratuidade de justiça...\" Função: remover_paragrafo_renda(docx_path) no batch script. Adicionar alerta no relatório paralelo: \"RENDA não detectada — parágrafo da Justiça Gratuita REMOVIDO. Reavaliar se é caso de pedir gratuidade (adicionar parágrafo manual com renda real do cliente) ou prosseguir sem.\" 5-sexies. Conta sem número — ALERTA CRÍTICO 🛑 REGRA : quando extrair_conta_agencia() retornar dict sem conta (só agencia ), gerar alerta CRÍTICO em vermelho no relatório paralelo. Sem número de conta, a inicial NÃO PODE ser protocolada. Causas comuns: Iteração de extratos parou no primeiro que tinha só agência (preferir os que têm agencia E conta ) Cabeçalho do extrato com formato diferente (regex Conta[:\\s]*([\\d-]+) não pega) Extrato escaneado sem text-layer (cair em OCR — impreciso) Boas práticas: Em extrair_conta_e_renda(extratos_paths) : prefirir extrato com agência+conta. Só fallback para \"só agência\" se NENHUM tiver ambos. Marcar alertas_critico no relatório com cor vermelha: \"CONTA/AGÊNCIA faltando — extraído apenas agencia=X / conta=. Sem o número da conta, a inicial NÃO PODE ser protocolada.\" 5-ter. Auditoria tabela ↔ extrato — SEMPRE rodar antes de montar tese REGRA CRÍTICA : a tabela de descontos gerada pelo NotebookLM tem apresentado erros recorrentes (rubricas faltantes, valores trocados, lançamentos perdidos). NUNCA usar a tabela como única fonte sem auditoria. Use extrator_documentos.obter_lancamentos_auditados(tabela_path, extrato_path, rubrica) . Ela: Parseia a TABELA filtrando por rubrica Parseia o EXTRATO direto filtrando pela mesma rubrica Compara contagem + soma + datas Retorna lancamentos da fonte mais confiável + relatorio com divergências Política de seleção: paridade (tabela = extrato) → usa tabela (visualmente já formatada) extrato > tabela em quantidade → usa extrato (tabela incompleta) tabela > extrato → usa tabela mas alerta CRÍTICO para revisão manual (parser do extrato pode ter falhado) Sempre incluir relatorio no relatório paralelo da inicial. Se severidade for CRITICO , NÃO entregar para o cliente sem revisão manual da fonte. from extrator_documentos import obter_lancamentos_auditados audit = obter_lancamentos_auditados( tabela_path= '/.../7- TABELA - DESCONTOS.pdf' , extrato_path= '/.../EXTRATO BRADESCO.pdf' , rubrica= 'MORA CRED PESS' ) if audit[ 'severidade' ] == 'CRITICO' : print (audit[ 'relatorio' ]) # ler antes de prosseguir tese = { 'rubrica' : 'MORA CRED PESS' , 'lancamentos' : audit[ 'lancamentos' ]} 5-septies. Fonte dos lançamentos — HIERARQUIA OBRIGATÓRIA + auditar duplicação REGRA CRÍTICA (caso ANA CAROLINE 10/05/2026 — usuário viu 47 hits no Ctrl+F mas a inicial reportou 24): a contagem de lançamentos NUNCA pode ser feita \"no olho\". A skill deve seguir esta hierarquia rígida E sempre auditar duplicação no PDF. Hierarquia de fontes (em ordem de preferência): EXISTE planilha (xlsx/csv) na pasta do cliente → USAR a planilha como fonte primária E rodar auditoria cruzada com o extrato ( obter_lancamentos_auditados ). Diferenças >5 lançamentos OU >R$ 50 → severidade CRITICO no relatório. NÃO existe planilha → GERAR uma em Excel a partir do extrato, salvar na pasta do cliente como TABELA_<RUBRICA>_<NOME>_v<N>.xlsx . O usuário converte para PDF depois se quiser. A planilha deve ter no mínimo 4 abas: Resumo : cliente, agência, conta, rubrica, contagem, soma, dobro, período Lançamentos Únicos : tabela final ordenada por data (data, contrato, rubrica, valor, página origem, hora geração) Auditoria Duplicação : linhas descartadas como duplicatas Auditoria Crua : TODAS as ocorrências brutas com flag ÚNICA/DUPLICATA (verde/vermelho) PDF sem text-layer (scan/foto) → OCR via Tesseract OU leitura visual nativa (PyMuPDF render → Read visual). NUNCA confiar em \"achei só X lançamentos\" sem ter parseado todas as páginas. Se mesmo o OCR falhar, abrir alerta CRÍTICO no relatório paralelo e exigir revisão manual. Auditoria de duplicação OBRIGATÓRIA (causa-raiz do mal-entendido ANA CAROLINE): Clientes frequentemente baixam o extrato Bradesco várias vezes seguidas (segundos/minutos de diferença) e mandam todos juntos. O resultado é UM PDF com o mesmo período repetido várias vezes. Sintoma: Ctrl+F \"MORA\" retorna o dobro/triplo do que a tabela real tem. Detecção: Para cada página do PDF, extrair o cabeçalho Data: DD/MM/AAAA - HHhMM E Movimentação entre: DD/MM/AAAA e DD/MM/AAAA Agrupar páginas por (período, hora_geracao) — cada grupo = um download independente do extrato Se múltiplos grupos cobrirem o MESMO período → detectar duplicação Deduplicar lançamentos por chave (data, contrato, valor) — manter o primeiro, descartar os demais Registrar na aba \"Auditoria Duplicação\" da planilha o que foi descartado e de qual versão veio Caso paradigma ANA CAROLINE (10/05/2026) : PDF tinha 26 páginas, 47 hits brutos de \"MORA CREDITO PESSOAL\" Estrutura: Jan-Dez/2020 baixado às 11h19 (pgs 1-9) + baixado de novo às 11h21 (pgs 10-18) + 2019 (pgs 19-22) + 2021 (pgs 23-24) + 2026 (pgs 25-26) Após dedup por (data, contrato, valor): 24 lançamentos únicos = R$ 3.554,71 Conferência: 23 únicos × 2 versões + 1 (de 2021) = 47 hits ✓ Por que isso é crítico : o usuário SEMPRE vai conferir com Ctrl+F. Se a skill reportar 24 mas o Ctrl+F mostrar 47, a confiança quebra. A planilha Excel com a aba \"Auditoria Crua\" (verde = único, vermelho = duplicata) é a prova matemática que reconcilia os dois números. from auditor_tarifas_completo import gerar_planilha_lancamentos audit = gerar_planilha_lancamentos( extrato_pdf=PASTA_CLIENTE / 'EXTRATOS.pdf' , rubrica= 'MORA CREDITO PESSOAL' , saida_xlsx=PASTA_CLIENTE / f'TABELA_MORA_ {NOME_CURTO} _v3.xlsx' , ) # audit['unicos'] = lista para usar na tese # audit['duplicatas'] = lista descartada # audit['relatorio'] = texto p/ relatório paralelo 5-novies. Pasta com >1 procuração = INICIAL-COMBINADA obrigatória REGRA CRÍTICA (caso LUIZ PIRES 10/05/2026 — usuário detectou que a inicial cobria só 1 das 2 procurações da pasta): toda subpasta de tese que contém mais de uma procuração 2 - PROCURAÇÃO BRADESCO ...pdf exige uma inicial-combinada.docx , não múltiplas iniciais separadas e nem uma só inicial cobrindo apenas 1 das procurações . Antes de chamar qualquer runner singular ( inicial-mora , inicial-encargo , inicial-tarifas , inicial-mora-encargo ), o pipeline DEVE: Listar 2 - PROCURAÇÃO BRADESCO *.pdf na pasta da tese. Se count > 1 → usar _combinada_helper.gerar_combinada() mapeando cada procuração para uma tese no array. Identificar a família de cada procuração pelo nome do arquivo: MORA CRED PESS / ENCARGOS LIMITE DE CRED → família MORA TARIFA BANCÁRIA * / SERVIÇO CARTÃO PROTEGIDO (seguro de cartão) → família TARIFAS TÍTULO DE CAPITALIZAÇÃO / CARTÃO PROTEGIDO (quando = título) → família TITULO APLIC.INVEST FÁCIL → família APLIC PG ELETRON / PAGAMENTO ELETRÔNICO → família PG_ELETRON (não combina — vai em inicial-pg-eletron separada por terceiro réu) Buscar lançamentos de cada rubrica no extrato ( 6 - EXTRATO BANCÁRIO.pdf ) ou na planilha do cliente ( Tabela de Descontos por Procuracao - <NOME>.xlsx ). Gerar INICIAL_Combinada_<CLIENTE>_v<N>.docx (nome contém \"Combinada\", não \"Encargo\" ou \"Mora\" sozinhos).",
    "model_config": {
        "provider": "deepseek",
        "model": "deepseek-chat",
        "temperature": 0.7,
        "max_tokens": 4096,
        "top_p": 0.9
    },
    "trigger_words": [],
    "source": "DeepseekModel",
    "source_url": "https://deepseekmodel.com/skill?id=gabrielcardosodeaguiar45-oss-claude-skills-azevedolima-inicial-bradesco-skill-md"
}