0058 — A documentação começa pelo andamento: roadmap, especificações, arquitetura e implementação¶
| Status | CONCLUÍDA |
| Branch | spec/0058-documentacao-pelo-andamento |
| Criada em | 2026-10-15 |
| Apps afetados | nenhum app do produto — docs/, mkdocs.yml, infra/dev-remote/docs.Dockerfile, scripts/ |
| Design | conduzido pelo Superpowers brainstorming em 2026-10-15, aprovado por partes pelo usuário |
| Revisão da implementação | aprovada (nota 8) |
Spec de ferramental: não toca apps/api, apps/web nem apps/e2e, e não tem superfície de autorização. O design foi conversado e aprovado em três partes (a página Andamento, a página Implementação, e navegação/build/verificação); este documento o registra.
Parte I — O problema¶
1. Dor¶
O site de documentação (docs.garantora.com.br) está organizado por tipo de documento — Getting Started, Produto, Specifications, Fixes, Tweaks, Arquitetura, ADRs, API, Operações, Templates, Guia para IA, Metadados —, doze abas na mesma altura. Quem abre o site para saber onde o projeto está não tem por onde começar:
- Não há página que diga o estado do projeto. A versão no ar só aparece no painel de Novidades do app ou no
git tag; o que está em andamento só se descobre lendo o catálogo (docs/metadata/catalog.yaml) ou os status de dezenas de specs; o que vem a seguir está no meio do roadmap. - A ordem não conta a história. O natural para quem acompanha o projeto — o que está acontecendo, para onde vai, o que foi especificado, como foi desenhado, o que já foi construído e o que falta — não corresponde a nenhuma sequência das abas.
- "O que falta construir" não tem lugar. A arquitetura descreve o desenho técnico; o que dele já existe e o que não existe está espalhado entre o roadmap (seções "❌ Ausente" e "Dívida técnica conhecida") e o registro de cada spec.
- Documento escrito à mão envelhece em silêncio. O roadmap ficou dois meses parado enquanto as specs 0005 a 0054 eram entregues (está registrado no topo dele); uma página de andamento escrita à mão teria o mesmo destino.
2. Quem sente¶
- O dono do produto e quem acompanha o projeto de fora (sócio, cliente) — querem saber o estado sem abrir o repositório. Caminho obrigatório: é a primeira pergunta de quem visita.
- Quem desenvolve — precisa saber o que falta construir em cada parte da arquitetura antes de propor trabalho novo (o pedido de baixa de parcelas em massa, abandonado em 2026-10-13 antes de virar spec, descrevia algo que o acerto da 0055 já fazia).
Não há volume a medir: o site deixou de ter senha em 2026-10-15 e não tem analytics.
3. A jornada de hoje¶
- A pessoa abre
docs.garantora.com.bre cai em "Início", uma página de orientação por tipo de documento. - Para saber a versão no ar, abre o app e o painel de Novidades, ou pergunta.
- Para saber o que está em andamento, abre Specifications e lê a coluna de status de uma tabela com dezenas de linhas — ou o
catalog.yaml. - Para saber o que vem a seguir, abre Produto → Roadmap e procura "❌ Ausente" e "Plano de entregas".
- Para saber o que falta construir tecnicamente, cruza a arquitetura com a "Dívida técnica conhecida" do roadmap. ← quebra aqui: não há lugar que junte desenho e estado.
4. Resultado esperado¶
- Quem abre o site vê primeiro o andamento: versão no ar, o que entrou nas últimas versões, o que está aberto agora, o que vem a seguir — tudo gerado no build, sem envelhecer.
- A navegação segue a ordem Andamento → Roadmap → Especificações → Arquitetura → Implementação → Guias.
- Há uma página Implementação que diz, por elemento da arquitetura, o que já foi feito e o que falta.
Sabe-se que resolveu quando a página inicial do site mostra a versão publicada mais recente e as specs abertas sem que ninguém tenha editado a página.
5. Fora de escopo¶
- Mover arquivos de pasta. Só a navegação muda; os caminhos de
docs/ficam como estão, para nenhum link entre documentos quebrar. - Gerar a tabela de
docs/specifications/index.mdoudocs/fixes/index.mda partir do catálogo. Cogitado e deixado de fora: o catálogo já é a fonte, e a tabela manual existe por decisão da ADR-0004. - Analytics, busca nova, versão do site por release.
- Ler a versão no ar consultando a produção (
/api/v1/health) durante o build: o build não depende de rede; a versão vem das notas. - Mudar o conteúdo das specs, fixes e ADRs existentes.
Parte II — A experiência¶
7. Jornada pretendida¶
Ponto de entrada: https://docs.garantora.com.br/. A página inicial é o Andamento.
7.0 A página Andamento (gerada no build)¶
Na ordem em que aparece:
- Versão no ar — número e data da nota de versão mais alta em
apps/web/src/versoes/(o/shiprecusa deploy sem nota emorigin/main, então a nota mais alta damainé a publicada; ressalva conhecida: um rascunho de nota ainda não publicado apareceria como no ar). - O que entrou nas últimas versões — as três notas mais recentes, com os itens como estão escritos (já são texto para quem usa o produto), e um link para o histórico completo (todas as notas, em ordem decrescente, numa seção recolhível da mesma página).
- Em andamento — as specs e fixes do catálogo com status
rascunho,aprovadaouem-implementacao, com link. Sem nenhum: "Nenhum trabalho aberto." - Próximos passos — os títulos
###das seções "❌ Ausente" e "Plano de entregas" do roadmap, cada um com link para a seção. - Números do projeto — specs concluídas, fixes corrigidos e versões publicadas, contados na hora do build.
7.0b A página Implementação¶
Uma página, uma seção por elemento da arquitetura, na ordem do C4: Web (apps/web), API (apps/api), Worker e jobs agendados, Integrações externas, Infra (local, dev-remote, produção), Testes. Cada seção tem:
- Feito — gerado no build onde o catálogo permite: as specs e os fixes concluídos cujo
componentscitaweb,api,infraoue2e(Testes), como links. Worker e Integrações não têm marcação no catálogo: o "feito" deles é escrito à mão, em poucas linhas, com link para a spec de origem. - Falta — escrito à mão: o que a arquitetura prevê e o código não tem.
- Dívida técnica — a seção "Dívida técnica conhecida" sai do roadmap e vem para cá, distribuída pelos elementos.
O roadmap fica com o olhar de negócio (modelo de domínio, situação por processo, implementado / parcial / ausente, decisões, plano de entregas); onde citava dívida técnica, aponta para Implementação.
7.0c Navegação¶
Seis abas:
- Andamento
- Roadmap — Visão, Roadmap
- Especificações — Regras de negócio, Glossário, Design tokens, Padrões de UI, Navegação-alvo, Contexto de marca, Specs, Fixes
- Arquitetura — Contexto, Containers, Componentes, Modelo de dados, Deployment, ADRs
- Implementação
- Guias — Como navegar (a orientação que hoje é a página inicial), Setup, Dia a dia, API, Operação (deploy, plataforma de documentação, troubleshooting), Templates, Guia para IA, Metadados, Tweaks (histórico)
7.1 Desktop¶
O tema da spec de documentação de 2026-10-15 (cores e tipografia do design system, largura total) continua. As seis abas cabem numa linha em 1440px. O Andamento usa os componentes de texto do Material — títulos, listas, tabelas e um bloco recolhível (??? note) para o histórico de versões —, sem HTML próprio.
7.2 Mobile (375px)¶
As abas viram o menu lateral do Material (comportamento padrão do tema). As listas do Andamento são texto empilhado; a tabela de números tem duas colunas (rótulo e valor) e cabe em 375px sem rolagem horizontal. As listas de "Feito" da Implementação são listas, não tabelas, pelo mesmo motivo.
7.3 Estados¶
- Fonte ausente no build (a pasta de notas, o catálogo ou uma das duas seções do roadmap): o build falha com mensagem dizendo qual fonte faltou. Uma página de andamento vazia passaria por verdadeira.
- Nenhum trabalho aberto: a seção diz isso, em vez de sumir.
- Nota de versão sem data ou sem itens: entra com o que tem; o hook não inventa data.
Parte III — Detalhamento¶
9. Regras¶
- RN1 — O hook.
docs/hooks/andamento.py, registrado emmkdocs.yml(hooks:), gera as partes automáticas no eventoon_page_markdown: substitui marcadores no Markdown da página —<!-- andamento -->emdocs/index.mde<!-- implementacao:<elemento> -->emdocs/implementacao.md— pelo conteúdo gerado. A lógica de leitura e montagem vive em funções puras no mesmo módulo (ler notas, ler catálogo, ler seções do roadmap, montar o Markdown), testáveis sem o MkDocs. - RN2 — As notas de versão. Arquivos
X.Y.Z.mdemapps/web/src/versoes/; a primeira linhadata: AAAA-MM-DDé a data; linhas que começam com-são itens (continuação indentada pertence ao item anterior). Ordenação por versão semântica, não por nome de arquivo (0.10.0depois de0.9.1). - RN3 — O catálogo.
docs/metadata/catalog.yaml; "em andamento" =typeemspecification/fixcomstatusemrascunho,aprovada,em-implementacao; "concluídas" = specsconcluida; "corrigidos" = fixescorrigido. - RN4 — O roadmap.
docs/roadmap.md; os itens de "Próximos passos" são os títulos###sob os##que começam com "❌ Ausente" e "Plano de entregas", com âncora no padrão do MkDocs (toc.slugify). - RN5 — Falha cedo. Faltando a pasta de notas, o catálogo ou uma das duas seções do roadmap, o hook levanta erro e o
mkdocs build --strictfalha, nomeando o que faltou. - RN6 — A página inicial.
docs/index.mdpassa a ser o Andamento (texto curto de abertura + marcador). A orientação que estava nela vai paradocs/guias.md("Como navegar"). - RN7 — Implementação.
docs/implementacao.md, escrito à mão com as seções da Parte II e os marcadores do "feito"; a "Dívida técnica conhecida" sai dedocs/roadmap.mde entra aqui; o roadmap ganha uma linha apontando para Implementação. - RN8 — Navegação.
mkdocs.ymlcom as seis abas da 7.0c; nenhum arquivo dedocs/muda de caminho. - RN9 — Build. O container de docs passa a ter
apps/web/src/versoes/dentro do contexto de build:infra/dev-remote/docs.DockerfileganhaCOPY apps/web/src/versoes/ ./apps/web/src/versoes/, escripts/publicar-preview-docs.shsincroniza essa pasta da branch sobre a base, como já faz comdocs/. O hook a procura relativa ao diretório domkdocs.yml(<raiz>/apps/web/src/versoes), que é o mesmo no host e no container.
Validação antes do merge: o script de publicação usa o Dockerfile da main por desenho (só o conteúdo vem da branch), e o da main ainda não copia as notas. Por isso a branch desta spec se valida com mkdocs build --strict local (numa venv com requirements-docs.txt, como o script já faz quando há .venv-docs) e com os testes do hook; a publicação no site acontece depois do merge, com publicar-preview-docs.sh main.
10. Autorização e isolamento¶
Sem superfície de segurança no produto: nenhum endpoint, tela ou dado do app muda. O site é público desde 2026-10-15 por decisão do usuário; esta spec não muda isso. As notas de versão já são públicas (vão no bundle do app, spec 0043, RN11).
11. Impacto por app¶
apps/api,apps/web,apps/e2e— sem impacto (o hook só lêapps/web/src/versoes/).docs/hooks/andamento.py(novo),docs/hooks/test_andamento.py(novo, pytest, com fixtures emdocs/hooks/fixtures/),docs/implementacao.md(novo),docs/guias.md(novo),docs/index.md,docs/roadmap.md,mkdocs.yml,infra/dev-remote/docs.Dockerfile,scripts/publicar-preview-docs.sh,docs/metadata/catalog.yamledocs/specifications/index.md(esta spec).- O MkDocs exclui
docs/hooks/do site (exclude_docs), para os testes e fixtures não virarem páginas.
12. Contrato¶
Sem contrato de API. O "contrato" é o formato das três fontes (RN2–RN4).
13. Critérios de aceite¶
- [x] CA1. (RN1, RN2, RN6) A página inicial do site mostra a versão mais alta de
apps/web/src/versoes/com a data dela, e as três notas mais recentes; com uma nota0.10.0e uma0.9.1nas fixtures, a mais alta é0.10.0. - [x] CA2. (RN3) "Em andamento" lista exatamente as specs e fixes com status
rascunho,aprovadaouem-implementacaono catálogo; sem nenhum, mostra "Nenhum trabalho aberto." - [x] CA3. (RN4) "Próximos passos" lista os
###de "❌ Ausente" e "Plano de entregas" do roadmap, com link que abre a seção. - [x] CA4. (RN5) Sem a pasta de notas (ou sem o catálogo, ou sem uma das seções do roadmap), a função de montagem levanta erro nomeando a fonte — provado por teste.
- [x] CA5. (RN7)
docs/implementacao.mdtem as seis seções; "Feito" de Web, API, Infra e Testes lista as specs/fixes concluídos com aquelecomponents; a "Dívida técnica conhecida" não está mais no roadmap e está em Implementação. - [x] CA6. (RN8) A navegação tem as seis abas na ordem da 7.0c, e o
mkdocs build --strictpassa (nenhum link quebrado). - [x] CA7. (RN9) Depois do merge,
scripts/publicar-preview-docs.sh mainpublica o site com o Andamento preenchido; antes dele,mkdocs build --strictlocal passa com o hook. - [x] CA8. (7.2) Em 375px, o Andamento e a Implementação não têm rolagem horizontal (
scrollWidth - clientWidth == 0), conferido por print. - [x] CA9. Os testes do hook passam com
pytest docs/hooks/.
14. Plano de implementação¶
O plano detalhado sai do Superpowers writing-plans, em plan.md nesta mesma pasta.
15. Decisões em aberto¶
Nenhuma.
17. Revisão da implementação¶
| Rodada | Escopo | Critical | Important | Minor | Nota | Veredicto |
|---|---|---|---|---|---|---|
| 1 | branch | 0 | 1 | 5 | 8 | Aprovada |
18. Registro¶
Executado pelo Superpowers executing-plans (modo nativo), com o ledger em .superpowers/sdd/. O que divergiu do plano, e por quê:
- Sem commit por tarefa — o
CLAUDE.mdexige pedido explícito para commitar; a revisão final usou o diff da árvore de trabalho. - O catálogo guarda a lista sob
documents— a fixture do plano era uma lista solta. A fixture foi corrigida para o formato real (vermelho visto) e o hook lêdocuments. - O marcador só conta sozinho na linha — a spec e o plano citam os marcadores em código inline, e o hook os trocava, gerando 24 links quebrados no build estrito. Teste
test_marcador_citado_em_codigo_nao_e_trocado, vermelho antes da correção. docs/guias.mdsem front matter, como oindex.md: com front matter odocs_lintexigiria entrada no catálogo para uma página de navegação..venv-docsno.dockerignore— a venv dos testes ia para o contexto de build de todas as imagens do dev-remote.- CA8 provado no build local (servido na máquina), porque o site só recebe o Dockerfile novo depois do merge (RN9). O CA7 se confere depois do merge, com a publicação da
main.
Revisão da branch: aprovada (nota 8). Ficaram como pendência, sem efeito hoje: links para a spec de origem no "feito" escrito à mão (Worker e Integrações); a lista "Resolvidos desde julho" que saiu do roadmap; bordas do parser de notas que o app trata diferente (data: sem validar, subitem indentado, tab); e títulos ### repetidos no roadmap, cuja âncora o hook não reproduziria.
Achado fora do escopo, levado ao usuário: o painel de Novidades do app (apps/web/src/versoes/index.ts, interpretar) corta os itens de nota que ocupam mais de uma linha no ponto da primeira quebra — o site de docs, que junta as linhas, e o app passam a mostrar textos diferentes da mesma nota.