Pular para conteúdo

Plano de implementação — 0058, a documentação começa pelo andamento

For agentic workers: REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (- [ ]) syntax for tracking.

Goal: o site de documentação abre no Andamento (gerado no build) e segue a ordem Roadmap → Especificações → Arquitetura → Implementação → Guias.

Architecture: um hook do MkDocs (docs/hooks/andamento.py) lê as notas de versão de apps/web/src/versoes/, o catálogo docs/metadata/catalog.yaml e o docs/roadmap.md, e substitui marcadores HTML (<!-- andamento -->, <!-- implementacao:<elemento> -->) por Markdown gerado no evento on_page_markdown. A lógica fica em funções puras testadas com pytest; o resto é conteúdo Markdown e a navegação do mkdocs.yml.

Tech Stack: MkDocs 1.6 + Material 9.5 (hooks nativos), Python 3.12, PyYAML, markdown.extensions.toc.slugify, pytest.

Spec: specification.md — leia junto; este plano argumenta a partir dela.

Global Constraints

  • Nenhum arquivo existente de docs/ muda de caminho (RN8) — só mkdocs.yml (nav) e conteúdo.
  • O build é mkdocs build --strict; qualquer link quebrado falha.
  • Fonte ausente (pasta de notas, catálogo, seção "❌ Ausente" ou "Plano de entregas" do roadmap) falha o build com mensagem que nomeia a fonte (RN5).
  • Ordem de versões é semântica (0.10.0 > 0.9.1), não por nome de arquivo (RN2).
  • "Em andamento" = type em specification/fix com status em rascunho, aprovada, em-implementacao (RN3).
  • Texto do site em português do Brasil; nenhum commit/push sem pedido explícito do usuário (CLAUDE.md).
  • apps/api, apps/web, apps/e2e não mudam.

Review Focus

  • Nota de versão com item em várias linhas (continuação indentada) — o item sai inteiro, numa linha só.
  • Arquivo não-versão na pasta de notas (index.ts, rascunho.md) — ignorado, sem erro.
  • Título de roadmap com emoji e acento (### 1. Sinistro — processo inteiro) — a âncora gerada é a mesma do sumário do MkDocs, e o link abre a seção.
  • Catálogo com entrada sem components ou sem status — ignorada nas contagens, sem KeyError.
  • Página sem marcador nenhum — o hook não toca o Markdown dela.

Cada uma tem teste na Task 1.


Task 1: as funções puras do hook

Files: - Create: docs/hooks/andamento.py - Create: docs/hooks/test_andamento.py - Create: docs/hooks/fixtures/versoes/0.9.1.md, docs/hooks/fixtures/versoes/0.10.0.md, docs/hooks/fixtures/versoes/0.8.0.md, docs/hooks/fixtures/versoes/index.ts - Create: docs/hooks/fixtures/catalog.yaml - Create: docs/hooks/fixtures/roadmap.md - Modify: .gitignore (acrescentar .venv-docs/)

Interfaces: - Produces (usadas na Task 2): - ler_notas(pasta: Path) -> list[Nota] — Nota = (versao: tuple[int,int,int], texto_versao: str, data: str | None, itens: list[str]), em ordem decrescente de versão; FonteAusente se a pasta não existe. - ler_catalogo(arquivo: Path) -> list[dict]; FonteAusente se não existe. - ler_proximos(roadmap: Path) -> list[tuple[str, str]] — (titulo, ancora) dos ### sob ## ❌ Ausente e ## Plano de entregas…; FonteAusente se o arquivo ou uma das duas seções falta. - montar_andamento(notas, catalogo, proximos) -> str — o Markdown da página. - montar_feito(catalogo, componente: str) -> str — lista Markdown das specs concluida e fixes corrigido com aquele componente. - class FonteAusente(Exception).

  • [ ] Step 1: Ambiente de teste
cd /opt/garantora
python3 -m venv .venv-docs
.venv-docs/bin/pip install -q -r requirements-docs.txt pytest
grep -qx '.venv-docs/' .gitignore || echo '.venv-docs/' >> .gitignore

scripts/publicar-preview-docs.sh já usa .venv-docs quando ela existe.

  • [ ] Step 2: Fixtures

docs/hooks/fixtures/versoes/0.10.0.md:

data: 2026-10-13

- **Mensalidade por tipo.** Em *Parâmetros*, a mensalidade passa a ter
  uma faixa por tipo de inquilino.
- Segundo item.
docs/hooks/fixtures/versoes/0.9.1.md:
data: 2026-10-01

- Correção do seletor.
docs/hooks/fixtures/versoes/0.8.0.md:
- Sem data nesta nota.
docs/hooks/fixtures/versoes/index.ts:
export {};
docs/hooks/fixtures/catalog.yaml:
- id: SPEC-0001
  type: specification
  title: "Concluída de API"
  path: specifications/0001-a/specification.md
  status: concluida
  components: [api, web]
- id: SPEC-0002
  type: specification
  title: "Em implementação"
  path: specifications/0002-b/specification.md
  status: em-implementacao
  components: [web]
- id: FIX-0001
  type: fix
  title: "Fix corrigido"
  path: fixes/0001-c.md
  status: corrigido
  components: [api]
- id: FIX-0002
  type: fix
  title: "Fix em rascunho"
  path: fixes/0002-d.md
  status: rascunho
- id: ADR-0001
  type: decision
  title: "Uma ADR"
  path: decisions/ADR-0001.md
  status: aceita
- id: SPEC-0003
  type: specification
  title: "Sem status"
  path: specifications/0003-e/specification.md
docs/hooks/fixtures/roadmap.md:
# Roadmap

## ✅ Implementado

### Não entra

## ❌ Ausente

### 1. Sinistro — processo inteiro

texto

### 2. Emissão de boleto

## Plano de entregas — validar a jornada por incrementos

### Trilha da jornada (sequencial)

## Dívida técnica conhecida

  • [ ] Step 3: Escrever os testes que falham

docs/hooks/test_andamento.py:

from pathlib import Path

import pytest

from andamento import (
    FonteAusente,
    ler_catalogo,
    ler_notas,
    ler_proximos,
    montar_andamento,
    montar_feito,
)

F = Path(__file__).parent / "fixtures"


def test_notas_em_ordem_semantica_e_ignora_nao_versao():
    notas = ler_notas(F / "versoes")
    assert [n.texto_versao for n in notas] == ["0.10.0", "0.9.1", "0.8.0"]


def test_nota_com_data_e_item_de_varias_linhas():
    nota = ler_notas(F / "versoes")[0]
    assert nota.data == "2026-10-13"
    assert nota.itens[0] == (
        "**Mensalidade por tipo.** Em *Parâmetros*, a mensalidade passa a ter "
        "uma faixa por tipo de inquilino."
    )
    assert nota.itens[1] == "Segundo item."


def test_nota_sem_data_nao_inventa():
    assert ler_notas(F / "versoes")[2].data is None


def test_proximos_sao_os_h3_das_duas_secoes_com_ancora_do_mkdocs():
    proximos = ler_proximos(F / "roadmap.md")
    assert proximos == [
        ("1. Sinistro — processo inteiro", "1-sinistro-processo-inteiro"),
        ("2. Emissão de boleto", "2-emissao-de-boleto"),
        ("Trilha da jornada (sequencial)", "trilha-da-jornada-sequencial"),
    ]


@pytest.mark.parametrize(
    "fonte",
    [
        lambda: ler_notas(F / "nao-existe"),
        lambda: ler_catalogo(F / "nao-existe.yaml"),
        lambda: ler_proximos(F / "nao-existe.md"),
    ],
)
def test_fonte_ausente_falha_nomeando_o_caminho(fonte):
    with pytest.raises(FonteAusente, match="nao-existe"):
        fonte()


def test_roadmap_sem_secao_falha(tmp_path):
    r = tmp_path / "roadmap.md"
    r.write_text("# Roadmap\n\n## ❌ Ausente\n\n### X\n", encoding="utf-8")
    with pytest.raises(FonteAusente, match="Plano de entregas"):
        ler_proximos(r)


def test_andamento_mostra_versao_no_ar_abertos_proximos_e_numeros():
    md = montar_andamento(
        ler_notas(F / "versoes"), ler_catalogo(F / "catalog.yaml"), ler_proximos(F / "roadmap.md")
    )
    assert "**0.10.0** — 2026-10-13" in md
    assert "[SPEC-0002 — Em implementação](specifications/0002-b/specification.md)" in md
    assert "[FIX-0002 — Fix em rascunho](fixes/0002-d.md)" in md
    assert "SPEC-0001" not in md.split("## Números")[0].split("## Em andamento")[1]
    assert "[1. Sinistro — processo inteiro](roadmap.md#1-sinistro-processo-inteiro)" in md
    assert "| Specs concluídas | 1 |" in md
    assert "| Fixes corrigidos | 1 |" in md
    assert "| Versões publicadas | 3 |" in md


def test_andamento_sem_trabalho_aberto():
    catalogo = [e for e in ler_catalogo(F / "catalog.yaml") if e.get("status") not in
                {"rascunho", "aprovada", "em-implementacao"}]
    md = montar_andamento(ler_notas(F / "versoes"), catalogo, ler_proximos(F / "roadmap.md"))
    assert "Nenhum trabalho aberto." in md


def test_feito_por_componente_ignora_entrada_sem_components():
    md = montar_feito(ler_catalogo(F / "catalog.yaml"), "api")
    assert "[SPEC-0001 — Concluída de API](specifications/0001-a/specification.md)" in md
    assert "[FIX-0001 — Fix corrigido](fixes/0001-c.md)" in md
    assert "SPEC-0002" not in md

  • [ ] Step 4: Rodar e ver falhar

Run: cd docs/hooks && ../../.venv-docs/bin/pytest -q Expected: FAIL — ModuleNotFoundError: No module named 'andamento'.

  • [ ] Step 5: Implementar

docs/hooks/andamento.py:

"""Spec 0058 — gera o Andamento e o "feito" da Implementação no build do MkDocs.

Funções puras (ler e montar) testadas em ``test_andamento.py``; o evento do MkDocs só troca
marcadores no Markdown da página. Fonte ausente falha o build (RN5): uma página de
andamento vazia passaria por verdadeira.
"""

from __future__ import annotations

import re
from pathlib import Path
from typing import NamedTuple

import yaml
from markdown.extensions.toc import slugify

ABERTOS = {"rascunho", "aprovada", "em-implementacao"}
_VERSAO = re.compile(r"^(\d+)\.(\d+)\.(\d+)\.md$")


class FonteAusente(Exception):
    """Uma das fontes do Andamento não existe — o build tem de parar."""


class Nota(NamedTuple):
    versao: tuple[int, int, int]
    texto_versao: str
    data: str | None
    itens: list[str]


def ler_notas(pasta: Path) -> list[Nota]:
    if not pasta.is_dir():
        raise FonteAusente(f"pasta de notas de versão não encontrada: {pasta}")
    notas = []
    for arq in pasta.iterdir():
        m = _VERSAO.match(arq.name)
        if not m:
            continue
        data, itens = None, []
        for linha in arq.read_text(encoding="utf-8").splitlines():
            if linha.startswith("data:"):
                data = linha.split(":", 1)[1].strip() or None
            elif linha.startswith("- "):
                itens.append(linha[2:].strip())
            elif linha.startswith("  ") and itens and linha.strip():
                itens[-1] = f"{itens[-1]} {linha.strip()}"
            elif not linha.strip() or linha.startswith("#"):
                continue
        versao = tuple(int(x) for x in m.groups())
        notas.append(Nota(versao, arq.name[:-3], data, itens))
    return sorted(notas, key=lambda n: n.versao, reverse=True)


def ler_catalogo(arquivo: Path) -> list[dict]:
    if not arquivo.is_file():
        raise FonteAusente(f"catálogo não encontrado: {arquivo}")
    return yaml.safe_load(arquivo.read_text(encoding="utf-8")) or []


def ler_proximos(roadmap: Path) -> list[tuple[str, str]]:
    if not roadmap.is_file():
        raise FonteAusente(f"roadmap não encontrado: {roadmap}")
    secoes = {"❌ Ausente": False, "Plano de entregas": False}
    atual, itens = None, []
    for linha in roadmap.read_text(encoding="utf-8").splitlines():
        if linha.startswith("## "):
            titulo = linha[3:].strip()
            atual = next((s for s in secoes if titulo.startswith(s)), None)
            if atual:
                secoes[atual] = True
        elif linha.startswith("### ") and atual:
            titulo = linha[4:].strip()
            itens.append((titulo, slugify(titulo, "-")))
    faltando = [s for s, achou in secoes.items() if not achou]
    if faltando:
        raise FonteAusente(f"seção do roadmap não encontrada: {', '.join(faltando)} ({roadmap})")
    return itens


def _link(e: dict) -> str:
    return f"[{e['id']} — {e['title']}]({e['path']})"


def montar_andamento(notas: list[Nota], catalogo: list[dict], proximos: list[tuple[str, str]]) -> str:
    partes = []
    if notas:
        n = notas[0]
        partes.append(f"## Versão no ar\n\n**{n.texto_versao}** — {n.data or 'sem data'}\n")
    partes.append("## O que entrou nas últimas versões\n")
    for n in notas[:3]:
        partes.append(f"### {n.texto_versao} — {n.data or 'sem data'}\n")
        partes.extend(f"- {i}" for i in n.itens)
        partes.append("")
    if len(notas) > 3:
        partes.append('??? note "Histórico completo de versões"')
        for n in notas[3:]:
            partes.append(f"    **{n.texto_versao}** — {n.data or 'sem data'}\n")
            partes.extend(f"    - {i}" for i in n.itens)
            partes.append("")
    abertos = [e for e in catalogo
               if e.get("type") in {"specification", "fix"} and e.get("status") in ABERTOS]
    partes.append("## Em andamento\n")
    partes.extend(f"- {_link(e)} — `{e['status']}`" for e in abertos)
    if not abertos:
        partes.append("Nenhum trabalho aberto.")
    partes.append("\n## Próximos passos\n")
    partes.extend(f"- [{t}](roadmap.md#{a})" for t, a in proximos)
    specs = sum(1 for e in catalogo if e.get("type") == "specification" and e.get("status") == "concluida")
    fixes = sum(1 for e in catalogo if e.get("type") == "fix" and e.get("status") == "corrigido")
    partes.append(
        "\n## Números do projeto\n\n| | |\n|---|---|\n"
        f"| Specs concluídas | {specs} |\n| Fixes corrigidos | {fixes} |\n"
        f"| Versões publicadas | {len(notas)} |\n"
    )
    return "\n".join(partes)


def montar_feito(catalogo: list[dict], componente: str) -> str:
    feitos = [e for e in catalogo
              if componente in (e.get("components") or [])
              and ((e.get("type") == "specification" and e.get("status") == "concluida")
                   or (e.get("type") == "fix" and e.get("status") == "corrigido"))]
    return "\n".join(f"- {_link(e)}" for e in feitos) or "Nada concluído ainda."

  • [ ] Step 6: Rodar e ver passar

Run: cd docs/hooks && ../../.venv-docs/bin/pytest -q Expected: todos os testes PASS.

  • [ ] Step 7: Red-green de uma regra

Troque reverse=True por reverse=False em ler_notas, rode o pytest (FAIL em test_notas_em_ordem_semantica…), restaure, rode de novo (PASS).

  • [ ] Step 8: Commit (só com pedido do usuário — ver Global Constraints)
git add docs/hooks .gitignore
git commit -m "docs(0058): funções do hook do Andamento, com testes"

Task 2: o hook no MkDocs e a página inicial

Files: - Modify: docs/hooks/andamento.py (acrescentar on_page_markdown) - Modify: mkdocs.yml (chaves hooks: e exclude_docs:) - Modify: docs/index.md (vira o Andamento) - Create: docs/guias.md (a orientação que estava em index.md) - Test: docs/hooks/test_andamento.py

Interfaces: - Consumes: ler_notas, ler_catalogo, ler_proximos, montar_andamento, montar_feito (Task 1). - Produces: on_page_markdown(markdown: str, page, config, files) -> str; marcadores <!-- andamento --> e <!-- implementacao:<componente> --> (usados na Task 3).

  • [ ] Step 1: Teste que falha

Acrescentar a docs/hooks/test_andamento.py:

from andamento import aplicar_marcadores


def test_marcadores_sao_trocados_e_pagina_sem_marcador_fica_igual():
    raiz = F
    texto = "# Início\n\n<!-- andamento -->\n\n<!-- implementacao:api -->\n"
    saida = aplicar_marcadores(texto, versoes=F / "versoes", catalogo=F / "catalog.yaml",
                               roadmap=F / "roadmap.md")
    assert "<!--" not in saida
    assert "**0.10.0**" in saida and "SPEC-0001" in saida
    assert aplicar_marcadores("# Sem marcador\n", versoes=raiz / "x", catalogo=raiz / "x",
                              roadmap=raiz / "x") == "# Sem marcador\n"

Run: cd docs/hooks && ../../.venv-docs/bin/pytest -q → FAIL (ImportError: aplicar_marcadores).

  • [ ] Step 2: Implementar

Acrescentar ao fim de docs/hooks/andamento.py:

_IMPL = re.compile(r"<!-- implementacao:([a-z0-9-]+) -->")


def aplicar_marcadores(markdown: str, *, versoes: Path, catalogo: Path, roadmap: Path) -> str:
    """Troca os marcadores; página sem marcador não lê fonte nenhuma e volta igual."""
    if "<!-- andamento -->" not in markdown and not _IMPL.search(markdown):
        return markdown
    cat = ler_catalogo(catalogo)
    if "<!-- andamento -->" in markdown:
        markdown = markdown.replace(
            "<!-- andamento -->", montar_andamento(ler_notas(versoes), cat, ler_proximos(roadmap))
        )
    return _IMPL.sub(lambda m: montar_feito(cat, m.group(1)), markdown)


def on_page_markdown(markdown, page, config, files):  # evento do MkDocs
    raiz = Path(config["config_file_path"]).parent
    return aplicar_marcadores(
        markdown,
        versoes=raiz / "apps" / "web" / "src" / "versoes",
        catalogo=Path(config["docs_dir"]) / "metadata" / "catalog.yaml",
        roadmap=Path(config["docs_dir"]) / "roadmap.md",
    )

Run o pytest → PASS.

  • [ ] Step 3: Registrar no MkDocs

Em mkdocs.yml, depois de site_dir: site:

hooks:
  - docs/hooks/andamento.py

exclude_docs: |
  hooks/

  • [ ] Step 4: A orientação vai para docs/guias.md

Criar docs/guias.md com front matter e o conteúdo de docs/index.md a partir de ## Onde entrar até o fim, sob o título # Como navegar:

---
id: GUIAS
type: operation
title: "Como navegar"
status: atual
---

# Como navegar

<conteúdo de docs/index.md a partir de "## Onde entrar", copiado sem alteração>
Ajustar no texto copiado só os links que eram relativos à raiz de docs/ — todos continuam válidos, porque guias.md também está na raiz de docs/.

  • [ ] Step 5: docs/index.md vira o Andamento

Substituir o corpo de docs/index.md (mantendo o front matter, se houver) por:

# Andamento

Onde o Garantora está agora: a versão no ar, o que entrou nas últimas versões, o que está
sendo feito e o que vem a seguir. Esta página é **gerada no build** a partir das notas de
versão, do catálogo e do roadmap — não se edita à mão.

## Versão no ar

**0.14.1** — 2026-10-15

## O que entrou nas últimas versões

### 0.14.1 — 2026-10-15

- **Novidades por inteiro.** Os itens das notas de versão que ocupavam mais de uma linha apareciam cortados neste painel, no meio da frase. Agora aparecem completos, inclusive os das versões anteriores.

### 0.14.0 — 2026-10-13

- **Mensalidade por tipo de inquilino.** Em *Parâmetros*, os blocos *Taxas* e *Taxas — Analistas* viraram um só, **Mensalidade e atraso**. A mensalidade passa a ter uma faixa para **pessoa física** e outra para **pessoa jurídica**, cada uma com a mensalidade sugerida, a mínima e a máxima. A multa e os juros por atraso ficam no mesmo bloco.
- **A mensalidade se escolhe na aprovação.** No parecer da análise de crédito, ao lado da taxa de adesão, o campo **Mensalidade (%)** já vem com a sugerida do tipo do inquilino principal. Ao mudar o percentual, o valor em reais por mês aparece na hora, antes de salvar. Um percentual fora da faixa não é aceito.
- **Dá para rever antes de emitir a garantia.** Com a análise aprovada e a garantia ainda não emitida, quem pode aprovar ajusta a mensalidade em **Alterar**. Depois da emissão ela vale para todas as parcelas e não muda mais: para outro valor, a garantia precisa ser cancelada e uma nova emitida.
- A mensalidade escolhida aparece no resumo financeiro da análise, inclusive para a imobiliária, e na confirmação da emissão.

### 0.13.0 — 2026-10-12

- **Taxa de adesão.** Em *Parâmetros*, o antigo *Pagamento inicial* passa a se chamar **Taxa de adesão** e explica o que ela é: cobrada uma vez do inquilino, definida pela imobiliária e devolvida a ela, descontados os impostos, como comissão. Ali se define a regra padrão, se a análise pode editar o valor, o percentual de impostos e a comissão padrão.
- Cada imobiliária pode ter **regra própria**: sem taxa, valor fixo ou percentual, e um percentual de comissão só dela. Isso se configura no cadastro da imobiliária, e ela vê a própria regra em *Minha Imobiliária*.
- Quando a regra permite, quem preenche a análise de crédito informa o valor combinado no novo bloco **Taxa de adesão**, logo abaixo de *Locação e renda*. O bloco já vem com o valor da regra, e **Usar o valor da regra** desfaz a alteração. A garantia sai com o valor informado, sem precisar mexer no parecer.
- **Comissão no acerto mensal.** A comissão de cada adesão paga entra no acerto da imobiliária no mês do pagamento e abate o que ela deve. Quando é a garantidora que deve, o acerto mostra o valor a pagar, e o pagamento é registrado em **Registrar pagamento de comissão**. A imobiliária que não recolhe mensalidade também passa a ter acerto, só com a comissão.

??? note "Histórico completo de versões"

    **0.12.0** — 2026-10-10

    - **Acerto mensal com cada imobiliária.** Em *Cobranças*, a nova aba **Repasses** mostra, por imobiliária e por competência, quanto ela deve, quanto já chegou em transferências e quanto falta. Do mesmo lugar se abre o acerto de cada parceira.
    - A imobiliária informa pelo próprio produto quais inquilinos pagaram a mensalidade no mês. Ela faz isso em *Minha Imobiliária → Repasses*, e a garantidora pode informar no lugar dela. **Marcar restantes como pagas** resolve o caso comum num toque, e basta corrigir as exceções: quem pagou atrasado (com a multa sugerida) e quem não pagou.
    - Cada transferência recebida da imobiliária é registrada no acerto, inteira ou em partes.
    - **Fechar a competência** dá baixa nas mensalidades pagas e passa as não pagas para atraso do inquilino. Elas deixam de ficar *Aguardando a imobiliária*. Um mês fechado só muda se alguém o reabrir, informando o motivo, e a reabertura fica registrada.
    - A nota fiscal da imobiliária pode ser anexada ao acerto fechado a qualquer momento. A lista mostra quais acertos ainda estão sem nota.

    **0.11.2** — 2026-10-09

    - O e-mail não diferencia mais maiúscula de minúscula. Quem se cadastrou com alguma letra maiúscula agora entra e recupera a senha digitando o e-mail como preferir, e o link de recuperação chega.
    - Um e-mail já cadastrado não pode mais ser usado de novo só trocando maiúsculas por minúsculas: o sistema avisa que ele já está em uso.

    **0.11.1** — 2026-09-28

    - Os campos que escolhem uma imobiliária — no cadastro de inquilino, no de imóvel, no filtro da lista de imóveis e na análise de crédito — agora alcançam **todas** as parceiras. Antes, com muitas imobiliárias cadastradas, as mais antigas não apareciam nem digitando o nome. Digitar busca em toda a base, e rolar a lista até o fim traz as próximas.
    - O mesmo vale para escolher o inquilino, o imóvel e os demais participantes de uma análise de crédito: a lista continua carregando ao rolar, até mostrar todo mundo.
    - A busca de imobiliárias acha também pelo **nome fantasia**, e a de imobiliárias e inquilinos **não diferencia acento**: "joao" encontra "João", e "imobiliaria" encontra "Imobiliária".

    **0.11.0** — 2026-09-24

    - Cada cobrança agora diz **de que ela é feita** — adesão, fiança, as duas juntas ou avulsa — e **por onde o dinheiro entra**: boleto da garantidora, PIX da garantidora ou PIX da imobiliária. A entrada que junta adesão e primeira mensalidade mostra as duas partes discriminadas, em vez de um valor só.
    - A tela de Cobranças fecha o mês sozinha: um resumo por tipo e canal acima da lista, com o previsto, o recebido, o que falta receber, o que está com a imobiliária para repassar e o que está em atraso. Os números conversam entre si e com a lista logo abaixo.
    - A competência vira o assunto da tela, e os atrasados ganham aba própria — a fila não tem mês, então uma parcela de março continua à vista em setembro. O menu mostra quantas são.
    - Dá para exportar a competência em planilha, com o resumo e a lista nas duas abas do arquivo, respeitando os filtros que estiverem aplicados.
    - A garantidora pode configurar **juros de mora e carência** em Parâmetros. Deixando os campos em branco, ela simplesmente não cobra aquela parcela do encargo — e a tela diz isso, em vez de calcular pela metade.
    - Registrar um pagamento deixou de ser um campo de valor: o painel abre a conta na data em que o dinheiro entrou, permite distribuir entre adesão, fiança, avulsa e multa, aceita abonar o encargo com motivo registrado, e guarda o comprovante junto da cobrança — que passa a poder ser reaberto direto da linha.
    - Lançar o pagamento de ontem produz o encargo de ontem, não o de hoje.
    - Quem cobra é a imobiliária parceira? Isso passa a ser um campo da parceria, e é ele que decide o canal das mensalidades daquela carteira.
    - Novos filtros na lista: tipo, canal e situação. *Aguardando a imobiliária* aparece com tom próprio — é espera por um repasse, não inadimplência do inquilino.

    **0.10.0** — 2026-09-20

    - A Ajuda virou uma página só, na ordem em que se usa o produto: configurar a garantidora, trazer as imobiliárias parceiras e operar as análises. Todos os tutoriais ficam à vista, sem abrir assunto por assunto.
    - Dá para procurar pelo que se quer fazer — "API Full", "corretor", "documentos" —, e cada tutorial diz para quem é, se para a garantidora ou para a imobiliária parceira.
    - Na página do tutorial, os capítulos ficam ao lado do vídeo e acompanham o que está tocando: clicar num deles pula para o trecho sem perder o vídeo de vista.
    - O botão que leva à tela ensinada passa a dizer o nome dela — "Ir para Imobiliárias", por exemplo — e agora também aparece com rótulo no celular.
    - Os tutoriais gravados no celular deixam de aparecer espremidos: eles tocam em pé, no tamanho em que dá para ler a tela.

    **0.9.1** — 2026-09-17

    - A Ajuda ganhou um tutorial em vídeo sobre as consultas de crédito: como conectar a conta da API Full, escolher quais consultas rodam em cada análise e ver quanto cada uma custa antes de salvar.
    - Os tutoriais passam a ter um assunto novo, "Gestão da garantidora", para as telas de administração — parâmetros, acesso e integrações.

    **0.9.0** — 2026-09-17

    - A garantidora escolhe quais consultas de crédito rodam em cada análise, e vê o preço de cada uma antes de salvar.
    - Em Análise de Créditos, no menu, fica o passo a passo para conectar a conta da API Full: criar a conta, pôr saldo, colar o token e testá-lo.
    - Na análise, cada consulta vira um cartão com o resultado e o custo. Dá para reexecutar uma consulta ou pedir uma avulsa, sempre confirmando o valor antes.
    - O mesmo inquilino consultado de novo em pouco tempo reaproveita o resultado, sem custo — a janela é configurável.
    - Consultas de Crédito mostra o gasto do mês, o previsto, o gasto por consulta e as diferenças entre o que foi cobrado e o que estava previsto.
    - O extrato da conta é conferido todos os dias: cada cobrança é casada com a consulta que a gerou, e o preço passa a valer o último valor cobrado quando ninguém definiu um preço à mão.
    - O Painel ganhou o gasto do mês com consultas, comparado ao mesmo período do mês anterior.
    - A tela do inquilino lista as consultas dele, com a análise em que cada uma rodou.
    - Seis consultas disponíveis: Boa Vista, Dados Financeiros, Quod, CADIN, Protesto Nacional e SCR Premium.

    **0.8.1** — 2026-09-07

    - Inquilino cadastrado direto no formulário de análise agora fica corretamente vinculado à imobiliária que fez a indicação
    - O painel de Consulta de crédito não usa mais a cor de "aprovado" quando não há restrição — passou para um tom neutro, já que ele é só informativo

    **0.8.0** — 2026-09-06

    - Agora dá para ver e administrar quem tem acesso por cada imobiliária parceira: convidar, reenviar convite, cancelar e remover acesso — direto na página da imobiliária
    - A imobiliária ganhou um responsável, que pode cuidar da própria equipe pela nova página "Minha Imobiliária", sem depender da garantidora para cada troca de funcionário

    **0.7.0** — 2026-09-05

    - Ao enviar uma solicitação para análise, o sistema consulta sozinho o bureau de crédito do inquilino e mostra o resultado na própria tela — score, pendências financeiras, protestos, cheques sem fundo e renda presumida
    - A consulta roda em segundo plano: a tela abre na hora, avisa que está consultando e se atualiza sozinha quando o resultado chega
    - O mesmo painel aparece no cadastro do inquilino, e um botão permite refazer a consulta quando o dado estiver desatualizado
    - Uma linha no painel explica o que cada número quer dizer, para quem não convive com indicador de crédito todo dia
    - A consulta é opcional e se liga em Parâmetros, por garantidora; só a garantidora vê o resultado, nunca a imobiliária
    - No celular, o aviso de "salvo" não bloqueia mais os botões do menu do rodapé

    **0.6.0** — 2026-09-03

    - Agora dá para remover imobiliárias, inquilinos, imóveis, análises de crédito, garantias e cobranças — e restaurar em até 60 dias, se for engano
    - Diálogo de confirmação mais enxuto no celular, sem ocupar a tela inteira quando não precisa

    **0.5.0** — 2026-09-01

    - Nova tela **Cobranças**, no menu, com todas as cobranças de todas as garantias num só lugar — filtre por status ou por competência, sem precisar abrir garantia por garantia.
    - As cobranças mensais passam a ser geradas sozinhas: ao registrar o contrato assinado, o calendário completo até o fim da vigência já nasce pronto, sem precisar lançar mês a mês.
    - Na emissão da garantia, escolha o dia do mês em que a cobrança mensal vence.
    - Registre o pagamento ou marque uma cobrança como em atraso direto na tela nova, sem abrir a garantia — o valor sugerido já soma a multa quando a cobrança está vencida.
    - Ao encerrar uma garantia, as cobranças futuras do calendário automático são canceladas sozinhas; uma cobrança lançada à mão continua de pé.

    **0.4.5** — 2026-08-30


    **0.4.4** — 2026-08-30

    - Análise de crédito passa a exigir a renda comprovada do inquilino principal, com aviso no próprio campo

    **0.4.3** — 2026-08-30


    **0.4.2** — 2026-08-30

    - Quando um formulário é recusado, a mensagem agora aparece junto ao campo com o problema — não mais só um aviso genérico no topo da tela sem dizer o quê. Vale para login, cadastro de conta, recuperação de senha, times, perfis de acesso, parâmetros da garantidora e a análise de crédito.

    **0.4.1** — 2026-08-29


    **0.4.0** — 2026-08-26

    - CPF, CNPJ e telefone agora se formatam sozinhos enquanto você digita, em todas as telas onde aparecem: análise de crédito, inquilino, imóvel, imobiliária e no cadastro da sua garantidora. Você digita só os números e a pontuação aparece na medida certa — inclusive no documento do proprietário, que aceita CPF ou CNPJ no mesmo campo e se ajusta pela quantidade de dígitos.
    - O dígito verificador passou a ser conferido. Um CPF ou CNPJ que não existe é recusado na hora em que você termina de digitar, e não depois de preencher o resto da ficha. Documento pela metade continua em silêncio: enquanto você está digitando, a tela não interrompe.
    - A busca por documento encontra do jeito que você digitar. Antes, procurar por `139.778.672-88` não achava quem estava gravado sem pontuação — e o mesmo inquilino acabava cadastrado duas vezes, com o histórico partido em dois. Agora tanto faz digitar com pontos e traço ou só os números.
    - O erro de formulário passou a aparecer **no campo**, com uma frase que diz o que fazer. Antes o campo ficava vermelho exibindo o texto de ajuda — "Somente ligações" num telefone inválido —, o que informava tudo menos o problema.
    - Quando o sistema recusa o que você enviou, cada mensagem vai para o campo a que ela pertence, e a tela rola até o primeiro deles. No celular, ela leva em conta o teclado que abre por cima: o campo e a explicação ficam visíveis juntos.
    - Colar um telefone com o código do país deixou de entrar pela metade. Antes o campo aceitava os primeiros dígitos e descartava o resto em silêncio, guardando um número plausível e errado; agora ele recusa a colagem e diz por quê.
    - Documento e telefone aparecem formatados nas listas e nas telas de detalhe, mesmo estando gravados só com números.

    **0.3.0** — 2026-08-24

    - A Ajuda agora é organizada por assunto. No computador, uma barra ao lado da tela abre e fecha cada assunto sem tirar você do lugar; no celular, os assuntos ficam um sob o outro e os vídeos aparecem dentro do que você abrir.
    - Um mesmo tutorial pode ter duas gravações: uma feita no computador e outra no celular. O produto toca a da interface em que você está — e, quando existe a outra, oferece a troca ali mesmo, sem recomeçar.
    - Quando um tutorial só existe numa das interfaces, a tela diz isso em vez de deixar você concluir que gravaram na tela errada.
    - No celular, a tela da Ajuda passou a mostrar todos os assuntos de uma vez. Antes eles ficavam numa faixa que rolava para o lado, e metade do material ficava escondida atrás de um gesto que nada anunciava.
    - No celular, a Ajuda parou de rolar junto com o menu: ela fica fixa no fim da gaveta, sempre no mesmo lugar, como a linha de novidades.

    **0.2.1** — 2026-08-23


    **0.2.0** — 2026-08-23

    - As novidades agora têm tela própria, com endereço. Dá para mandar o link de uma versão específica a um colega, abrir numa aba ao lado da tela que mudou, e voltar pelo histórico do navegador — o que antes só existia dentro de uma caixinha que sumia ao clicar fora.
    - O ícone passa a dizer **quantas** publicações você ainda não leu, e o número cai de uma em uma conforme você lê. Ser interrompido no meio deixou de custar o rastro: o que ficou por ler continua por ler, mesmo dias depois.
    - Cada publicação tem seu próprio estado de lida, então você pode ler fora de ordem — abrir a mais nova por um link não marca as anteriores como vistas.
    - Para quem voltou de muito tempo fora e não quer ler o histórico inteiro, há um "marcar todas como lidas" na tela. Ele é um botão que você aperta de propósito, e não o efeito colateral de ter aberto a tela por engano.

    **0.1.0** — 2026-08-23

    - O produto agora tem versão, e ela aparece: no menu da sua conta, no desktop, e numa linha própria da gaveta, no celular. É o número a dar quando alguém do suporte perguntar "qual versão você está usando?".
    - Este painel. A cada publicação nova, o ícone da barra traz uma marca, e aqui fica escrito o que entrou — na sua língua, não em nome de commit. Ler é opcional e nunca interrompe o que você está fazendo.
    - O que você já leu fica registrado na sua conta, e não no navegador. Leu no computador do escritório, não vê o aviso de novo ao abrir o celular; e limpar o navegador não o ressuscita.

## Em andamento

- [PRODUCT-BUSINESS-RULES — Regras de negócio centrais](product/business-rules.md) — `em-implementacao`
- [PRODUCT-BUSINESS-FLOW — Fluxo de negócio — da análise ao repasse](product/fluxo-de-negocio.md) — `em-implementacao`
- [PRODUCT-VISION — Visão de produto](product/vision.md) — `em-implementacao`

## Próximos passos

- [1. Sinistro — processo inteiro](roadmap.md#1-sinistro-processo-inteiro)
- [2. Emissão de boleto](roadmap.md#2-emissao-de-boleto)
- [3. Assinatura eletrônica — Autentique + biometria facial](roadmap.md#3-assinatura-eletronica-autentique-biometria-facial)
- [Trilha da jornada (sequencial)](roadmap.md#trilha-da-jornada-sequencial)
- [Trilha de base (habilitadores — antes ou em paralelo)](roadmap.md#trilha-de-base-habilitadores-antes-ou-em-paralelo)

## Números do projeto

| | |
|---|---|
| Specs concluídas | 58 |
| Fixes corrigidos | 24 |
| Versões publicadas | 25 |

  • [ ] Step 6: Build local

Run: .venv-docs/bin/mkdocs build --strict Expected: Documentation built; site/index.html contém "Versão no ar" e o número da nota mais alta de apps/web/src/versoes/.

  • [ ] Step 7: Commit (com pedido do usuário)
git add docs/hooks docs/index.md docs/guias.md mkdocs.yml
git commit -m "docs(0058): o Andamento é a página inicial, gerado no build"

Task 3: Implementação, roadmap e navegação

Files: - Create: docs/implementacao.md - Modify: docs/roadmap.md (a seção "Dívida técnica conhecida" sai; entra o ponteiro) - Modify: mkdocs.yml (nav: com as seis abas) - Modify: docs/metadata/catalog.yaml (entrada IMPLEMENTACAO e GUIAS, se o docs_lint.py exigir)

Interfaces: - Consumes: marcador <!-- implementacao:<componente> --> (Task 2); componentes do catálogo web, api, infra, e2e.

  • [ ] Step 1: docs/implementacao.md
---
id: IMPLEMENTACAO
type: architecture
title: "Implementação — o que foi feito e o que falta"
status: atual
---

# Implementação

O que a [arquitetura](architecture/index.md) define, o que já foi construído e o que falta,
elemento por elemento. O **feito** de Web, API, Infra e Testes é gerado no build a partir do
catálogo; o **falta** e a **dívida técnica** são escritos à mão — são decisão, não dado.

## Web — `apps/web`

### Feito

- [SPEC-0001 — Recuperação de senha por e-mail](specifications/0001-recuperacao-de-senha/specification.md)
- [SPEC-0002 — Onboarding: usuário conectado, cancelamento e logo](specifications/0002-onboarding-e-logo/specification.md)
- [SPEC-0003 — Análise completa: taxa setup pelo analista, cláusula obrigatória e corresponsável](specifications/0003-analise-completa/specification.md)
- [SPEC-0004 — Implementação mobile (PWA responsivo) conforme o Figma](specifications/0004-implementacao-mobile/specification.md)
- [SPEC-0005 — Aviso de atualização do PWA (banner com botão "Atualizar")](specifications/0005-pwa-prompt-de-atualizacao/specification.md)
- [SPEC-0006 — Pacote Locatício como base de cálculo + limpeza das configurações padrão](specifications/0006-pacote-locaticio-e-limpeza-de-settings/specification.md)
- [SPEC-0007 — Análise de Crédito: rename completo (Proposal → CreditAnalysis) + visão mobile](specifications/0007-analise-de-credito-linguagem-e-mobile/specification.md)
- [SPEC-0008 — Documentos obrigatórios da Análise de Crédito](specifications/0008-documentos-obrigatorios-analise-credito/specification.md)
- [SPEC-0009 — Remoção do i18n](specifications/0009-remocao-do-i18n/specification.md)
- [SPEC-0010 — Parametrização de documentos por área: botões e seleção do tipo](specifications/0010-parametrizacao-documentos-por-area/specification.md)
- [SPEC-0011 — Gaveta de navegação do mobile conforme o design system 1.5.0](specifications/0011-gaveta-de-navegacao-mobile/specification.md)
- [SPEC-0012 — Iconografia Phosphor, conforme o design system 2.3.0](specifications/0012-iconografia-phosphor/specification.md)
- [SPEC-0013 — Inquilinos e Imóveis conforme o design system](specifications/0013-inquilinos-imoveis-design-system/specification.md)
- [SPEC-0014 — MUI 9 e design system 2.10.0](specifications/0014-atualizacao-mui-e-design-system/specification.md)
- [SPEC-0015 — Telas de Análise de Crédito no design system](specifications/0015-telas-de-analise-de-credito/specification.md)
- [SPEC-0016 — Topo e espaçamento no mobile: listas e formulários](specifications/0016-layout-mobile-listas-forms/specification.md)
- [SPEC-0017 — Internalizar o design system e aposentar o pacote](specifications/0017-internalizar-design-system/specification.md)
- [SPEC-0018 — Respiro do label dos campos de formulário](specifications/0018-respiro-do-label-dos-campos/specification.md)
- [SPEC-0019 — Contraste dos neutros e adoção da paleta de marca](specifications/0019-contraste-e-adocao-da-paleta/specification.md)
- [SPEC-0020 — Padronizar o topo de página](specifications/0020-padronizar-topo-de-pagina/specification.md)
- [SPEC-0021 — Borda do topo e tom das linhas, iguais nos dois viewports](specifications/0021-linhas-e-borda-do-header/specification.md)
- [SPEC-0022 — Paginação no mobile: Inquilinos, Imóveis e Análise de Crédito](specifications/0022-paginacao-compacta-no-mobile/specification.md)
- [SPEC-0023 — Padronizar os filtros das listas](specifications/0023-padronizar-filtros-das-listas/specification.md)
- [SPEC-0024 — Ações do formulário no topo](specifications/0024-acoes-do-formulario-no-topo/specification.md)
- [SPEC-0025 — Organização da visualização da análise de crédito](specifications/0025-visualizacao-da-analise-de-credito/specification.md)
- [SPEC-0027 — Contrato vira Garantia](specifications/0027-contrato-vira-garantia/specification.md)
- [SPEC-0028 — Ambiente de produção (app.garantora.com.br na box srv01)](specifications/0028-ambiente-de-producao/specification.md)
- [SPEC-0030 — Skill `ship`: deploy do main em produção](specifications/0030-skill-ship-deploy/specification.md)
- [SPEC-0031 — Convite de garantidora por link](specifications/0031-convite-de-garantidora-por-link/specification.md)
- [SPEC-0032 — Templates de e-mail no design system](specifications/0032-templates-de-email-no-design-system/specification.md)
- [SPEC-0033 — Interface do SaaS admin no design system](specifications/0033-saas-admin-no-design-system/specification.md)
- [SPEC-0034 — Isolamento de tenant e de imobiliária, e login sem credencial pré-preenchida](specifications/0034-isolamento-de-tenant-e-login/specification.md)
- [SPEC-0035 — Autorização: fechar os portões, sanear as permissões, e o menu obedecer a elas](specifications/0035-menu-por-permissao/specification.md)
- [SPEC-0036 — O passo de analisar, e o caminho de volta para a imobiliária](specifications/0036-retorno-da-analise-a-imobiliaria/specification.md)
- [SPEC-0037 — Pendências tipificadas na análise de crédito, e um histórico que diz o que mudou](specifications/0037-tipos-de-pendencia-na-analise/specification.md)
- [SPEC-0038 — Emissão da garantia e a espera pela assinatura](specifications/0038-emissao-e-assinatura-da-garantia/specification.md)
- [SPEC-0039 — Emitir a garantia conferindo, e sem poder divergir da análise](specifications/0039-emissao-de-garantia-na-analise/specification.md)
- [SPEC-0040 — Assinou, fecha o dossiê: alterar arquivo vira exceção nomeada e visível](specifications/0040-dossie-da-garantia-fechado/specification.md)
- [SPEC-0041 — A Equipe passa a administrar de verdade: no celular, sem 403, e sem mudar acesso em silêncio](specifications/0041-equipe-e-perfis-no-mobile/specification.md)
- [SPEC-0042 — Tutoriais em vídeo, e onde encontrá-los](specifications/0042-tutoriais-em-video/specification.md)
- [SPEC-0043 — Ninguém consegue dizer que versão está no ar, nem o que mudou nela](specifications/0043-versao-e-novidades/specification.md)
- [SPEC-0044 — O que mudou não cabe onde está sendo contado](specifications/0044-pagina-de-novidades/specification.md)
- [SPEC-0045 — Assuntos, navegação e a versão certa para cada aparelho](specifications/0045-grupos-e-navegacao-na-ajuda/specification.md)
- [SPEC-0046 — Documento e telefone com máscara, e erro de formulário que a pessoa consegue ler](specifications/0046-mascaras-e-erros-na-analise-de-credito/specification.md)
- [SPEC-0047 — Correção no web sem forma de provar que está certa](specifications/0047-suite-unitaria-do-web/specification.md)
- [FIX-0001 — Borda e placeholder dos campos de formulário fora dos tokens](fixes/0001-borda-placeholder-campos-formulario.md)
- [FIX-0002 — Zoom automático no mobile ao focar qualquer campo](fixes/0002-zoom-automatico-no-mobile.md)
- [FIX-0003 — A API responde antes de comitar a transação](fixes/0003-api-responde-antes-de-comitar.md)
- [FIX-0004 — Separadores escuros demais depois da spec 0019](fixes/0004-separadores-escuros-demais.md)
- [FIX-0005 — O topo da imobiliária não mostra título no mobile](fixes/0005-topo-da-imobiliaria-sem-titulo.md)
- [FIX-0006 — Erros encontrados na jornada da análise de crédito](fixes/0006-erros-encontrados-pela-jornada.md)
- [FIX-0007 — Documento do cadastro do inquilino aparece como "Entregue" numa análise recém-criada, sem nenhuma pista de que veio de antes](fixes/0007-cpf-ja-vem-entregue.md)
- [FIX-0008 — A caixa azul do passo Documentos afirma o que o sistema não faz](fixes/0008-caixa-azul-do-passo-documentos.md)
- [FIX-0009 — A aprovação pede num modal o que a tela já mostra, e o setup é um campo vazio sem referência](fixes/0009-aprovacao-em-modal-duplicado.md)
- [FIX-0010 — O anexo grande não sobe, e o que subiu quebrado abre em branco](fixes/0010-preview-de-documento-da-garantia.md)
- [FIX-0011 — A imobiliária troca e edita documento com a análise na garantidora](fixes/0011-troca-de-arquivo-fura-janela-da-imobiliaria.md)
- [FIX-0012 — A tela decide com dado que não é dela: identidade congelada, e formulário preenchido pelo navegador](fixes/0012-onboarding-nao-leva-ao-painel.md)
- [FIX-0014 — No celular, a Ajuda esconde metade do índice atrás de um gesto que a tela não anuncia](fixes/0014-ajuda-mobile-pilulas-scroll-horizontal.md)
- [FIX-0015 — A recusa do servidor não aponta o campo em três formulários](fixes/0015-recusa-da-api-nao-aponta-o-campo.md)
- [FIX-0016 — Renda comprovada do inquilino principal não é obrigatória](fixes/0016-renda-do-inquilino-nao-e-obrigatoria.md)
- [FIX-0017 — Salvar em Parâmetros (mobile) trava os botões da tab bar do rodapé](fixes/0017-parametros-mobile-trava-tab-bar.md)
- [FIX-0021 — Seletor de parceira só alcança a primeira página, e em Inquilinos nem a busca resolve](fixes/0021-seletor-imobiliaria-limitado-a-50.md)
- [FIX-0024 — O painel de Novidades corta no meio o item de nota que ocupa mais de uma linha](fixes/0024-novidades-cortam-item-longo.md)
- [SPEC-0048 — Geração automática de cobranças e tela de gestão](specifications/0048-gestao-de-cobrancas/specification.md)
- [SPEC-0049 — Remoção lógica e recuperação: imobiliária, inquilino, imóvel, análise de crédito, garantia e cobrança](specifications/0049-remocao-logica-de-registros/specification.md)
- [SPEC-0050 — Consulta ao Boa Vista (Cadastro Positivo) na análise de crédito, configurável por tenant](specifications/0050-analise-credito-boavista/specification.md)
- [SPEC-0051 — Usuários da imobiliária: quem tem acesso, e como tirá-lo](specifications/0051-usuarios-da-imobiliaria/specification.md)
- [SPEC-0052 — Catálogo de consultas de crédito configurável, com custo e conciliação (API Full)](specifications/0052-consultas-credito-api-full/specification.md)
- [SPEC-0053 — Central de ajuda na ordem da jornada: tudo visível, busca e capítulos ao lado do vídeo](specifications/0053-central-ajuda-jornada/specification.md)
- [SPEC-0054 — Cobrança com tipo, canal e parcela, e o resumo do mês que hoje mora na planilha](specifications/0054-cobranca-por-tipo-e-canal/specification.md)
- [SPEC-0055 — O acerto com a imobiliária: o que ela recolheu, o que repassou, e o mês fechado](specifications/0055-repasse-por-imobiliaria/specification.md)
- [FIX-0018 — Inquilino cadastrado no formulário de análise não fica vinculado à imobiliária](fixes/0018-inquilino-inline-sem-imobiliaria.md)
- [FIX-0019 — O painel de Consulta de crédito usa a cor de aprovação para um resultado que não aprova nada](fixes/0019-cor-verde-painel-consulta-credito.md)
- [SPEC-0056 — A taxa de adesão: da imobiliária, por imobiliária, e de volta como comissão](specifications/0056-taxa-de-adesao/specification.md)
- [SPEC-0057 — A mensalidade da garantia: uma faixa por tipo de tomador, escolhida na aprovação](specifications/0057-taxa-da-mensalidade/specification.md)

### Falta

- Tela de sinistro (o processo não existe — ver [roadmap](roadmap.md#1-sinistro-processo-inteiro)).

## API — `apps/api`

### Feito

- [SPEC-0001 — Recuperação de senha por e-mail](specifications/0001-recuperacao-de-senha/specification.md)
- [SPEC-0002 — Onboarding: usuário conectado, cancelamento e logo](specifications/0002-onboarding-e-logo/specification.md)
- [SPEC-0003 — Análise completa: taxa setup pelo analista, cláusula obrigatória e corresponsável](specifications/0003-analise-completa/specification.md)
- [SPEC-0004 — Implementação mobile (PWA responsivo) conforme o Figma](specifications/0004-implementacao-mobile/specification.md)
- [SPEC-0005 — Aviso de atualização do PWA (banner com botão "Atualizar")](specifications/0005-pwa-prompt-de-atualizacao/specification.md)
- [SPEC-0006 — Pacote Locatício como base de cálculo + limpeza das configurações padrão](specifications/0006-pacote-locaticio-e-limpeza-de-settings/specification.md)
- [SPEC-0007 — Análise de Crédito: rename completo (Proposal → CreditAnalysis) + visão mobile](specifications/0007-analise-de-credito-linguagem-e-mobile/specification.md)
- [SPEC-0008 — Documentos obrigatórios da Análise de Crédito](specifications/0008-documentos-obrigatorios-analise-credito/specification.md)
- [SPEC-0009 — Remoção do i18n](specifications/0009-remocao-do-i18n/specification.md)
- [SPEC-0010 — Parametrização de documentos por área: botões e seleção do tipo](specifications/0010-parametrizacao-documentos-por-area/specification.md)
- [SPEC-0011 — Gaveta de navegação do mobile conforme o design system 1.5.0](specifications/0011-gaveta-de-navegacao-mobile/specification.md)
- [SPEC-0012 — Iconografia Phosphor, conforme o design system 2.3.0](specifications/0012-iconografia-phosphor/specification.md)
- [SPEC-0013 — Inquilinos e Imóveis conforme o design system](specifications/0013-inquilinos-imoveis-design-system/specification.md)
- [SPEC-0014 — MUI 9 e design system 2.10.0](specifications/0014-atualizacao-mui-e-design-system/specification.md)
- [SPEC-0015 — Telas de Análise de Crédito no design system](specifications/0015-telas-de-analise-de-credito/specification.md)
- [SPEC-0023 — Padronizar os filtros das listas](specifications/0023-padronizar-filtros-das-listas/specification.md)
- [SPEC-0025 — Organização da visualização da análise de crédito](specifications/0025-visualizacao-da-analise-de-credito/specification.md)
- [SPEC-0027 — Contrato vira Garantia](specifications/0027-contrato-vira-garantia/specification.md)
- [SPEC-0028 — Ambiente de produção (app.garantora.com.br na box srv01)](specifications/0028-ambiente-de-producao/specification.md)
- [SPEC-0030 — Skill `ship`: deploy do main em produção](specifications/0030-skill-ship-deploy/specification.md)
- [SPEC-0031 — Convite de garantidora por link](specifications/0031-convite-de-garantidora-por-link/specification.md)
- [SPEC-0032 — Templates de e-mail no design system](specifications/0032-templates-de-email-no-design-system/specification.md)
- [SPEC-0034 — Isolamento de tenant e de imobiliária, e login sem credencial pré-preenchida](specifications/0034-isolamento-de-tenant-e-login/specification.md)
- [SPEC-0035 — Autorização: fechar os portões, sanear as permissões, e o menu obedecer a elas](specifications/0035-menu-por-permissao/specification.md)
- [SPEC-0036 — O passo de analisar, e o caminho de volta para a imobiliária](specifications/0036-retorno-da-analise-a-imobiliaria/specification.md)
- [SPEC-0037 — Pendências tipificadas na análise de crédito, e um histórico que diz o que mudou](specifications/0037-tipos-de-pendencia-na-analise/specification.md)
- [SPEC-0038 — Emissão da garantia e a espera pela assinatura](specifications/0038-emissao-e-assinatura-da-garantia/specification.md)
- [SPEC-0039 — Emitir a garantia conferindo, e sem poder divergir da análise](specifications/0039-emissao-de-garantia-na-analise/specification.md)
- [SPEC-0040 — Assinou, fecha o dossiê: alterar arquivo vira exceção nomeada e visível](specifications/0040-dossie-da-garantia-fechado/specification.md)
- [SPEC-0041 — A Equipe passa a administrar de verdade: no celular, sem 403, e sem mudar acesso em silêncio](specifications/0041-equipe-e-perfis-no-mobile/specification.md)
- [SPEC-0042 — Tutoriais em vídeo, e onde encontrá-los](specifications/0042-tutoriais-em-video/specification.md)
- [SPEC-0043 — Ninguém consegue dizer que versão está no ar, nem o que mudou nela](specifications/0043-versao-e-novidades/specification.md)
- [SPEC-0044 — O que mudou não cabe onde está sendo contado](specifications/0044-pagina-de-novidades/specification.md)
- [SPEC-0046 — Documento e telefone com máscara, e erro de formulário que a pessoa consegue ler](specifications/0046-mascaras-e-erros-na-analise-de-credito/specification.md)
- [FIX-0002 — Zoom automático no mobile ao focar qualquer campo](fixes/0002-zoom-automatico-no-mobile.md)
- [FIX-0003 — A API responde antes de comitar a transação](fixes/0003-api-responde-antes-de-comitar.md)
- [FIX-0006 — Erros encontrados na jornada da análise de crédito](fixes/0006-erros-encontrados-pela-jornada.md)
- [FIX-0007 — Documento do cadastro do inquilino aparece como "Entregue" numa análise recém-criada, sem nenhuma pista de que veio de antes](fixes/0007-cpf-ja-vem-entregue.md)
- [FIX-0008 — A caixa azul do passo Documentos afirma o que o sistema não faz](fixes/0008-caixa-azul-do-passo-documentos.md)
- [FIX-0009 — A aprovação pede num modal o que a tela já mostra, e o setup é um campo vazio sem referência](fixes/0009-aprovacao-em-modal-duplicado.md)
- [FIX-0010 — O anexo grande não sobe, e o que subiu quebrado abre em branco](fixes/0010-preview-de-documento-da-garantia.md)
- [FIX-0011 — A imobiliária troca e edita documento com a análise na garantidora](fixes/0011-troca-de-arquivo-fura-janela-da-imobiliaria.md)
- [FIX-0012 — A tela decide com dado que não é dela: identidade congelada, e formulário preenchido pelo navegador](fixes/0012-onboarding-nao-leva-ao-painel.md)
- [FIX-0016 — Renda comprovada do inquilino principal não é obrigatória](fixes/0016-renda-do-inquilino-nao-e-obrigatoria.md)
- [FIX-0021 — Seletor de parceira só alcança a primeira página, e em Inquilinos nem a busca resolve](fixes/0021-seletor-imobiliaria-limitado-a-50.md)
- [FIX-0023 — E-mail de usuário guarda a maiúscula, e quem digita em minúsculas não entra nem recupera a senha](fixes/0023-email-com-maiuscula.md)
- [SPEC-0048 — Geração automática de cobranças e tela de gestão](specifications/0048-gestao-de-cobrancas/specification.md)
- [SPEC-0049 — Remoção lógica e recuperação: imobiliária, inquilino, imóvel, análise de crédito, garantia e cobrança](specifications/0049-remocao-logica-de-registros/specification.md)
- [SPEC-0050 — Consulta ao Boa Vista (Cadastro Positivo) na análise de crédito, configurável por tenant](specifications/0050-analise-credito-boavista/specification.md)
- [SPEC-0051 — Usuários da imobiliária: quem tem acesso, e como tirá-lo](specifications/0051-usuarios-da-imobiliaria/specification.md)
- [SPEC-0052 — Catálogo de consultas de crédito configurável, com custo e conciliação (API Full)](specifications/0052-consultas-credito-api-full/specification.md)
- [SPEC-0054 — Cobrança com tipo, canal e parcela, e o resumo do mês que hoje mora na planilha](specifications/0054-cobranca-por-tipo-e-canal/specification.md)
- [SPEC-0055 — O acerto com a imobiliária: o que ela recolheu, o que repassou, e o mês fechado](specifications/0055-repasse-por-imobiliaria/specification.md)
- [FIX-0018 — Inquilino cadastrado no formulário de análise não fica vinculado à imobiliária](fixes/0018-inquilino-inline-sem-imobiliaria.md)
- [SPEC-0056 — A taxa de adesão: da imobiliária, por imobiliária, e de volta como comissão](specifications/0056-taxa-de-adesao/specification.md)
- [SPEC-0057 — A mensalidade da garantia: uma faixa por tipo de tomador, escolhida na aprovação](specifications/0057-taxa-da-mensalidade/specification.md)

### Falta

- Sinistro, emissão de boleto e assinatura eletrônica (ver [roadmap](roadmap.md)).

### Dívida técnica

- `make lint` não passa — a maior parte é `line-too-long`; o código nunca passou por
  `ruff format`, e pagar essa dívida é decisão do usuário (o diff é enorme).
- `[tool.mypy]` ausente do `pyproject.toml` — sem os plugins de pydantic/SQLAlchemy a maioria
  dos erros é falso positivo.
- Cobertura desigual: os módulos de maior risco financeiro eram os menos cobertos
  (`credit.py`, `decision_service.py`, `guarantee_service.py`, `billing_service.py`). Não
  remedida desde a criação do monorepo — rode `make test-cov` antes de afirmar.

## Worker e jobs agendados

### Feito

- Consulta ao bureau de crédito em fila (`run_credit_check_job`) — spec 0050.
- Job diário das 6h: purga do payload bruto vencido e sincronização de extrato e preços das
  consultas — specs 0050 e 0052.
- Job das 7h: marca as cobranças vencidas — spec 0048.

### Falta

- Nada previsto na arquitetura além dos três jobs.

## Integrações externas

### Feito

- API Full — consultas de crédito e extrato (specs 0050 e 0052).
- ViaCEP — busca de endereço.
- E-mail — Mailpit em desenvolvimento, AWS SES em produção.

### Falta

- Assinatura eletrônica (Autentique + biometria facial) — planejada, não integrada.
- Emissão de boleto — hoje "boleto" é só o rótulo do canal, e a baixa é manual.

## Infra — local, dev-remote, produção

### Feito

- [SPEC-0017 — Internalizar o design system e aposentar o pacote](specifications/0017-internalizar-design-system/specification.md)
- [SPEC-0028 — Ambiente de produção (app.garantora.com.br na box srv01)](specifications/0028-ambiente-de-producao/specification.md)
- [FIX-0010 — O anexo grande não sobe, e o que subiu quebrado abre em branco](fixes/0010-preview-de-documento-da-garantia.md)
- [FIX-0013 — O `make seed` some do log do deploy, e o deploy diz que deu certo](fixes/0013-seed-some-do-log-do-deploy.md)
- [SPEC-0058 — A documentação começa pelo andamento: roadmap, especificações, arquitetura e implementação](specifications/0058-documentacao-pelo-andamento/specification.md)

### Falta

- Sem CI.

## Testes

### Feito

- [SPEC-0001 — Recuperação de senha por e-mail](specifications/0001-recuperacao-de-senha/specification.md)
- [SPEC-0002 — Onboarding: usuário conectado, cancelamento e logo](specifications/0002-onboarding-e-logo/specification.md)
- [SPEC-0003 — Análise completa: taxa setup pelo analista, cláusula obrigatória e corresponsável](specifications/0003-analise-completa/specification.md)
- [SPEC-0004 — Implementação mobile (PWA responsivo) conforme o Figma](specifications/0004-implementacao-mobile/specification.md)
- [SPEC-0005 — Aviso de atualização do PWA (banner com botão "Atualizar")](specifications/0005-pwa-prompt-de-atualizacao/specification.md)
- [SPEC-0006 — Pacote Locatício como base de cálculo + limpeza das configurações padrão](specifications/0006-pacote-locaticio-e-limpeza-de-settings/specification.md)
- [SPEC-0007 — Análise de Crédito: rename completo (Proposal → CreditAnalysis) + visão mobile](specifications/0007-analise-de-credito-linguagem-e-mobile/specification.md)
- [SPEC-0008 — Documentos obrigatórios da Análise de Crédito](specifications/0008-documentos-obrigatorios-analise-credito/specification.md)
- [SPEC-0009 — Remoção do i18n](specifications/0009-remocao-do-i18n/specification.md)
- [SPEC-0010 — Parametrização de documentos por área: botões e seleção do tipo](specifications/0010-parametrizacao-documentos-por-area/specification.md)
- [SPEC-0011 — Gaveta de navegação do mobile conforme o design system 1.5.0](specifications/0011-gaveta-de-navegacao-mobile/specification.md)
- [SPEC-0012 — Iconografia Phosphor, conforme o design system 2.3.0](specifications/0012-iconografia-phosphor/specification.md)
- [SPEC-0013 — Inquilinos e Imóveis conforme o design system](specifications/0013-inquilinos-imoveis-design-system/specification.md)
- [SPEC-0014 — MUI 9 e design system 2.10.0](specifications/0014-atualizacao-mui-e-design-system/specification.md)
- [SPEC-0015 — Telas de Análise de Crédito no design system](specifications/0015-telas-de-analise-de-credito/specification.md)
- [SPEC-0016 — Topo e espaçamento no mobile: listas e formulários](specifications/0016-layout-mobile-listas-forms/specification.md)
- [SPEC-0018 — Respiro do label dos campos de formulário](specifications/0018-respiro-do-label-dos-campos/specification.md)
- [SPEC-0019 — Contraste dos neutros e adoção da paleta de marca](specifications/0019-contraste-e-adocao-da-paleta/specification.md)
- [SPEC-0020 — Padronizar o topo de página](specifications/0020-padronizar-topo-de-pagina/specification.md)
- [SPEC-0021 — Borda do topo e tom das linhas, iguais nos dois viewports](specifications/0021-linhas-e-borda-do-header/specification.md)
- [SPEC-0022 — Paginação no mobile: Inquilinos, Imóveis e Análise de Crédito](specifications/0022-paginacao-compacta-no-mobile/specification.md)
- [SPEC-0023 — Padronizar os filtros das listas](specifications/0023-padronizar-filtros-das-listas/specification.md)
- [SPEC-0024 — Ações do formulário no topo](specifications/0024-acoes-do-formulario-no-topo/specification.md)
- [SPEC-0025 — Organização da visualização da análise de crédito](specifications/0025-visualizacao-da-analise-de-credito/specification.md)
- [SPEC-0027 — Contrato vira Garantia](specifications/0027-contrato-vira-garantia/specification.md)
- [SPEC-0028 — Ambiente de produção (app.garantora.com.br na box srv01)](specifications/0028-ambiente-de-producao/specification.md)
- [SPEC-0030 — Skill `ship`: deploy do main em produção](specifications/0030-skill-ship-deploy/specification.md)
- [SPEC-0031 — Convite de garantidora por link](specifications/0031-convite-de-garantidora-por-link/specification.md)
- [SPEC-0032 — Templates de e-mail no design system](specifications/0032-templates-de-email-no-design-system/specification.md)
- [SPEC-0033 — Interface do SaaS admin no design system](specifications/0033-saas-admin-no-design-system/specification.md)
- [SPEC-0034 — Isolamento de tenant e de imobiliária, e login sem credencial pré-preenchida](specifications/0034-isolamento-de-tenant-e-login/specification.md)
- [SPEC-0035 — Autorização: fechar os portões, sanear as permissões, e o menu obedecer a elas](specifications/0035-menu-por-permissao/specification.md)
- [SPEC-0036 — O passo de analisar, e o caminho de volta para a imobiliária](specifications/0036-retorno-da-analise-a-imobiliaria/specification.md)
- [SPEC-0037 — Pendências tipificadas na análise de crédito, e um histórico que diz o que mudou](specifications/0037-tipos-de-pendencia-na-analise/specification.md)
- [SPEC-0038 — Emissão da garantia e a espera pela assinatura](specifications/0038-emissao-e-assinatura-da-garantia/specification.md)
- [SPEC-0039 — Emitir a garantia conferindo, e sem poder divergir da análise](specifications/0039-emissao-de-garantia-na-analise/specification.md)
- [SPEC-0040 — Assinou, fecha o dossiê: alterar arquivo vira exceção nomeada e visível](specifications/0040-dossie-da-garantia-fechado/specification.md)
- [SPEC-0041 — A Equipe passa a administrar de verdade: no celular, sem 403, e sem mudar acesso em silêncio](specifications/0041-equipe-e-perfis-no-mobile/specification.md)
- [SPEC-0042 — Tutoriais em vídeo, e onde encontrá-los](specifications/0042-tutoriais-em-video/specification.md)
- [SPEC-0043 — Ninguém consegue dizer que versão está no ar, nem o que mudou nela](specifications/0043-versao-e-novidades/specification.md)
- [SPEC-0044 — O que mudou não cabe onde está sendo contado](specifications/0044-pagina-de-novidades/specification.md)
- [SPEC-0045 — Assuntos, navegação e a versão certa para cada aparelho](specifications/0045-grupos-e-navegacao-na-ajuda/specification.md)
- [SPEC-0046 — Documento e telefone com máscara, e erro de formulário que a pessoa consegue ler](specifications/0046-mascaras-e-erros-na-analise-de-credito/specification.md)
- [FIX-0002 — Zoom automático no mobile ao focar qualquer campo](fixes/0002-zoom-automatico-no-mobile.md)
- [FIX-0003 — A API responde antes de comitar a transação](fixes/0003-api-responde-antes-de-comitar.md)
- [FIX-0006 — Erros encontrados na jornada da análise de crédito](fixes/0006-erros-encontrados-pela-jornada.md)
- [FIX-0007 — Documento do cadastro do inquilino aparece como "Entregue" numa análise recém-criada, sem nenhuma pista de que veio de antes](fixes/0007-cpf-ja-vem-entregue.md)
- [FIX-0008 — A caixa azul do passo Documentos afirma o que o sistema não faz](fixes/0008-caixa-azul-do-passo-documentos.md)
- [FIX-0009 — A aprovação pede num modal o que a tela já mostra, e o setup é um campo vazio sem referência](fixes/0009-aprovacao-em-modal-duplicado.md)
- [FIX-0010 — O anexo grande não sobe, e o que subiu quebrado abre em branco](fixes/0010-preview-de-documento-da-garantia.md)
- [FIX-0012 — A tela decide com dado que não é dela: identidade congelada, e formulário preenchido pelo navegador](fixes/0012-onboarding-nao-leva-ao-painel.md)
- [FIX-0014 — No celular, a Ajuda esconde metade do índice atrás de um gesto que a tela não anuncia](fixes/0014-ajuda-mobile-pilulas-scroll-horizontal.md)
- [FIX-0021 — Seletor de parceira só alcança a primeira página, e em Inquilinos nem a busca resolve](fixes/0021-seletor-imobiliaria-limitado-a-50.md)
- [FIX-0022 — A faxina do e2e e quatro specs falam com um container de banco que não existe mais](fixes/0022-faxina-e2e-container-inexistente.md)
- [SPEC-0048 — Geração automática de cobranças e tela de gestão](specifications/0048-gestao-de-cobrancas/specification.md)
- [SPEC-0049 — Remoção lógica e recuperação: imobiliária, inquilino, imóvel, análise de crédito, garantia e cobrança](specifications/0049-remocao-logica-de-registros/specification.md)
- [SPEC-0050 — Consulta ao Boa Vista (Cadastro Positivo) na análise de crédito, configurável por tenant](specifications/0050-analise-credito-boavista/specification.md)
- [SPEC-0051 — Usuários da imobiliária: quem tem acesso, e como tirá-lo](specifications/0051-usuarios-da-imobiliaria/specification.md)
- [SPEC-0052 — Catálogo de consultas de crédito configurável, com custo e conciliação (API Full)](specifications/0052-consultas-credito-api-full/specification.md)
- [SPEC-0053 — Central de ajuda na ordem da jornada: tudo visível, busca e capítulos ao lado do vídeo](specifications/0053-central-ajuda-jornada/specification.md)
- [SPEC-0054 — Cobrança com tipo, canal e parcela, e o resumo do mês que hoje mora na planilha](specifications/0054-cobranca-por-tipo-e-canal/specification.md)
- [SPEC-0055 — O acerto com a imobiliária: o que ela recolheu, o que repassou, e o mês fechado](specifications/0055-repasse-por-imobiliaria/specification.md)
- [SPEC-0056 — A taxa de adesão: da imobiliária, por imobiliária, e de volta como comissão](specifications/0056-taxa-de-adesao/specification.md)
- [SPEC-0057 — A mensalidade da garantia: uma faixa por tipo de tomador, escolhida na aprovação](specifications/0057-taxa-da-mensalidade/specification.md)

### Falta

- A suíte e2e inteira roda só sob pedido (política de testes do `CLAUDE.md`); não há
  execução agendada.

Antes de gravar, confirmar cada item de "Feito" do Worker e de Integrações contra apps/api/app/worker.py e apps/api/app/services/ (a spec exige não descrever como existente o que não está no código).

  • [ ] Step 2: Roadmap

Em docs/roadmap.md, substituir a seção inteira ## Dívida técnica conhecida (do título até antes do próximo ## ou do fim do arquivo) por:

## Dívida técnica

A dívida técnica e o que falta construir em cada parte da arquitetura estão em
[Implementação](implementacao.md).
A lista "Resolvidos desde julho" sai junto (é histórico do roadmap; fica no git log).

  • [ ] Step 3: Navegação

Substituir o bloco nav: de mkdocs.yml por:

nav:
  - Andamento: index.md
  - Roadmap:
      - Visão: product/vision.md
      - Roadmap: roadmap.md
  - Especificações:
      - product/index.md
      - Regras de negócio: product/business-rules.md
      - Glossário: product/glossary.md
      - Design tokens: design-tokens.md
      - Padrões de UI: ui-patterns.md
      - Navegação-alvo: navigation-brief.md
      - Contexto de marca: impeccable.md
      - Specs: specifications/index.md
      - Fixes: fixes/index.md
  - Arquitetura:
      - architecture/index.md
      - Contexto do sistema: architecture/system-context.md
      - Containers: architecture/containers.md
      - Componentes: architecture/components.md
      - Modelo de dados: architecture/data-model.md
      - Deployment: architecture/deployment.md
      - Decisões (ADRs): decisions/index.md
  - Implementação: implementacao.md
  - Guias:
      - Como navegar: guias.md
      - getting-started/index.md
      - Setup: getting-started/setup.md
      - Dia a dia: getting-started/development.md
      - API: api/index.md
      - operations/index.md
      - Deploy do produto: operations/deployment.md
      - Plataforma de documentação: operations/documentation-platform.md
      - Troubleshooting: operations/troubleshooting.md
      - Template de spec: doc-templates/specification.md
      - Template de fix: doc-templates/fix.md
      - Template de ADR: doc-templates/adr.md
      - Guia para IA: ai-guide.md
      - Metadados: metadata/README.md
      - Tweaks (histórico): tweaks/index.md

  • [ ] Step 4: Lint e build

Run: python3 scripts/docs_lint.py && .venv-docs/bin/mkdocs build --strict Expected: docs_lint: ok e Documentation built. Se o docs_lint exigir entrada no catálogo para implementacao.md ou guias.md, acrescentar no mesmo formato das existentes (type: architecture/operation, status: atual).

  • [ ] Step 5: Conferir o gerado

Run: grep -c "SPEC-" site/implementacao/index.html → maior que zero; grep -c "<!-- implementacao" site/implementacao/index.html → 0.

  • [ ] Step 6: Commit (com pedido do usuário)
git add docs/implementacao.md docs/roadmap.md mkdocs.yml docs/metadata/catalog.yaml
git commit -m "docs(0058): Implementação (feito × falta) e a navegação em seis abas"

Task 4: o build do container leva as notas de versão

Files: - Modify: infra/dev-remote/docs.Dockerfile - Modify: scripts/publicar-preview-docs.sh

  • [ ] Step 1: Dockerfile

Depois de COPY docs/ ./docs/:

# Spec 0058, RN9 — o hook do Andamento lê as notas de versão do app.
COPY apps/web/src/versoes/ ./apps/web/src/versoes/

  • [ ] Step 2: Script de publicação

Depois da linha cp "$CONTEUDO/requirements-docs.txt" "$BASE/requirements-docs.txt":

mkdir -p "$BASE/apps/web/src/versoes"
rsync -a --delete "$CONTEUDO/apps/web/src/versoes/" "$BASE/apps/web/src/versoes/"
E atualizar o echo acima delas para citar apps/web/src/versoes/.

  • [ ] Step 3: Sintaxe

Run: bash -n scripts/publicar-preview-docs.sh && echo ok → ok.

  • [ ] Step 4: Commit (com pedido do usuário)
git add infra/dev-remote/docs.Dockerfile scripts/publicar-preview-docs.sh
git commit -m "docs(0058): o build do site de docs leva as notas de versão"

Task 5: verificação final

  • [ ] Step 1: cd docs/hooks && ../../.venv-docs/bin/pytest -q → todos PASS.
  • [ ] Step 2: .venv-docs/bin/mkdocs build --strict → Documentation built.
  • [ ] Step 3: revisão da branch inteira com o requesting-code-review do Superpowers e a rubrica .claude/rubrics/implementacao.md (as seções de autorização saem da conta — spec sem superfície de segurança).
  • [ ] Step 4: com pedido do usuário: merge na main, push, e bash scripts/publicar-preview-docs.sh main (só aqui o Dockerfile novo vale — RN9).
  • [ ] Step 5: prints de https://docs.garantora.com.br/ e https://docs.garantora.com.br/implementacao/ em 1440px e 375px, com document.documentElement.scrollWidth - clientWidth == 0 (CA8).
  • [ ] Step 6: marcar os CAs da spec, preencher o Registro e passar o status para concluida (front matter, cabeçalho, catálogo, índice).