# Inicial Nao Contratado

> Gera petição inicial 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 por EMPRÉSTIMO CONSIGNADO NÃO CONTRATADO. Cobre BA Federal (JEF Salvador/Gabriel), AM Estadual (TJAM/Patrick), AL Federal (JEF Tiago), AL Estadual (TJAL Tiago) e MG Estadual (TJMG/Alexandre) com 10 templates parametrizados no vault. Use quando o usuário pedir para gerar inicial de empréstimo não contratado, processar pasta de cliente APP-NÃO-CONTRATADO, fazer petição inicial contra banco (e INSS no caso Federal) por descontos não autorizados em benefício previdenciário, ou mencionar HISCON com contratos fraudulentos. Sistema de perfis permite adicionar PE/SE/ES novas em ~30 minutos seguindo GUIA_NOVA_UF.md.

- Skill: `gabrielcardosodeaguiar45-oss/inicial-nao-contratado` (Agent Skill, multi-file: 45 files)
- Install (CLI): `npx skillmds@latest add gabrielcardosodeaguiar45-oss/inicial-nao-contratado`
- Raw SKILL.md: https://api.skillmd.com/api/skills/gabrielcardosodeaguiar45-oss/inicial-nao-contratado/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- Author: gabrielcardosodeaguiar45-oss (https://skillmd.com/u/gabrielcardosodeaguiar45-oss)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/gabrielcardosodeaguiar45-oss/inicial-nao-contratado

---


# Skill: inicial-nao-contratado

Geração automatizada de **petições iniciais** 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, por **empréstimo consignado não contratado** (descontos no benefício previdenciário sem autorização do segurado). Escritório De Azevedo Lima & Rebonatto.

## INSTRUÇÕES OPERACIONAIS (uso da skill)

Quando o usuário invocar `/inicial-nao-contratado` ou pedir para gerar uma inicial:

**1. Identificar o perfil de jurisdição** (UF + foro):

| O que o usuário diz | Perfil a usar |
|---|---|
| BA / Salvador / JEF Federal Bahia | `BA_FEDERAL` |
| AM / Manaus / Maués / Boa Vista do Ramos / TJAM | `AM_ESTADUAL` |
| AL / Arapiraca / Maceió / JEF AL (≤ 60 SM = R$ 91.080) | `AL_FEDERAL` |
| AL Estadual / TJAL (> 60 SM ou sorteio) | `AL_ESTADUAL` |
| MG / Ipatinga / Uberlândia / Belo Horizonte / TJMG | `MG_ESTADUAL` |

**2. Localizar a pasta do cliente** (em `C:\Users\gabri\OneDrive\Área de Trabalho\APP - NÃO CONTRATADO\<cliente>` ou subpasta de banco)

**3. Ler procuração via OCR** (texto-camada → easyocr → multimodal Read se PDF escaneado) para extrair número(s) de contrato. **REGRA CRÍTICA §9-quater**: nunca pegar todos os contratos do banco; se OCR falhar, pedir números explícitos ao usuário.

**4. Ler RG + comprovante** via OCR multimodal — extrair CPF, RG, data nascimento (≥60 = idoso → prioridade), endereço, estado civil. Se RG ilegível, anotar como pendente; **nunca** escrever `[A CONFIRMAR]` sem antes tentar OCR.

**5. Invocar pipeline genérico:**

```python
from _pipeline_generico import gerar_inicial_padrao

res = gerar_inicial_padrao(
    perfil_chave='AL_FEDERAL',  # ou BA_FEDERAL / AM_ESTADUAL / AL_ESTADUAL
    pasta_cliente=r'...',
    autora={'nome': ..., 'cpf': ..., 'data_nascimento': datetime(...), ...},
    comarca='Arapiraca',
    numeros_contrato_explicitos=['xxxxxxxxxx'],
    output_path=r'.../INICIAL_<cliente>.docx',
)
```

A skill aplica AUTOMATICAMENTE:
- Procuração-fonte-única (`ProcuracaoSemFiltroError` se sem filtro)
- Fontes Segoe UI Bold no autor/banco/INSS via rStyle 2TtuloChar
- Cabeçalho em Segoe UI Bold inline (sem caps)
- Conjugação f/m automática (nacionalidade → inscrita/inscrito + domiciliada/domiciliado)
- Omissão limpa de RG inválido / igual ao CPF / vazio / `[A CONFIRMAR]`
- **Endereço composto** matriz Joaçaba/SC + unidade de apoio na UF do cliente (`montar_endereco_escritorio_completo` + `inserir_unidade_apoio_se_faltando`)
- Bloco fático sem mencionar depósito (default conservador AL)
- Intro fática com **BANCO + CONTRATO Nº em Cambria Bold CAPS** (não Segoe UI)
- Pedido declaratório com escolha empréstimo vs refinanciamento
- **Prioridade idoso** só se autor ≥ 60 anos:
  - cabeçalho em Cambria 11pt + alinhamento direita + recuo 4cm
  - pedido como item I da lista numerada em Cambria Bold
- Grifo amarelo em todas as alterações
- Validação template (`validar_template.py`) se template novo

**6. Reportar para o usuário:**
- Caminho do DOCX gerado
- N de contratos detectados
- Banco-réu identificado
- Modificações + residuais
- Alertas (pendências de leitura ocular, divergências doc vs HISCRE, etc.)

## Estrutura de arquivos da skill

```
~/.claude/skills/inicial-nao-contratado/
├── SKILL.md                            ← este arquivo
├── GUIA_NOVA_UF.md                     ← passo a passo para adicionar PE/MG/SE/ES
└── references/
    ├── _pipeline_generico.py           ← wrapper de alto nível (use este)
    ├── perfis_juridicos.py             ← PERFIS = {'BA_FEDERAL', 'AM_ESTADUAL', 'AL_FEDERAL', 'AL_ESTADUAL', 'MG_ESTADUAL'}
    ├── helpers_redacao.py              ← regras de fonte/redação canônica (compartilhado) — inclui montar_endereco_escritorio_completo, inserir_unidade_apoio_se_faltando, inserir_prioridade_idoso_se_faltando, inserir_pedido_prioridade_idoso_se_faltando
    ├── extrator_procuracao.py          ← OCR de procurações (text-layer + easyocr)
    ├── extrator_hiscon.py              ← parser HISCON com FIM DE DESCONTO + fuzzy + auditoria
    ├── extrator_hiscre.py              ← parser HISCRE
    ├── extrator_calculo.py             ← parser cálculo jurídico
    ├── escritorios.py                  ← procuradores + OABs + endereços + decidir_foro_al
    ├── bancos_canonicos.py             ← CNPJs/endereços de bancos
    ├── helpers_docx.py                 ← run-aware substituição com grifo amarelo
    ├── adaptador_am.py                 ← convenção placeholders AM + classificar_menor
    ├── auditor_dano_moral.py           ← regra dano moral (1 contrato = 15k; 2+ = 5k×N)
    ├── verificador_dados_pessoais.py   ← doc físico vs HISCRE
    ├── seletor_template.py             ← decide entre base/multiplos/refin (BA)
    ├── validar_template.py             ← checklist automático para template novo
    ├── _run_caso_padrao.py             ← TEMPLATE de runner (copiar pra cada cliente)
    ├── _run_demos_ficticias.py         ← gera 9 demos para teste
    ├── _pipeline_caso.py               ← BA Federal (chamado pelo genérico)
    ├── _pipeline_caso_am.py            ← AM Estadual
    └── _pipeline_caso_al.py            ← AL Federal/Estadual
```

Templates `.docx` ficam em
`~/OneDrive/Documentos/Obsidian Vault/Modelos/IniciaisNaoContratado/_templates/`
(10 templates ativos: BA × 3, AM × 2, AL × 4, MG × 1).

## TODOs conhecidos (pendentes de validação prática)

1. **BA sem PDF de cálculo** cai com `R$ 0,00` no valor da causa. Aplicar
   fallback "soma_dobros + dano_moral" (igual ao AL faz).

2. **AM com 2+ contratos do MESMO banco**: o pipeline AM ainda não duplica
   bloco fático. Replicar lógica do AL (`_preencher_bloco_fatico` caminho B
   1banco×N contratos) quando aparecer caso real.

## Contratos VIRTUAIS (procuração tem, HISCON não tem) — regra 2026-05-13

Quando o contrato consta na procuração mas NÃO está no HISCON atual, o
escritório quer **gerar a inicial mesmo assim**, com valores estimados, e
marcar pendência de "juntar HISCON do período do empréstimo".

Use `permitir_contrato_virtual=True` ao chamar `gerar_inicial_padrao`:

```python
gerar_inicial_padrao(
    perfil_chave='AM_ESTADUAL',
    pasta_cliente=...,
    numeros_contrato_explicitos=['123505288054'],   # contrato virtual
    autora=...,
    permitir_contrato_virtual=True,
    contrato_virtual_overrides={
        'data_inclusao':      '01/01/2020',          # estimado (período HISCRE)
        'competencia_inicio': '01/2020',
        'qtd_parcelas':       84,
        'valor_parcela':      56.18,                 # média dos contratos do banco no JSON
        'valor_emprestado':   2500.00,
    },
)
```

A skill cria um contrato VIRTUAL com `_virtual: True` + `_pendencia_hiscon: True`
e segue a geração normal. **Gerar relatório paralelo de pendência** informando
o operador para juntar o HISCON real e atualizar os valores antes do protocolo.

Caso paradigma: EDINA Bradesco (2026-05-13) — 5 procurações, 3 contratos no
HISCON (geradas normais) + 2 virtuais (geradas com estimativa = média dos
3 reais = R$ 56,18; valor causa estimado R$ 26.853,96).

## Regras críticas (não esquecer)

### 1. Polo passivo VARIA conforme jurisdição

| Jurisdição | Polo passivo | Procurador | OAB |
|---|---|---|---|
| **BA — JEF (Federal)** | Banco + **INSS** (TNU TEMA 183 II) | Dr. Gabriel Cardoso de Aguiar | OAB/BA 88973 |
| **AM — TJAM Estadual rito comum** | **Apenas o banco** (sem INSS) | Dr. Patrick Willian da Silva (sempre) | OAB/AM A2638 |
| **AL — JEF (Federal, ≤60 SM)** | Banco + INSS | Dr. Tiago de Azevedo Lima (transição → Alexandre) | OAB/AL 20906A |
| **AL — TJAL Estadual (>60 SM ou sorteio)** | Apenas o banco | Dr. Tiago de Azevedo Lima (transição → Alexandre) | OAB/AL 20906A |
| **MG — TJMG Estadual rito comum** | Apenas o banco | Dr. Alexandre Raizel de Meira | OAB/MG 230436 |

> **REGRA OPERACIONAL AM:** mesmo quando a notificação extrajudicial é assinada por outro procurador do escritório (Eduardo, Gabriel ou Tiago — que constam na procuração), a **inicial AM é sempre protocolada pelo Patrick** porque o sistema PJe/Projudi do TJAM é acessado por ele localmente. Os demais procuradores ficam apenas no instrumento de procuração anexo.

> **Atenção:** quando a jurisdição é Estadual (AM), **NÃO incluir o INSS no polo passivo** nem invocar a fundamentação federal (TNU TEMA 183, legitimidade do INSS, Justiça Federal competente, etc.). Isso já está pré-removido do template `inicial-jeam-*.docx` — não precisa mexer.

**Como decidir a jurisdição:** depende do domicílio do autor + decisão estratégica do escritório. Se o autor reside em comarca AM (Manaus, Maués, Boa Vista do Ramos, Caapiranga, etc.), o template `jeam` é o padrão. Se BA (Salvador, Camaçari, Mata de São João, etc.), `jfba`.

### 2. Renda da parte autora — do extrato INSS ou da base de cálculo do HISCON

`{{valor_renda_liquida}}` é o valor LÍQUIDO do benefício. Fontes possíveis:
- Extrato INSS (preferencial, se anexado pelo cliente)
- HISCON p.2 — campo `BASE DE CÁLCULO` (atenção: é a renda BRUTA — usar se não tiver extrato)
- KIT — declaração de hipossuficiência ou autodeclaração de renda

Se NÃO houver fonte identificável: **NÃO inventar valor padrão**: alertar no relatório paralelo "RENDA NÃO IDENTIFICADA — preencher manualmente" e deixar `[A CONFIRMAR]` no DOCX.

### 3. Cálculo do dano moral — regra fixa do escritório

| Cenário | Valor pleiteado |
|---|---|
| 1 contrato isolado | **R$ 15.000,00** |
| 2+ contratos do mesmo banco | **R$ 5.000,00 × N contratos** |
| Refinanciamento ATIVO | **R$ 15.000,00 + R$ 5.000,00 (dano temporal adicional)** |

### 4. Auditoria do dano moral vs PDF de cálculo

A skill SEMPRE compara o valor calculado pela regra acima com o valor "DANOS MORAIS" extraído do PDF de cálculo:
- BATER: usa o valor calculado, sem alerta.
- DIVERGIR: usa o valor da regra, mas alerta no relatório paralelo:
  > ⚠ Cálculo PDF traz R$ {valor_pdf}; regra do escritório para {N} contratos seria R$ {valor_regra}. CONFERIR antes do protocolo.

### 5. Valor da causa = "Total Geral" do PDF de cálculo

NÃO recalcular. O PDF de cálculo já vem PRONTO do escritório (formato Cálculo Jurídico). Extrair o "Total Geral" da p.2 e usar como `{{valor_causa}}`.

Se o cálculo NÃO bater com a regra do dano moral (ver § 4), alertar mas usar o valor do PDF mesmo (porque é o valor que vai instruir o pedido).

### 6. Bancos canônicos — fonte única de CNPJ + endereço

Toda referência a banco-réu vem do `bancos_canonicos.py` (espelho do `Modelos/IniciaisNaoContratado/bancos-canonicos.md`). 70+ bancos catalogados em 4 jurisdições (Matriz / AL / AM / BA).

Regra de seleção do endereço:
- DEFAULT = matriz (qualquer estado)
- EXCEÇÃO = se opta pelo foro do domicílio do réu (ex.: Maceió/AL), usar a filial do estado correspondente

### 7. Documentos do cliente — estrutura padrão

```
APP - NÃO CONTRATADO/
└── <CLIENTE> - <Procurador>/
    ├── 1. KIT/                                ← KIT COMPLETO (escaneado, OCR easyocr)
    │   ├── KIT COMPLETO.pdf                   ← contém RG/CPF/comp.residência/etc.
    │   ├── AUTODECLARAÇÃO DE RESIDÊNCIA.pdf
    │   ├── TERMO DE CONSENTIMENTO.pdf
    │   └── CONTRATO DE PRESTAÇÃO DE SERVIÇOS.pdf
    └── BANCO XXX/<sub-tese>/                  ← UMA pasta por BANCO
        ├── 2 - PROCURAÇÃO XXX <Nº CONTRATO>.pdf  ← N procurações = N contratos
        ├── 3 - RG.pdf
        ├── 4 - DECLARAÇÃO DE HIPOSSUFICIÊNCIA.pdf
        ├── 5 - DECLARAÇÃO DE BENS MÓVEIS E IMÓVEIS.pdf
        ├── 6 - DECLARAÇÃO DE ISENÇÃO DO IMPOSTO DE RENDA.pdf
        ├── 7 - COMPROVANTE DE RESIDÊNCIA.pdf
        ├── 8 - HISTÓRICO DE EMPRÉSTIMO.pdf    ← HISCON (mesmo de todos os bancos)
        ├── 9 - HISTÓRICO DE CRÉDITO.pdf       ← HISCRE
        └── 10 - CÁLCULO.pdf (ou 9- CÁLCULO)   ← cálculo PRONTO, específico por banco
```

**Sub-tese** = `1 AVERBAÇÃO NOVA INATIVO`, `1 REFINANCIAMENTO INATIVO`, `2 AVERBAÇÃO NOVA INATIVO`, etc. Combinação de:
- Numeração da procuração (1, 2, 3...)
- Origem da operação (`AVERBAÇÃO NOVA` / `REFINANCIAMENTO` / `PORTABILIDADE`)
- Status (`INATIVO` = excluído/encerrado / `ATIVO` = em curso)

### 8. Pasta KIT — usar APENAS para qualificação do autor

A pasta `1. KIT/` (ou variantes) tem documentos pessoais (RG, comp. residência, autodeclaração). É a **fonte primária da qualificação**. Os documentos da pasta de cada banco são repetições/versões + procurações específicas + HISCON + cálculo.

### 9. Auditoria automática pós-geração

Após gerar o DOCX, rodar `auditor.auditar_inicial_gerada()` que detecta:
- Placeholders residuais `{{...}}` não preenchidos
- Valores R$ XXX,XX que parecem caso-específico (verificar contra HISCON+cálculo)
- CNPJs/CPFs/contas/CEPs fora da lista esperada
- Datas fora de jurisprudência

### 9-bis. **OBRIGATÓRIO: hierarquia de fontes para dados pessoais + verificação cruzada**

Para os campos **CPF, RG, nome, data de nascimento, nome da mãe, NB**:

**Hierarquia de fontes (em ordem de prioridade):**

1. **PRIMÁRIA: documento pessoal físico** — RG, CPF, CNH escaneado no KIT do cliente (pasta `1. KIT/` ou `KIT/`). Esta é a fonte que o procurador apresentaria em juízo.
2. **SUBSIDIÁRIA: HISCRE (Histórico de Créditos do INSS)** — usado quando o documento físico não está legível ou faltou. Por ser oficial do INSS, é confiável mas não substitui o documento.
3. **VERIFICAÇÃO CRUZADA OBRIGATÓRIA: comparar SEMPRE entre as fontes** — para detectar:
   - Documento pessoal de OUTRA PESSOA na pasta (ex.: cônjuge, dependente, terceiro)
   - OCR mal-feito do KIT (manuscrito difícil)
   - Divergência entre nome no doc e no HISCRE (caso de homônimo, mudança de nome por casamento, etc.)

**Implementação técnica:**

```python
def verificar_dados_pessoais(autora_do_doc, hiscre):
    """Compara dados extraídos do documento físico (autora_do_doc) com o HISCRE.
    Retorna lista de divergências."""
    divergencias = []
    for campo in ['cpf', 'nome', 'data_nascimento', 'nome_mae']:
        v_doc = autora_do_doc.get(campo)
        v_hiscre = hiscre.get(campo)
        if v_doc and v_hiscre and v_doc != v_hiscre:
            divergencias.append({
                'campo': campo,
                'doc': v_doc,
                'hiscre': v_hiscre,
                'severidade': 'CRÍTICA' if campo in ['cpf', 'nome'] else 'ATENÇÃO',
            })
    return divergencias
```

**No relatório paralelo:** se houver QUALQUER divergência, gerar seção destacada "🚨 DIVERGÊNCIAS DOC vs HISCRE":
- Listar campo, valor do doc, valor do HISCRE
- CRÍTICA → "REVISAR ANTES DE PROTOCOLAR — pode ser documento de outra pessoa"
- ATENÇÃO → "CONFERIR — pode ser homônimo, mudança de nome ou OCR errado"

**Regra de qual valor usar:**
- Se AUTORA preenchida (lida do doc) → usar AUTORA (mesmo se divergir)
- Se AUTORA vazia → usar HISCRE com alerta "Dado extraído do HISCRE (subsidiário). Verifique RG físico do cliente."
- Se ambos vazios → erro fatal: "REVISAR — KIT/HISCRE não fornecem CPF/RG/nome"

### 9-ter. **OBRIGATÓRIO: cruzar procurações com HISCON e usar coluna LITERAL FIM DE DESCONTO**

Dois bugs históricos que NÃO PODEM se repetir (caso paradigma: GEORGE/FACTA, 07/05/2026):

**(a) Filtro de contratos por procuração — fuzzy match e auditoria cruzada**

O filtro do pipeline BA pega o número de contrato a partir do **nome do arquivo** das procurações (`2 - PROCURAÇÃO FACTA 0047032901.pdf` → `0047032901`). Esse nome pode ter typo. No caso GEORGE/FACTA, a procuração `2 - PROCURAÇÃO FACTA 0047633052.pdf` deveria ser `0047033052` (1 dígito errado: `63` vs `03`) — e o pipeline silenciosamente perdia o terceiro contrato.

Defesas obrigatórias (já implementadas em `extrator_hiscon.py`):

1. `filtrar_contratos_por_numero(..., fuzzy_dist=1)` — admite até **1 dígito** de diferença para casar com contrato do mesmo tamanho. Match fuzzy é flagado com `_match_fuzzy` no dict de saída.
2. `auditar_procuracoes_vs_hiscon(contratos_hiscon, numeros_procuracao, banco_codigo)` — cruza:
   - números casados EXATOS;
   - números casados FUZZY (gera alerta);
   - números no HISCON do banco que NÃO foram referidos por nenhuma procuração, classificados em **suspeitos** (data de inclusão a ≤31 dias dos casados ou prefixo idêntico — alta probabilidade de ser irmão esquecido) vs **informativos** (outros contratos do banco em outros períodos);
   - números nas procurações que NÃO estão no HISCON do banco (alerta crítico).

**REGRA OPERACIONAL DE TOLERÂNCIA (Gabriel, 07/05/2026):**

| Procurações com fuzzy match na pasta | Comportamento da skill |
|---|---|
| 0 | Segue silencioso |
| **1** | **Segue + alerta ⚠ ATENÇÃO** (1 typo de 1 dígito é tolerável; provavelmente o procurador renomeou errado) |
| **2 ou mais** | **Segue + alerta 🚨 CRÍTICO**: pode indicar erro sistemático (lote inteiro com typo, mistura com outro cliente, OCR ruim na geração das procurações). NÃO PROTOCOLAR sem revisar TODAS as procurações |

A skill **NUNCA pula contratos silenciosamente** — sempre que há divergência entre nome do arquivo e HISCON, gera alerta visível no relatório paralelo + console. Os alertas vão **na seção de pendências**, em ordem de criticidade. O procurador SEMPRE confere.

**(b) Competência FIM DE DESCONTO — usar a coluna literal do HISCON, não calcular**

O HISCON traz duas colunas que o parser do `analise-cadeias-hiscon` antigamente PULAVA: COMPETÊNCIA INÍCIO DE DESCONTO (col 5, ex.: `06/2021`) e COMPETÊNCIA FIM DE DESCONTO (col 6, ex.: `02/2024`). Antes, a skill estimava a competência fim como `data_exclusao − 1 mês`, o que dava resultado errado quando a exclusão acontecia no MESMO mês do último desconto (resultava em mês a menos).

Solução obrigatória: `analise-cadeias-hiscon/scripts/analisador.py` agora extrai `competencia_inicio_desconto` e `competencia_fim_desconto` direto da tabela. `extrator_hiscon.formatar_contrato_para_template` PRIORIZA esses campos; só cai para o cálculo via `data_exclusao − 1 mês` se a coluna vier vazia (HISCON antigo, antes da mudança da Dataprev).

| Fonte | Prioridade | Observação |
|---|---|---|
| `competencia_fim_desconto` (col 6 do HISCON) | **1ª — autoritativa** | string `'mm/yyyy'` |
| `data_exclusao − 1 mês` | 2ª (fallback) | quando a coluna 6 está vazia |
| `comp_inicio + qtd_parcelas − 1` | 3ª (contrato ATIVO sem exclusão) | só para Ativos |

### 9-quater. **OBRIGATÓRIO: a PROCURAÇÃO é a única fonte autoritativa dos contratos a impugnar**

Caso paradigma: EDMUNDA LIMA DOS SANTOS (07/05/2026). Pasta tinha:
- `2 - Procuração — N°1.pdf` (1 procuração, sem número no nome)
- HISCON com 2 contratos do BANCO BRADESCO

A skill pegou silenciosamente os 2 contratos do banco. Mas a procuração outorgava poderes apenas sobre **1 contrato** (`0123527065102`) — o segundo contrato do HISCON não estava autorizado. Isso resultou em uma inicial fora do escopo do mandato.

**Regra fundamental gravada (não pode ser violada):**

> A procuração é a **ÚNICA fonte autoritativa** do que o cliente nos autorizou a impugnar. NUNCA assumir contratos sem confirmação na procuração. NUNCA pegar "todos os contratos do banco" como fallback silencioso.

**Hierarquia obrigatória de extração** (em ordem de tentativa):

1. **Número no nome do arquivo da procuração** — ex.: `2 - PROCURAÇÃO FACTA 0047032901.pdf`. Pipeline lê via regex.
2. **Número no CONTEÚDO da procuração** (text-layer do PDF) — ex.: "ajuizar ação referente ao Contrato n° 0123527065102". Pipeline tenta `pymupdf.get_text()`.
3. **OCR via EasyOCR no PDF escaneado** — para procurações que vêm em scan sem text-layer. Roda em pt-BR com resolução até 2400px.
4. **`numeros_contrato_explicitos=[...]`** — parâmetro do chamador. Use quando o procurador leu manualmente e quer passar diretamente.

**Comportamento se TODAS as 4 fontes falharem:**

```python
raise ProcuracaoSemFiltroError(
    "🚨 IMPOSSÍVEL extrair números de contrato. AÇÃO: abrir o PDF "
    "manualmente e passar via numeros_contrato_explicitos=[...]. "
    "NUNCA pegamos 'todos os contratos do banco' como fallback."
)
```

A skill **PARA o pipeline** e o procurador precisa intervir. Isso evita gerar inicial com contratos não outorgados.

**Implementado nos 3 pipelines (atualizado 07/05/2026):**
- `extrator_procuracao.py` — extrator OCR (text-layer + EasyOCR fallback)
- `_pipeline_caso.py` (BA) — `ProcuracaoSemFiltroError`
- `_pipeline_caso_al.py` (AL) — `ProcuracaoSemFiltroError`
- `_pipeline_caso_am.py` (AM) — `ProcuracaoSemFiltroError` (caso paradigma adicional: FABIO/C6)

### 9-quinquies. **REDAÇÃO CANÔNICA: helpers_redacao.py compartilhado pelos 3 pipelines**

Para garantir que as MESMAS regras de formatação valem em BA/AM/AL, todos os pipelines importam de `helpers_redacao.py`:

| Função | O que faz |
|---|---|
| `make_run` | cria `<w:r>` com fonte/bold/grifo controlados; aceita `usar_rstyle_titulo` (apenas para nomes em destaque, NÃO usar em cabeçalho — gera caps automático) e `tamanho_pt` (sz em meio-pontos) |
| `substituir_qualificacao_autor` | reescreve qualificação com NOME (Segoe UI Bold via rStyle 2TtuloChar) + resto Cambria; conjugação f/m automática; omite estado_civil/RG vazios; recebe `end_escritorio` da `montar_endereco_escritorio_completo(uf)` |
| `substituir_polo_passivo` | reescreve polo passivo com NOMES (banco + INSS) em Segoe UI Bold + resto Cambria |
| `substituir_intro_contratos` | reescreve "tomou conhecimento dos descontos referentes a empréstimo(s)..." com BANCO e CONTRATO Nº em **Cambria Bold + CAPS** (regra fixa 07/05/2026 — substituiu Segoe UI Bold via rStyle); aplica `<w:highlight>` amarelo |
| `modalidade_extenso` | mapeia `tipo_origem` → 'empréstimo' / 'refinanciamento' / 'empréstimo (portabilidade)' |
| `preencher_pedidos_declaratorios` | reescreve "Declarar a inexistência do empréstimo/refinanciamento..." com escolha automática + dados reais; **duplica o parágrafo para N contratos** (1 pedido por contrato); detecta layout MG (sub-itens) vs BA/AM/AL e despacha para `_preencher_pedidos_formato_mg` quando necessário |
| `preencher_bloco_fatico_formato_mg` | preenche o bloco "Do contrato nº A:" do template MG com sub-itens por contrato |
| `remover_prioridade_pedidos` | remove o pedido de prioridade idoso quando autor não é idoso |
| `inserir_unidade_apoio_se_faltando` | padroniza endereço hardcoded dos templates BA/AM substituindo run-aware por `montar_endereco_escritorio_completo(uf)` (matriz Joaçaba/SC + unidade de apoio na UF do cliente). Idempotente: se o parágrafo já tem o endereço composto correto, não duplica |
| `inserir_prioridade_idoso_se_faltando` | quando autor é idoso, INSERE no cabeçalho o parágrafo "Prioridade de tramitação: art. 1.048 do Código de Processo Civil (Idoso)" em **Cambria 11pt + alinhamento à direita + recuo esquerdo de 4cm (ind=2268 twips)** + grifo amarelo |
| `inserir_pedido_prioridade_idoso_se_faltando` | quando autor é idoso, INSERE como item I da lista numerada de pedidos o pleito "A prioridade na tramitação..." em **Cambria Bold + grifo amarelo**, herdando o `pPr` (pStyle=5Listaalfabtica) do primeiro item da lista para entrar na renumeração automática |

**Regra de fontes — NUNCA violar:**

| Tipo de conteúdo | Fonte/estilo |
|---|---|
| Cabeçalho/endereçamento ('Ao Juízo...') | **Segoe UI Bold INLINE** (NÃO usar rStyle 2TtuloChar — tem caps automático) |
| Nome do AUTOR (qualificação) | **Segoe UI Bold via rStyle 2TtuloChar** (caps + bold do estilo do template) |
| Nome do BANCO no POLO PASSIVO | **Segoe UI Bold via rStyle 2TtuloChar** |
| Nome do INSS (Federal) no polo passivo | **Segoe UI Bold via rStyle 2TtuloChar** |
| BANCO + CONTRATO Nº na INTRO FÁTICA ("tomou conhecimento dos descontos…") | **Cambria Bold + CAPS** (regra fixa 07/05/2026 — substituiu Segoe UI rStyle) |
| Cabeçalho "Prioridade de tramitação: art. 1.048…" (idoso) | **Cambria 11pt + alinh. direita + recuo esquerdo 4cm (ind=2268 twips)** + grifo amarelo |
| Pedido "A prioridade na tramitação…" (idoso) | **Cambria Bold + pStyle 5Listaalfabtica** (entra na numeração romana I) + grifo amarelo |
| Resto da qualificação/polo passivo/intro | **Cambria** |
| Toda alteração da skill | **highlight amarelo** |

### 9-sexies. **REGRAS CANÔNICAS DE ENDEREÇO E PRIORIDADE IDOSO (gravadas 07/05/2026)**

Quatro regras fixas do escritório, propagadas por TODOS os pipelines (BA + AM + AL + MG) via `helpers_redacao.py`. Aplicadas automaticamente — não requerem configuração por caso.

**(1) Endereço do escritório — matriz Joaçaba/SC SEMPRE primeiro + unidade de apoio na UF do cliente**

Toda inicial deve trazer no parágrafo de qualificação do autor:

> "…com escritório profissional em **Rua Frei Rogério, 541, Centro, Joaçaba/SC, CEP 89600-000, e unidade de apoio em [endereço completo da filial da UF do cliente]**, local onde recebem avisos e intimações, vem…"

A função `escritorios.montar_endereco_escritorio_completo(uf)` retorna a string composta correta. Mapa de filiais por UF (`FILIAL_APOIO_POR_UF` em `escritorios.py`):

| UF do cliente | Filial de apoio | Endereço |
|---|---|---|
| BA / ES | Salvador/BA | Rua Portugal, 5, Ed. Status, Comércio, CEP 40015-903 |
| AM | Maués/AM | Travessa Michiles, S/N, Centro, CEP 69190-000 |
| AL / SE | Arapiraca/AL | Rua Nossa Senhora da Salete, 597, Sala 04, Itapuã, CEP 57314-175 |
| MG | Uberlândia/MG | Av. Floriano Peixoto, 615, Ed. Floriano Center, Loja 07, Térreo, Centro, CEP 38400-102 |
| SC | (nenhuma — é a matriz) | só matriz |

**Implementação:**
- Pipeline AL (e MG via `uf_override='MG'`): chama `montar_endereco_escritorio_completo(uf)` direto em `_substituir_qualificacao` antes de `substituir_qualificacao_autor`.
- Pipelines BA + AM: chamam `inserir_unidade_apoio_se_faltando(doc, uf)` ao final do `gerar_inicial`. O helper detecta o trecho hardcoded do template (3 padrões cobertos) e substitui run-aware preservando os placeholders restantes do parágrafo.
- Caso especial AM com REPRESENTANTE LEGAL: o pipeline já constrói o parágrafo de qualificação do zero usando `montar_endereco_escritorio_completo('AM')`.

**(2) Cabeçalho de prioridade — Cambria 11pt + alinhamento à direita + recuo esquerdo de 4cm**

Quando o autor é idoso (`eh_idoso=True`), inserir LOGO ABAIXO do cabeçalho "Ao Juízo…" o parágrafo:

> "Prioridade de tramitação: art. 1.048 do Código de Processo Civil (Idoso)."

**Formatação OOXML obrigatória** (não negociável):

```xml
<w:p>
  <w:pPr>
    <w:ind w:left="2268"/>          <!-- 4cm = 2268 twips -->
    <w:jc w:val="right"/>           <!-- alinhamento DIREITA -->
  </w:pPr>
  <w:r>
    <w:rPr>
      <w:rFonts w:ascii="Cambria" w:hAnsi="Cambria"/>
      <w:sz w:val="22"/>            <!-- sz em meio-pontos: 22 = 11pt -->
      <w:szCs w:val="22"/>
      <w:highlight w:val="yellow"/>
    </w:rPr>
    <w:t xml:space="preserve">Prioridade de tramitação: art. 1.048 do Código de Processo Civil (Idoso).</w:t>
  </w:r>
</w:p>
```

Implementado em `inserir_prioridade_idoso_se_faltando(doc, eh_idoso, grifo)`. Idempotente — se o parágrafo já existe, não duplica.

**(3) BANCO + CONTRATO Nº na intro fática — Cambria Bold + CAPS (NÃO mais Segoe UI)**

A intro do bloco fático ("Nessa oportunidade, após informações, tomou conhecimento dos descontos referentes a empréstimo que não contratou junto ao **BANCO X**, **CONTRATO Nº 1234567**:") deve sair em:

- `<w:rFonts w:ascii="Cambria"/>` (não Segoe UI)
- `<w:b/><w:bCs/>` (BOLD)
- Texto em CAIXA ALTA (chamada `.upper()` no helper)
- `<w:highlight w:val="yellow"/>`
- **NÃO** usar `<w:rStyle w:val="2TtuloChar"/>` (que é Segoe UI Bold com caps automático do estilo)

Helper: `substituir_intro_contratos(p_elem, nome_banco, numeros, grifo)`. Funciona idêntico para 1, 2 ou N contratos (ajusta singular/plural e usa "e" para o último item).

**(4) Pedido de prioridade — em BOLD, herdando pStyle do primeiro item da lista numerada**

Quando o autor é idoso, INSERIR como item I da lista numerada de pedidos:

> "**A prioridade na tramitação, tendo em vista que a parte autora é pessoa idosa, nos termos do art. 1.048, inciso I, do Código de Processo Civil;**"

**Estratégia técnica:**
1. Localizar o primeiro parágrafo da lista após "DOS PEDIDOS" cujo `pStyle` contenha "Lista" (pStyle padrão: `5Listaalfabtica`).
2. `deepcopy` desse `pPr` (preserva numeração romana automática I, II, III).
3. Inserir o novo parágrafo ANTES dele (vira o novo item I; Word renumera automaticamente).
4. Texto em **`<w:b/><w:bCs/>` Cambria + grifo amarelo**.

Implementado em `inserir_pedido_prioridade_idoso_se_faltando(doc, eh_idoso, grifo)`. Idempotente.

**Casos paradigma das 4 regras:** JOSE DELI JORGE PEREIRA (3 bancos MG: DAYCOVAL, PARANÁ, SENFA), JOÃO PEDRO DA SILVA (PARANÁ MG), JOSÉ JESUS DA COSTA (PAN MG × 2 processos) — todos validados em 07/05/2026 com 4/4 ajustes presentes.

### 10. **OBRIGATÓRIO: grifar (highlight amarelo) TODAS as alterações da skill**

Toda substituição de placeholder e todo conteúdo INJETADO pela skill no DOCX gerado **DEVE** receber `<w:highlight w:val="yellow"/>`. Isso permite ao procurador a revisão visual rápida das alterações.

Áreas grifadas:
- Substituição de placeholders comuns (qualificação autor, banco-réu, benefício, valores, datas)
- Conteúdo gerado para blocos repetíveis (síntese fática por contrato + DECLARAR por contrato)
- Listas montadas pela skill (`{{contratos_lista_breve}}`)
- Resultado da remoção do marcador `{{SE_IDOSO}}` (quando autor é idoso, o texto restante fica grifado)

NÃO grifar:
- Texto fixo do template (toda a fundamentação jurídica, preliminares, jurisprudência)
- Nome/OAB do procurador (fixo)

**SEMPRE grifar (mesmo que pareça "fixo"):**
- Endereço do escritório (matriz + unidade de apoio): a skill **substitui** o trecho hardcoded do template via `inserir_unidade_apoio_se_faltando(doc, uf)` para deixar dinâmico por UF do cliente; como é alteração da skill, recebe grifo amarelo.
- Cabeçalho de prioridade idoso: inserido pela skill quando `eh_idoso=True`.
- Pedido de prioridade idoso: idem.

Implementação técnica: o helper `substituir_in_run(p, mapa, grifo=True)` aplica o highlight automaticamente nos caracteres SUBSTITUÍDOS (não nos preexistentes). Para runs criados manualmente (ex.: polo passivo com 5 runs separados, blocos repetíveis duplicados), aplicar `<w:highlight w:val="yellow"/>` no rPr antes de inserir no XML.

### 9-terdecies. **PLANILHA DE CÁLCULO DE INDÉBITO em EXCEL (gravado 13/05/2026, refinado mesma data)**

A planilha de cálculo do indébito é gerada pela **skill `kit-juridico`** (na fase F — montar estrutura), uma por pasta de ação. A skill `inicial-nao-contratado` **lê** esse Excel para usar o TOTAL GERAL como valor da causa, em vez de estimar.

**Fluxo do fluxo (gravado 13/05/2026):**

```
kit-juridico fase F (organizar)              inicial-nao-contratado
─────────────────────────────────             ────────────────────────
  para cada pasta de ação:                    para cada inicial:
    cria pasta BENEFÍCIO/BANCO/                 procura CALCULO_INDEBITO.xlsx
    copia procurações                          se achou:
    copia docs comuns                            lê TOTAL GERAL DA AÇÃO
    grifa HISCON                                 usa como valor_causa
    gera ESTUDO.docx                           senão:
    gera CALCULO_INDEBITO.xlsx  ←──┐            usa PDF de cálculo ou estima
                                    │              + gera fallback CALCULO_<base>.xlsx
                                    └─────────  decide foro AL pelo valor
```

**Hierarquia de leitura do valor da causa** (em `_pipeline_caso_al.py`):

1. **`CALCULO_INDEBITO.xlsx`** na pasta de ação → autoritativo (kit-juridico)
2. **Qualquer `CALCULO_*.xlsx`** na pasta (compatibilidade com Excels gerados pela inicial em sessões anteriores)
3. **PDF de cálculo** (legado — formato Cálculo Jurídico)
4. **Estimativa**: soma dos dobros + dano moral

**Helpers em `_common/calculadora_indebito.py`:**

| Função | Uso |
|---|---|
| `gerar_excel_indebito(contratos, cliente_nome, output_path)` | Gera planilha completa |
| `calcular_contrato(contrato)` | Cálculo isolado de 1 contrato |
| `calcular_dano_moral(n_contratos)` | R\$ 15k (1) ou R\$ 5k×N (2+) |
| `ler_total_geral_xlsx(path)` | Lê TOTAL GERAL DA AÇÃO de um Excel |
| `localizar_excel_indebito(pasta)` | Busca CALCULO_INDEBITO.xlsx → qualquer CALCULO_*.xlsx |

**Para que a inicial use o Excel correto:** o usuário deve rodar a `kit-juridico` PRIMEIRO (que organiza pasta + gera Excel canônico), depois rodar a inicial.

---

**(Conteúdo histórico abaixo — implementação V1, antes da migração para kit-juridico):**

Junto com cada inicial AL/MG/AM/BA (consignado, RMC, RCC), a skill agora gera automaticamente uma **planilha Excel `CALCULO_<nome>.xlsx`** na mesma pasta do DOCX, com cálculo detalhado mensal dos descontos atualizados.

**Regime fixo** (conforme pedido nas iniciais do escritório):
* **Correção monetária:** INPC (responsabilidade civil — STJ Tema 905)
* **Juros de mora:** 1% a.m. simples (juros legais — art. 406 CC c/c CTN)
* **Dobro:** art. 42, p. único, CDC
* **Dano moral:** R\$ 15.000 (1 contrato) ou R\$ 5.000 × N contratos (2+)

**Estrutura da planilha:**

* **Aba `RESUMO`** — uma linha por contrato com totais (descontado, corrigido+juros, em dobro), linha SUBTOTAL com soma, linha DANO MORAL e linha **TOTAL GERAL DA AÇÃO** (subtotal em dobro + dano moral).
* **Aba por contrato** — tabela mensal de cada parcela descontada com: competência, valor original, fator INPC, valor corrigido, meses para juros, juros 1% a.m., total simples e total em dobro.

**Arquivos da implementação:**

| Arquivo | Conteúdo |
|---|---|
| `skills/_common/dados/inpc_bcb_serie188.json` | Tabela INPC mensal oficial BCB (jan/2017 em diante). Atualizar periodicamente via API BCB. |
| `skills/_common/indices_oficiais.py` | `inpc_acumulado_entre()`, `corrigir_inpc()`, `juros_simples_mes()` |
| `skills/_common/calculadora_indebito.py` | `calcular_contrato()`, `calcular_dano_moral()`, `gerar_excel_indebito()` |
| `_pipeline_caso_al.py` linha 1149 | Hook após `doc.save()` que chama `gerar_excel_indebito()` |

**Não se aplica a:** skill `inicial-bradesco` (Patrick AM — Bradesco encargos/tarifas/capitalização/PE tem regime próprio, cálculo é feito por outra rota).

**Atualização periódica do INPC:**

```bash
curl -sL "https://api.bcb.gov.br/dados/serie/bcdata.sgs.188/dados?formato=json&dataInicial=01/01/2017&dataFinal=31/12/2026" \\
     -o skills/_common/dados/inpc_bcb_serie188.json
```

### 9-undecies. **REGRA DE CIDADE FIXA AL → SEMPRE JEF FEDERAL (gravado 13/05/2026)**

Decisão operacional do escritório: clientes residentes em **Viçosa/AL**, **São Sebastião/AL** ou **Traipu/AL** **sempre ajuízam no JEF Federal**, independente do valor da causa. Quando o valor excede 60 SM (R\$ 91.080), inclui-se pedido expresso de **renúncia ao excedente** (Art. 17, § 4º, Lei 10.259/01).

**Implementação:** `escritorios.cidade_forca_foro_federal(cidade)` retorna True para essas 3 cidades (com normalização Unicode tolerante a acento/maiúsculas). A função `decidir_foro_al(valor, forcar, cidade_autor)` aplica a hierarquia:

1. `forcar` (override manual via `perfil_chave='AL_FEDERAL'` ou `'AL_ESTADUAL'`) — sempre vence
2. `cidade_autor` em `CIDADES_AL_SEMPRE_FEDERAL` — JEF Federal com renúncia se > 60 SM
3. Valor da causa ≤ 60 SM → Federal; > 60 SM → Estadual

Quando a regra de cidade impõe Federal mas o valor excede 60 SM, retorna `renuncia_ao_excedente=True` e o pipeline acrescenta alerta na inicial: *"INICIAL DEVE CONTER PEDIDO EXPRESSO DE RENÚNCIA AO EXCEDENTE (Art. 17, § 4º, Lei 10.259/01)"*.

**Para usuário:** ao gerar inicial, passar `perfil_chave='AL_FEDERAL'` para clientes dessas 3 cidades — independente do valor. Se passar `AL_ESTADUAL`, o `forcar` vence (você se responsabiliza pela decisão).

### 9-duodecies. **BLOCO FÁTICO MÚLTIPLOS CONTRATOS: cabeçalho numerado + sub-itens (gravado 13/05/2026, ajuste fino noite 13/05/2026)**

Caso paradigma: ANAIZA PENSAO ITAU (10 contratos a–j).

Mudança no layout do bloco fático quando há ≥2 contratos do mesmo banco:

**Antes (até 12/05/2026):**
```
a) No que diz respeito ao referido empréstimo, cumpre informar que a primeira
   parcela descontada... contrato n° 622902175, cuja operação foi realizada...
b) No que diz respeito ao referido empréstimo, cumpre informar que a primeira
   parcela descontada... contrato n° 626302197, cuja operação foi realizada...
```

Repetição do "No que diz respeito ao referido empréstimo, cumpre informar que" em CADA bloco gerava texto pesado e redundante.

**Agora (13/05/2026):**
```
4. No que diz respeito ao referido empréstimo, cumpre informar:           ← NUMERADO (4.)
   a) o contrato de nº 622902175: a primeira parcela descontada...        ← BOLD em "a) o contrato de nº 622902175:"
   b) o contrato de nº 626302197: a primeira parcela descontada...        ← BOLD em "b) o contrato de nº 626302197:"
   ...
```

Estrutura:
- **Cabeçalho NUMERADO** ("4. No que diz respeito ao referido empréstimo, cumpre informar:") — mantém o `numPr` original do parágrafo template, continuando a numeração da lista da inicial (1./2./3./4.).
- **N sub-itens SEM numeração** mas com `[letra]) o contrato de nº NNN:` em **NEGRITO** — destaca visualmente cada contrato.

**Implementação em `_pipeline_caso_al.py:_preencher_bloco_fatico` (caminho B):**

1. **Cabeçalho criado ANTES do loop de remoção de `numPr`** (senão herda elementos sem numPr):
   - `deepcopy(elem_template)` preservando `pPr` completo (com `numPr` → ganha "4." automático)
   - Limpa só os `<w:r>` (runs) do deepcopy
   - Adiciona novo run com texto fixo "No que diz respeito ao referido empréstimo, cumpre informar:"
   - Insere ANTES de `elem_template`

2. **Loop de remoção de `numPr`/`pStyle` de lista APENAS nos sub-itens** (elementos = cópias). O cabeçalho criado acima fica fora do loop e preserva sua numeração.

3. **Cada sub-item:**
   - Substitui "No que diz respeito ao referido empréstimo, cumpre informar que a primeira parcela" → "[letra]) o contrato de nº [NUM]: a primeira parcela"
   - Remove "contrato n° xxxxxxx, " do meio (número já apareceu no início, evita duplicidade)
   - Após todas as substituições, chama `_aplicar_bold_inicio(elem, "[letra]) o contrato de nº [NUM]:")` — função interna que quebra o primeiro `<w:r>` em 2: um run BOLD (prefixo) + um run normal (resto), preservando fonte/grifo.

Para N=1 (1 só contrato) NÃO se aplica — o parágrafo singular fica como está.

### 9-septies. **TEMPLATES AL/MG: literais piloto + xxxxx no bloco fático (gravado 12/05/2026)**

Caso paradigma: ANAIZA / ANTONIO / CICERO (AL_FEDERAL e AL_ESTADUAL, 12/05/2026).

Dois bugs simultâneos que rebentam iniciais AL/MG silenciosamente — gravados aqui para nunca mais voltar:

**(1) Templates AL (`inicial-jfal-1banco`, `inicial-jfal-2bancos`, `inicial-jeal-1banco`, `inicial-jeal-2bancos`) e MG (`inicial-jemg-1banco`) NÃO podem ter placeholders `{{nome_autor}}`/`{{banco_reu_nome}}`/etc.**

O pipeline `_pipeline_caso_al.py` faz substituições **TARGETED no DOCX usando string matching dos textos literais do caso piloto** (FULANO DE TAL, BANCO BRADESCO, NB 149.139.433-9, etc.). Templates parametrizados com `{{...}}` quebram o pipeline porque os padrões regex/contains não encontram o que esperam.

Se você (ou alguém) parametrizar um template AL/MG no vault, o pipeline gera DOCX com placeholders intactos e qualificação/polo passivo/intro vazios. **Sempre manter os templates AL/MG na versão LITERAL do caso piloto** — o pipeline reescreve em cima dos literais.

**Onde estão os backups da versão literal correta:**

```
C:\Users\gabri\OneDrive\Documentos\Obsidian Vault\Modelos\IniciaisNaoContratado\_templates\
├── inicial-jfal-1banco.docx                          ← USAR
├── inicial-jfal-1banco.docx.bak_pre_parametrizacao   ← backup literal seguro
├── inicial-jfal-1banco.docx.bak_pre_pente_fino       ← versão {{}} ruim (não usar)
├── inicial-jfal-1banco.docx.parametrizado_<DATA>     ← snapshot quando deu errado
```

Se aparecer `{{placeholders}}` em DOCX gerado, restaurar template do `.bak_pre_parametrizacao` e regerar.

**(2) Bloco fático "No que diz respeito ao referido empréstimo..." deve es

…(truncated)
