OpenAPI (Swagger): Contratos, Documentação e Automação
Voltar para Learn
FAACCapítulo 12

Fundamentos e Arquitetura de APIs Corporativas

OpenAPI (Swagger): Contratos, Documentação e Automação

Da descrição formal da interface à validação, geração de artefatos, publicação em portais e governança no API Gateway

Edição aprofundada - material de estudo e consulta profissional

Contrato OpenAPI conectando design, validação, documentação, automação, API Gateway e runtime

Do desenho ao runtime: o contrato como eixo da plataforma

Contrato OpenAPI conectando design, qualidade, automação, execução, documentação e governança
Figura de abertura - O contrato conecta desenho, implementação, testes, documentação e operação.

A mesma descrição orienta documentação, validação, segurança, compatibilidade e publicação.

Apresentação do capítulo

Nos capítulos anteriores, foi estudado como estilo arquitetural e o Modelo de Maturidade de Richardson foi usado para observar recursos, semântica e hipermídia. O passo seguinte é transformar essas decisões em um contrato explícito, revisável e processável por ferramentas. A Specification, frequentemente associada ao nome por razões históricas, fornece uma linguagem padronizada para descrever interfaces sem depender de uma linguagem de programação específica.

Uma descrição não é apenas uma página de documentação. Quando completa e coerente, ela registra caminhos, operações, parâmetros, corpos, representações, respostas, , modelos de dados, requisitos de segurança e informações de servidores. Esse documento pode alimentar portais para desenvolvedores, validadores, mocks, geradores de clientes, testes de contrato, políticas de , catálogos e mecanismos de análise de compatibilidade.

Em ambientes corporativos, o valor do contrato aumenta porque várias equipes dependem da mesma . O consumidor precisa saber o que pode enviar e receber; o desenvolvedor do precisa implementar a interface acordada; a equipe de precisa publicar e proteger operações; segurança precisa avaliar esquemas de autenticação; testes precisam construir cenários; e governança precisa detectar mudanças incompatíveis. Sem uma fonte comum, cada área cria uma interpretação própria e a divergência aparece tarde, normalmente em homologação ou produção.

Este capítulo utiliza a família 3 como referência. Serão abordadas a estrutura do documento, a relação com , o uso de e , referências reutilizáveis, segurança, exemplos, , , , , , diff semântico, geração de artefatos e integração com . A ênfase está em produzir contratos precisos, e não apenas arquivos que passam por um editor visual.

Como estudar este capítulo

Mantenha um editor aberto e valide cada exemplo. Para cada operação, pergunte: qual recurso está sendo representado, quais entradas são obrigatórias, quais respostas são possíveis, como os erros são modelados, qual segurança se aplica e como uma ferramenta distinguirá mudança compatível de mudança quebradora?

Objetivos de aprendizagem

  • Explicar a finalidade da Specification e diferenciar especificação, descrição, contrato, documentação e implementação.
  • Distinguir de e reconhecer o papel histórico e atual desses termos.
  • Construir a estrutura raiz de uma Description em ou .
  • Descrever paths, operations, parameters, requestBody, , e media types.
  • Modelar dados com Objects, composição, restrições, nulabilidade e discriminação.
  • Reutilizar elementos com components e referências sem criar ciclos ou dependências frágeis.
  • Declarar , authentication, 2.0, OpenID Connect e no contrato.
  • Comparar , e abordagens híbridas com critérios técnicos e organizacionais.
  • Aplicar parsing, , diff, mocking, geração de SDKs e testes de contrato em .
  • Integrar a portais, catálogos, e processos de governança.

Estrutura do capítulo

  • 12.1 O que é e qual problema ela resolve
  • 12.2 e : termos relacionados, mas diferentes
  • 12.3 Description como contrato executável
  • 12.4 Estrutura raiz do documento
  • 12.5 , e regras de serialização
  • 12.6 info, servers, tags e externalDocs
  • 12.7 paths, e
  • 12.8 Parâmetros de path, query, e
  • 12.9 requestBody, content e media types
  • 12.10 , , links e erros
  • 12.11 e
  • 12.12 Restrições, composição e polimorfismo
  • 12.13 components, e modularização
  • 12.14 Segurança no contrato
  • 12.15 Exemplos, e
  • 12.16 , e abordagem híbrida
  • 12.17 Parsing, validação e
  • 12.18 Mock servers, geração de SDKs e stubs
  • 12.19 Testes de contrato e conformidade
  • 12.20 Compatibilidade e mudanças quebradoras
  • 12.21 3.0, 3.1 e 3.2
  • 12.22 Portais, catálogos e
  • 12.23 Governança e CI/CD
  • 12.24
  • 12.25 Estudos de caso e laboratórios
  • Resumo, checklist, exercícios, glossário e referências

12.1 O que é e qual problema ela resolve

A Specification, ou , define uma forma padronizada e independente de linguagem para descrever . O documento resultante é chamado de Description. Ele pode ser lido por pessoas, mas sua característica decisiva é ser estruturado o suficiente para que programas descubram operações, dados e requisitos sem inspecionar o código-fonte do serviço ou observar tráfego de rede.

O problema central resolvido é a ambiguidade de interface. Uma documentação escrita apenas em texto pode afirmar que o campo valor é numérico, mas não dizer se aceita negativos, quantas casas decimais são permitidas, se é obrigatório ou como erros são representados. Em , essas regras podem ser expressas por tipos, formatos, limites, padrões, enumerações, required, content types e respostas associadas a cada operação.

A especificação não implementa o serviço e não garante que o runtime cumpra o contrato. Ela descreve a interface esperada. A conformidade depende de geração controlada, validação de mensagens, testes e observabilidade. Também não define a lógica de negócio: saber que /transferencias aceita uma estrutura não explica como saldo, antifraude, limites ou compensação são calculados.

é particularmente útil em plataformas com múltiplos consumidores porque permite separar a interface pública da estrutura interna do . Um serviço pode mudar banco de dados, classes, ou topologia sem alterar o contrato. Quando uma mudança de interface é necessária, ferramentas podem comparar versões e indicar potenciais quebras antes da publicação.

Modelo mental

descreve o que um consumidor pode observar e utilizar na interface . Código implementa esse comportamento; testes verificam a correspondência; e portal publicam e governam a interface. Nenhum desses elementos substitui os demais.

12.2 e : termos relacionados, mas diferentes

foi o nome do projeto original criado para descrever e fornecer ferramentas como interface de documentação, geração de código e editor. Em 2015, a especificação foi doada à Initiative e passou a ser desenvolvida como Specification. A versão 2.0 tornou-se a base da 2.0; as linhas posteriores adotaram oficialmente o nome 3.x.

Hoje, costuma designar um ecossistema de ferramentas e produtos que trabalham com , enquanto designa a especificação. Expressões como arquivo ainda aparecem em projetos, mas podem ser imprecisas: é necessário saber se o documento está em / 2.0 ou 3.x, porque a estrutura de servers, requestBody, content, components e security mudou significativamente.

A distinção evita erros de integração. Uma ferramenta que aceita apenas 2.0 não necessariamente compreende 3.1. Da mesma forma, uma interface visual chamada UI pode renderizar uma Description sem que o serviço tenha sido gerado por ou use qualquer biblioteca específica. O contrato pertence à organização e deve permanecer portátil.

Tabela 1 - Vocabulário que reduz ambiguidades em projetos e integrações.
TermoUso recomendadoObservação
OpenAPI SpecificationPadrão que define a linguagem e os objetos da descrição.Possui versões e documentos normativos.
OpenAPI DescriptionDocumento concreto da API, em YAML ou JSON.Pode ser único ou distribuído em vários arquivos.
Swagger 2.0Nome histórico frequentemente associado à OpenAPI 2.0.Estrutura diferente de OAS 3.x.
Swagger toolingEditores, UI, geradores e bibliotecas.Ferramentas não são a especificação.

12.3 Description como contrato executável

O termo contrato executável indica que a descrição pode participar do ciclo de engenharia, e não apenas ser publicada no fim. Um parser verifica se o ou forma um documento válido; um validador confere regras da especificação; um linter aplica convenções organizacionais; um gerador produz stubs ou SDKs; um mock responde conforme exemplos; e um teste compara mensagens reais com declarados.

Executável não significa perfeitamente completo. Regras de negócio complexas, dependências entre campos, autorização contextual e efeitos colaterais podem exigir testes ou extensões adicionais. Ainda assim, quanto mais precisa a descrição, maior a quantidade de verificações automáticas possíveis. Descrições vagas, com do tipo object sem propriedades ou respostas default genéricas, fornecem pouca proteção.

Em governança, o contrato torna a revisão objetiva. Em vez de avaliar apenas screenshots ou documentos separados, a equipe analisa uma alteração versionada. Pull registram quem mudou a interface, quais regras falharam, qual impacto foi detectado e quais aprovações ocorreram. Essa trilha é especialmente importante em externas, reguladas ou compartilhadas por muitos domínios.

Pipeline de contrato com pull request, parser, linter, diff, testes e publicação
Figura 1 - Um de contrato transforma a descrição em controles repetíveis antes da publicação.

12.4 Estrutura raiz do documento

A raiz de uma Description é o . O campo informa a versão da especificação usada pelo documento. O objeto info identifica a e a versão do contrato. paths descreve e operações; components armazena objetos reutilizáveis; security pode aplicar requisitos globais; tags organizam operações; servers indica base; externalDocs aponta material complementar. Em versões recentes, também podem aparecer na raiz.

Nem todos os campos são obrigatórios em todas as versões, mas um documento mínimo útil precisa ir além da validade sintática. Uma descrição sem operações, respostas ou pode ser aceita por um parser e ainda ser inadequada para consumidores. O critério de qualidade deve considerar se a interface pode ser compreendida, testada e evoluída.

Extensões de especificação começam normalmente com x-, como x-owner-team ou x- -policy. Elas permitem transportar metadados não padronizados, mas criam acoplamento com ferramentas. Uma extensão deve possuir proprietário, , versão, documentação e política de compatibilidade; caso contrário, o contrato vira um recipiente de configurações arbitrárias.

Anatomia do OpenAPI Object com info, servers, paths, components, security e tags
Figura 2 - Principais áreas do e suas responsabilidades.
Documento mínimo expandido
openapi: 3.1.1
info:
  title: API de Clientes
  version: 1.4.0
servers:
  - url: https://api.empresa.example/clientes/v1
paths:
  /clientes/{clienteId}:
    get:
      operationId: obterCliente
      responses:
        '200':
          description: Cliente localizado
components:
  schemas: {}

12.5 , e regras de serialização

pode ser serializada em ou . Os dois formatos representam a mesma estrutura lógica, mas possuem riscos diferentes. é explícito em aspas, chaves e colchetes; é mais legível para edição manual, porém depende de indentação e possui recursos que podem variar entre parsers. Em ambos os casos, nomes de campos, tipos e valores precisam respeitar a versão da .

Em , tabs não devem ser usados para indentação, strings com caracteres especiais podem exigir aspas e valores como yes, no, on ou datas podem ser interpretados de forma inesperada por implementações antigas. Códigos de resposta devem ser tratados como strings, por exemplo '200'. Um path que contém dois-pontos, ou chaves deve ser revisado para evitar interpretação equivocada.

A organização deve padronizar codificação , finais de linha, ordenação lógica e formatação. Um formatador automático reduz diffs ruidosos e conflitos. Comentários são úteis para autores, mas não fazem parte do modelo semântico consumido por todas as ferramentas; informações essenciais devem estar em description, summary ou extensões definidas.

Regra prática para

Use dois espaços por nível, nunca tabs; coloque códigos de status entre aspas; evite tipos implícitos ambíguos; limite linhas; e execute parser e linter no mesmo commit. Um arquivo visualmente alinhado ainda pode representar tipos inesperados.

12.6 info, servers, tags e externalDocs

O objeto info fornece identidade humana ao contrato. title deve distinguir a ; version representa a versão da descrição ou da interface, conforme convenção declarada; description explica escopo, público, limites e premissas; contact e license registram responsabilidade e condições de uso. A versão em info não é a versão da , que permanece no campo .

servers lista base e pode conter variáveis. Uma descrição pode apresentar produção, homologação e sandbox, mas publicar internos em um contrato externo pode expor topologia. Em muitas organizações, o contrato canônico usa uma lógica e o portal injeta o ambiente. Variáveis devem possuir default e enumerações coerentes para evitar combinações inválidas.

tags agrupam operações por capacidade ou domínio. Elas não devem reproduzir a estrutura de times ou controladores automaticamente se isso prejudicar a experiência do consumidor. externalDocs serve para materiais que não cabem no contrato, como guias de onboarding, regras de negócio, runbooks ou políticas legais. Links externos precisam de ciclo de vida e monitoramento para não se tornarem referências quebradas.

Tabela 2 - Metadados também fazem parte da experiência e da governança.
ElementoPergunta que respondeErro frequente
infoQue API é esta, quem mantém e qual versão está publicada?Versionar sem convenção ou omitir proprietário.
serversEm quais bases a interface pode ser chamada?Misturar ambientes internos e externos.
tagsComo operações são agrupadas para descoberta?Copiar nomes de classes ou squads.
externalDocsOnde ficam guias e regras complementares?Apontar documentos sem manutenção.

12.7 paths, e

paths é um mapa cujas chaves representam templates de caminho. Cada pode conter operações como , , , e , além de parâmetros compartilhados. O path descreve a estrutura relativa à base; não deve ser incorporada à chave. /clientes/{clienteId} representa um recurso identificado, enquanto filtros pertencem a parameters.

Cada deve comunicar intenção. summary oferece uma frase curta; description registra detalhes; operationId cria um identificador estável usado por geradores; tags organizam; parameters e requestBody descrevem entradas; descreve resultados; security pode sobrescrever a regra global; deprecated sinaliza descontinuação sem remover imediatamente a operação.

operationId precisa ser único em todo o documento e estável ao longo do tempo. Geradores frequentemente o transformam em nome de método. Renomeá-lo pode quebrar SDKs mesmo quando e permanecem iguais. Paths também devem evitar ambiguidades como /clientes/{id} e /clientes/ativos no mesmo nível quando o roteador pode tratar ativos como valor de id.

O contrato deve documentar respostas de sucesso e falha relevantes. Declarar apenas 200 esconde validação, autenticação, autorização, conflito, limitação e indisponibilidade. Por outro lado, listar todos os códigos possíveis sem relação com a operação cria ruído. A seleção deve refletir comportamentos que consumidores precisam tratar.

Path Item e operação GET
paths:
  /clientes/{clienteId}:
    parameters:
      - $ref: '#/components/parameters/ClienteId'
    get:
      tags: [Clientes]
      summary: Obtém um cliente
      operationId: obterCliente
      responses:
        '200':
          $ref: '#/components/responses/ClienteEncontrado'
        '404':
          $ref: '#/components/responses/ProblemaNaoEncontrado'

O Parameter Object descreve valores transportados em path, query, ou . name e in formam a identidade do parâmetro. Parâmetros de path são sempre obrigatórios porque o template não pode ser resolvido sem o valor. Query parameters representam filtros, paginação, ordenação ou projeção; carregam metadados; são menos comuns em corporativas máquina a máquina.

define o tipo e as restrições. style e explode controlam a serialização de arrays e objetos, detalhe frequentemente ignorado. Um array de status pode ser enviado como status=ATIVO&status;=BLOQUEADO, como status=ATIVO,BLOQUEADO ou de outras formas. Sem declarar a estratégia, clientes e servidores podem produzir representações incompatíveis apesar de concordarem sobre o tipo lógico.

Parâmetros não devem duplicar informações do corpo sem uma regra explícita de precedência. padronizados pelo não precisam ser redefinidos de maneira inconsistente. Identificadores de correlação, idempotency keys e versões condicionais podem ser declarados, mas a semântica precisa constar na description e, quando possível, ser associada a , examples e respostas.

Tabela 3 - A localização altera a serialização e a semântica do parâmetro.
LocalUso típicoCuidados
pathIdentidade obrigatória no endereço do recurso.required=true e correspondência exata com o template.
queryFiltros, paginação, ordenação e campos opcionais.Definir serialização de arrays, defaults e limites.
headerCorrelação, idempotência, preferências e precondições.Evitar duplicar headers reservados ou dados sensíveis.
cookieEstado associado ao cliente em cenários específicos.Avaliar segurança, domínio, SameSite e adequação ao estilo da API.

12.9 requestBody, content e media types

Em 3, corpos de requisição são descritos por requestBody. O campo content mapeia media types para e exemplos. Isso permite que a mesma operação aceite representações diferentes, como application/ e application/ , desde que o comportamento seja realmente suportado. Declarar media types apenas para preencher documentação cria expectativas falsas e amplia a superfície de testes e segurança.

required indica se o corpo é obrigatório. O descreve estrutura, mas não substitui limites operacionais como tamanho máximo, compressão aceita ou regras para upload. multipart/form-data exige modelar partes e seus tipos; application/octet- representa conteúdo binário; arquivos em normalmente precisam de codificação e metadados claros.

O contrato deve distinguir ausência de propriedade, valor nulo e string vazia. Essa diferença impacta criação, atualização completa e . Em atualizações parciais, um campo ausente pode significar manter valor, enquanto null pode significar remover. A semântica não é inferida automaticamente pelo e deve ser documentada.

Corpo JSON com schema e exemplo
requestBody:
  required: true
  content:
    application/json:
      schema:
        $ref: '#/components/schemas/NovaTransferencia'
      examples:
        transferenciaPix:
          value:
            contaOrigem: '000123'
            valor: 125.90
            chaveDestino: cliente@example.com

é obrigatório em cada operação e mapeia códigos de status ou faixas para Objects. Cada resposta possui description e pode incluir , content e links. A descrição deve explicar o significado daquela resposta no contexto da operação, não apenas repetir a frase genérica do código .

de resposta como Location, , -After, RateLimit ou identificadores de correlação fazem parte do contrato observável. Location em uma criação indica o recurso criado; participa de e precondições; -After orienta nova tentativa; de limitação precisam ter semântica padronizada pela organização. Documentá-los permite geração de clientes e testes mais realistas.

Erros devem possuir modelo consistente. Uma estrutura inspirada em Problem Details pode registrar type, title, status, detail, instance e extensões de domínio. O contrato precisa diferenciar erro de validação, autenticação, autorização, conflito e indisponibilidade. Retornar 200 com um campo sucesso=false reduz a capacidade de intermediários e clientes aplicarem a semântica estudada nos capítulos anteriores.

Links no Object descrevem como valores de uma resposta podem alimentar outra operação. Eles não são idênticos aos links de hipermídia enviados no , mas ajudam ferramentas a entender relacionamentos e fluxos. Para jornadas complexas, a organização pode complementar com especificações de workflows, testes ou documentação.

Respostas explícitas de sucesso e falha
responses:
  '201':
    description: Transferência aceita
    headers:
      Location:
        schema: { type: string, format: uri-reference }
    content:
      application/json:
        schema:
          $ref: '#/components/schemas/Transferencia'
  '422':
    $ref: '#/components/responses/ProblemaValidacao'

12.11 e

O descreve a forma e as restrições de dados usados em parâmetros, corpos e respostas. Na linha 3.1, o modelo foi alinhado de maneira ampla ao Draft 2020-12. Isso permite utilizar palavras-chave de validação e composição de forma mais consistente, embora ferramentas possam implementar subconjuntos ou possuir diferenças de suporte.

Tipos básicos incluem string, number, integer, boolean, object, array e null, conforme o dialeto aplicável. properties define membros de objetos; required lista nomes obrigatórios; additionalProperties controla campos não declarados; items descreve elementos de arrays; enum e const limitam valores; minimum, maximum, minLength, pattern e formatos refinam validação.

format normalmente funciona como anotação semântica, e sua validação depende da ferramenta e da configuração. Declarar format: date-time não garante que todos os parsers rejeitem valores inválidos. Contratos críticos devem testar exemplos e mensagens reais com a mesma implementação usada no ou runtime.

excessivamente permissivos enfraquecem o contrato. additionalProperties: true pode ser adequado para mapas dinâmicos, mas em DTOs estáveis permite campos desconhecidos e dificulta detectar erros de digitação. Em contrapartida, fechar todos os objetos sem estratégia de evolução pode tornar adições compatíveis em quebras para consumidores que validam estritamente.

Schema de objeto com restrições
components:
  schemas:
    Cliente:
      type: object
      additionalProperties: false
      required: [id, nome, status]
      properties:
        id:
          type: string
          pattern: '^[0-9]{10}$'
        nome:
          type: string
          minLength: 1
          maxLength: 120
        status:
          type: string
          enum: [ATIVO, BLOQUEADO, ENCERRADO]

12.12 Restrições, composição e polimorfismo

allOf, anyOf, oneOf e not permitem compor . allOf exige que a instância satisfaça todos os subschemas e costuma ser usado para combinar estruturas; oneOf exige exatamente uma alternativa válida; anyOf aceita uma ou mais; not rejeita o indicado. O uso deve considerar como validadores e geradores interpretam a composição.

allOf não deve ser tratado automaticamente como herança orientada a objetos. Ele representa interseção de restrições. Se dois subschemas definem propriedades incompatíveis, a composição pode se tornar impossível. Geradores podem produzir classes diferentes para o mesmo contrato; portanto, a prioridade é a semântica da instância, não a estrutura desejada no código.

O discriminator ajuda a selecionar alternativas por uma propriedade, mas não substitui oneOf nem valida por si só todos os casos. Mapeamentos precisam apontar para existentes e valores devem ser estáveis. Polimorfismo sem discriminador pode depender de formatos mutuamente exclusivos, o que aumenta custo de validação e pode gerar mensagens de erro difíceis.

Restrições condicionais do , quando suportadas, permitem expressar relações como: se tipo for EMPRESA, então cnpj é obrigatório. Antes de adotá-las, verifique suporte de editores, , geradores e validadores. Um contrato teoricamente correto pode ser impraticável se ferramentas críticas ignorarem a palavra-chave.

Tabela 4 - Composição exige precisão e testes com as ferramentas reais.
Palavra-chaveSemânticaArmadilha
allOfA instância deve satisfazer todos os schemas.Confundir interseção com herança de classes.
oneOfExatamente uma alternativa deve ser válida.Alternativas sobrepostas validam mais de uma.
anyOfUma ou mais alternativas podem ser válidas.Consumidor não sabe qual representação recebeu.
discriminatorAjuda a escolher schema por propriedade.Mapeamento incompleto ou valores instáveis.

12.13 components, e modularização

components armazena , , parameters, examples, requestBodies, , securitySchemes, links, e outros objetos reutilizáveis. A reutilização reduz duplicação e permite aplicar correções em um ponto. Entretanto, componentes globais não são usados automaticamente: precisam ser referenciados pela operação ou por outro objeto.

substitui o objeto no local em que aparece por uma referência a outro componente ou documento, conforme as regras da versão. Referências internas usam Pointer, como #/components/ /Cliente. Referências externas podem apontar para arquivos ou recursos de rede. Identidade, resolução relativa, codificação de caracteres e política de acesso precisam ser controladas para builds reproduzíveis.

Dividir um contrato em muitos arquivos melhora organização, mas aumenta a complexidade de resolver e empacotar. reúne recursos mantendo referências; substitui referências pelo conteúdo, podendo aumentar tamanho e criar problemas com ciclos. A ferramenta de publicação deve produzir uma forma compatível com portal, e consumidores sem perder a fonte modular.

Bibliotecas corporativas de podem promover consistência, mas também acoplar domínios e dificultar evolução. Componentes compartilhados devem representar conceitos realmente estáveis, possuir versionamento e evitar que uma alteração em um arquivo central quebre dezenas de . Reuso por coincidência estrutural é mais perigoso que duplicação consciente.

Referências conectando uma operação a responses e schemas reutilizáveis
Figura 3 - conecta operações a componentes reutilizáveis, mas a governança precisa controlar identidade e evolução.

Evite o componente universal

Um Pessoa usado por cliente, funcionário, procurador e beneficiário tende a acumular campos opcionais e regras contraditórias. Prefira modelos orientados ao contexto da operação e compartilhe apenas elementos com semântica verdadeiramente comum.

12.14 Segurança no contrato

descreve mecanismos de segurança por Security Scheme Objects e aplica requisitos por Security Requirement Objects. Esquemas comuns incluem apiKey, , oauth2, openIdConnect e mutualTLS nas versões que o suportam. A descrição informa como o consumidor apresenta credenciais, mas não contém segredos nem implementa autenticação.

Um requisito global pode ser definido na raiz e sobrescrito por operação. Uma lista de requisitos representa alternativas lógicas; múltiplos esquemas no mesmo objeto representam combinação. Essa sintaxe precisa ser revisada com cuidado: declarar ou como alternativas é diferente de exigir ambos.

2.0 deve informar flows, authorizationUrl, tokenUrl e aplicáveis. OpenID Connect usa a de descoberta. são descritos como , com bearerFormat apenas como dica. descreve autenticação por certificado, mas detalhes de , emissão, revogação e subject mapping permanecem em políticas operacionais.

Não coloque , chaves, senhas ou certificados reais em examples, descriptions ou extensões. Contratos são copiados para repositórios, portais e artefatos. Dados de teste também precisam ser sintéticos para evitar exposição de informações pessoais ou segredos.

OAuth 2.0 combinado com mTLS
components:
  securitySchemes:
    OAuthCorporativo:
      type: oauth2
      flows:
        clientCredentials:
          tokenUrl: https://id.example/oauth2/token
          scopes:
            clientes.leitura: Consulta clientes
    CertificadoCliente:
      type: mutualTLS
security:
  - OAuthCorporativo: [clientes.leitura]
    CertificadoCliente: []

12.15 Exemplos, e

Examples tornam o contrato concreto e alimentam documentação, mocks e testes. Um pode ter example, e objetos de mídia podem ter examples nomeados. Exemplos devem ser válidos segundo o , cobrir casos representativos e evitar dados reais. Um exemplo desatualizado gera mais confusão que sua ausência, por isso deve ser validado automaticamente.

descrevem requisições que o provedor fará para uma fornecida durante uma operação. O caminho do pode usar uma expressão que extrai a da requisição ou resposta. Eles são úteis em processamento assíncrono, mas exigem modelar autenticação de retorno, , idempotência, disponibilidade e validação da para prevenir abuso de conexões de saída.

definidos na raiz descrevem requisições iniciadas pelo provedor sem depender de uma operação específica que registre a . A descrição informa o contrato da mensagem, mas a assinatura, protection, entrega, ordenação e política de repetição precisam de documentação adicional. Consumidores devem considerar que eventos podem chegar duplicados ou fora de ordem.

descreve bem operações individuais, mas jornadas com várias chamadas e dependências podem exigir especificações complementares, testes de cenário ou documentos de workflow. Não force toda regra temporal para dentro de descriptions longas; use referências governadas e exemplos executáveis.

12.16 , e abordagem híbrida

No , o contrato é elaborado e revisado antes da implementação. Isso permite envolver consumidores, arquitetura, segurança e enquanto mudanças ainda são baratas. Mocks podem desbloquear desenvolvimento paralelo. O risco é o contrato se afastar do código se a equipe não automatizar conformidade.

No , o serviço é implementado e a descrição é gerada a partir de anotações, reflexão ou metadados. A abordagem reduz duplicação inicial e tende a acompanhar tipos do código, mas pode expor detalhes de , produzir operationIds instáveis, omitir erros e dificultar revisão da experiência antes do desenvolvimento. O contrato passa a refletir o que foi codificado, não necessariamente o que deveria ser público.

A abordagem híbrida define um contrato canônico, gera parte do código e valida o runtime contra ele. Também pode extrair a descrição do código e submetê-la a regras e aprovação como artefato. O ponto essencial é estabelecer uma fonte de verdade: quando contrato e código divergem, qual é corrigido e qual impede publicação?

A escolha deve considerar maturidade da equipe, ciclo de releases, número de consumidores, necessidade de mocks, suporte das ferramentas e governança. Em externas ou amplamente compartilhadas, costuma oferecer maior controle. Em serviços internos simples, pode ser aceitável desde que o contrato publicado seja estável e revisado.

Tabela 5 - A abordagem é uma decisão de processo, não apenas de ferramenta.
AbordagemForça principalRisco principalControle necessário
Design-firstRevisão precoce e trabalho paralelo.Divergência entre contrato e runtime.Testes de conformidade e geração controlada.
Code-firstProximidade com tipos e implementação.Contrato acoplado ao framework e tardio.Linting, diff e revisão do artefato gerado.
HíbridaCombina contrato canônico e automação.Fluxo complexo sem fonte de verdade clara.Política explícita de precedência e pipeline.

12.17 Parsing, validação e

Parsing verifica se ou pode ser lido. Validação estrutural verifica se os objetos obedecem à versão da . Resolução de referências confirma que alvos existem. Validação de analisa palavras-chave e exemplos. aplica regras de estilo, governança e qualidade que a especificação não exige, como operationId único, descrições mínimas, convenção de nomes e respostas obrigatórias.

Essas etapas devem ser separadas porque produzem diagnósticos diferentes. Um documento pode ser sintaticamente válido e estruturalmente inválido; pode ser válido pela e reprovar regras corporativas; pode passar no linter e ter referência externa indisponível. Mensagens do precisam indicar arquivo, caminho do objeto, regra, severidade e correção sugerida.

Regras de devem possuir justificativa e versionamento. Transformar toda preferência em erro bloqueante cria atrito e incentiva exceções. Classifique regras em erro, aviso e informação; forneça mecanismo de supressão rastreável; revise falsos positivos; e meça quais regras previnem incidentes ou incompatibilidades reais.

Validação deve ocorrer localmente, no pull e antes da publicação. Usar versões diferentes de parser em cada etapa produz resultados inconsistentes. Fixe versões, registre checksums quando necessário e atualize ferramentas por processo controlado.

12.18 Mock servers, geração de SDKs e stubs

Um interpreta o contrato e retorna respostas simuladas. Ele permite que consumidores desenvolvam antes do , demonstra a em portais e executa testes de integração isolados. O mock pode escolher examples explícitos ou gerar valores a partir de . Valores gerados automaticamente nem sempre representam casos de negócio realistas, por isso examples nomeados são importantes.

Geradores transformam operações e em clientes, modelos ou stubs de servidor. O resultado depende de operationId, nomes de , nulabilidade, composição e formatos. Alterações aparentemente cosméticas podem renomear métodos ou tipos. Antes de adotar geração em massa, a equipe deve avaliar qualidade do código, extensibilidade, tratamento de erros, autenticação, e atualização de versões.

SDKs gerados não devem esconder a semântica de forma perigosa. Um método que lança a mesma exceção para 400, 404 e 409 impede decisões do consumidor. O gerador ou templates precisam preservar status, , corpo de erro e correlação. Também é necessário definir quem publica o , como ele é versionado e como vulnerabilidades em dependências são corrigidas.

Stubs de servidor aceleram scaffolding, mas não implementam regras de negócio, segurança ou observabilidade. Código gerado deve ser isolado de extensões manuais para permitir regeneração. Alterar diretamente arquivos gerados cria conflitos e torna futuras atualizações imprevisíveis.

Mock não é homologação

Um mock prova que o consumidor entende o contrato simulado. Ele não prova que o real cumpre semântica, autorização, desempenho, consistência ou efeitos colaterais. Use mock para paralelismo e testes rápidos, e complemente com conformidade contra ambientes reais.

12.19 Testes de contrato e conformidade

Testes de contrato verificam se mensagens e comportamentos observáveis correspondem à descrição. No lado do provedor, respostas reais podem ser validadas contra status, media type e . No lado do consumidor, requisições geradas podem ser validadas antes do envio. Testes negativos confirmam rejeição de campos, formatos e estados inválidos.

Validação em runtime precisa equilibrar segurança e custo. Validar todos os grandes pode aumentar latência e consumo de CPU; validar apenas amostras pode não bloquear violações. Uma estratégia comum combina validação completa em testes e homologação, proteção seletiva no e observabilidade em produção. Dados sensíveis devem ser mascarados em de erro.

Conformidade não é apenas . Uma resposta pode ter estrutura válida e status incorreto; um pode retornar 200 em vez de 201; um pode modificar estado; um obrigatório pode faltar; uma operação pode aceitar media type não declarado. Testes precisam cobrir semântica , segurança e regras de compatibilidade.

Consumer-driven contracts capturam expectativas específicas de consumidores, enquanto descreve a interface geral. As abordagens podem se complementar: é a fonte ampla e contratos de consumidores validam interações críticas. É necessário evitar que expectativas particulares impeçam evolução legítima para todos.

12.20 Compatibilidade e mudanças quebradoras

Uma mudança quebradora é aquela que pode fazer um consumidor compatível com a versão anterior deixar de funcionar. Remover path, operação, parâmetro, propriedade ou resposta é um caso evidente. Tornar campo opcional obrigatório, restringir enum, reduzir limite, mudar tipo ou alterar segurança também pode quebrar. Mudanças aditivas são frequentemente compatíveis, mas dependem do comportamento dos consumidores.

Adicionar propriedade de resposta pode quebrar clientes que rejeitam campos desconhecidos. Adicionar novo valor de enum pode quebrar switches exaustivos. Adicionar resposta 429 pode revelar uma condição operacional nova. Tornar validação mais estrita pode rejeitar dados antes aceitos. Por isso, diff semântico precisa ser combinado com políticas de robustez e conhecimento do ecossistema.

Versionamento de contrato deve distinguir versão da , versão do documento em info.version e versão da interface exposta em ou . Sem essa distinção, equipes atualizam : 3.1.1 e acreditam ter criado uma nova versão de negócio. A convenção precisa definir quando major, minor e são alterados e como depreciação é comunicada.

Deprecar envolve marcar deprecated, publicar substituição, medir uso, notificar consumidores, oferecer prazo e remover apenas após critérios. Um portal pode exibir aviso, mas o e a observabilidade precisam identificar quem ainda chama a operação. Contrato sem telemetria não informa o impacto real da remoção.

Tabela 6 - Compatibilidade depende da direção dos dados e do comportamento dos consumidores.
AlteraçãoClassificação provávelPor que
Remover operaçãoQuebradoraClientes deixam de encontrar o endpoint.
Adicionar propriedade opcional na respostaPotencialmente compatívelClientes estritos podem rejeitar campos desconhecidos.
Adicionar valor a enum de respostaPotencialmente quebradoraConsumidor pode não tratar o novo caso.
Relaxar minLength de entradaCompatível para clientesServidor passa a aceitar conjunto maior.
Tornar parâmetro opcional obrigatórioQuebradoraRequisições existentes ficam inválidas.
Adicionar exemploNão quebradoraNão altera validação, se o exemplo já for válido.

12.21 3.0, 3.1 e 3.2

A linha 3.0 reorganizou profundamente o modelo em relação à versão 2.0, introduzindo servers, components, requestBody e content por media type. A linha 3.1 aproximou o do Draft 2020-12, permitiu expressar null como tipo, adicionou jsonSchemaDialect e refinou vários pontos de interoperabilidade.

A 3.2.0 foi publicada como evolução posterior da especificação. A adoção em ambientes corporativos deve considerar suporte real de editores, geradores, validadores, portais e . O fato de uma versão estar publicada não significa que toda cadeia de ferramentas a implemente imediatamente.

Migração não deve ser feita apenas alterando o valor do campo . Palavras-chave, nulabilidade, exemplos, referências e comportamento de ferramentas podem mudar. Execute conversão controlada, valide a descrição resultante, compare artefatos gerados e teste importação em todos os componentes críticos.

Quando um suporta apenas uma versão anterior, mantenha uma fonte canônica e uma transformação comprovada, em vez de editar duas descrições manualmente. Documente perdas de expressividade. Uma conversão que descarta , , tipos ou restrições pode produzir documentação aparentemente correta, mas semanticamente incompleta.

Tabela 7 - A versão do contrato deve ser escolhida pela capacidade da cadeia completa.
LinhaCaracterísticas relevantesAtenção operacional
3.0.xModelo OAS 3 com components, requestBody e content.Schema Object possui diferenças em relação a JSON Schema completo.
3.1.xMaior alinhamento ao JSON Schema 2020-12 e dialeto explícito.Ferramentas antigas podem interpretar nulabilidade e palavras-chave de forma diferente.
3.2.xEvolução publicada da OAS.Confirmar suporte ponta a ponta antes de adotar como formato canônico.

12.22 Portais, catálogos e

Portais para desenvolvedores renderizam operações, e exemplos a partir do contrato. Uma descrição bem organizada reduz documentação duplicada e permite exploração interativa. Entretanto, a interface de teste deve tratar autenticação, , ambientes e dados com segurança. Habilitar chamadas de produção diretamente no navegador pode ser inadequado para operações sensíveis.

Catálogos utilizam metadados para descoberta, ownership, classificação de dados, domínio, ciclo de vida e dependências. Parte desses dados pode ficar em extensões x-, mas a organização deve evitar acoplar o contrato a um catálogo específico sem necessidade. Uma camada de metadados externa pode complementar a e preservar portabilidade.

frequentemente importam para criar rotas, métodos, políticas ou produtos. A importação não substitui configuração de , , autenticação, transformações e observabilidade. Também pode haver diferenças entre o que o aceita e a versão canônica. O deve validar a transformação antes de aplicar mudanças em produção.

A publicação precisa ser idempotente e rastreável. O mesmo commit deve gerar o artefato do portal, a configuração do e evidências de teste. Alterações manuais na console causam : o contrato diz uma coisa, o executa outra. Exportar configuração e comparar estado ajuda a detectar divergências.

Contrato não é política de completa

pode declarar interface e segurança esperada, mas , quotas, circuit breakers, transformações, roteamento, e proteção de ameaças normalmente exigem configuração adicional. Extensões podem ajudar, desde que sejam padronizadas e portáveis quando possível.

12.23 Governança e CI/CD

Governança eficaz transforma padrões em feedback automatizado. O repositório deve conter a fonte canônica, regras de lint, exemplos, changelog e ownership. Pull executam parser, resolução, linter, validação de exemplos, diff de compatibilidade, testes e geração de preview. Aprovações podem variar conforme risco: uma correção textual não exige o mesmo fluxo de uma remoção de operação.

Políticas precisam distinguir requisitos universais de convenções por domínio. Toda pode exigir operationId único, segurança explícita e modelo de erro; paginação ou idempotency key dependem da operação. Regras excessivamente genéricas produzem contratos artificiais e extensões para contornar o padrão.

Artefatos devem ser imutáveis e promovidos entre ambientes. Gerar novamente o contrato em cada estágio pode introduzir diferenças. Assine ou registre checksum, associe versão ao commit e preserve relatório de validação. Quando o transforma a descrição, armazene também o artefato efetivamente importado.

Métricas de governança podem incluir cobertura de respostas, porcentagem de operações com exemplos, violações por regra, tempo de revisão, mudanças quebradoras bloqueadas, contratos divergentes do runtime e uso de operações deprecadas. Métricas devem orientar melhoria, não incentivar preenchimento superficial.

Pipeline de governança reduzindo divergência entre contrato, portal, gateway e runtime
Figura 4 - A automação reduz divergência e mantém evidências do contrato promovido.

12.24

Quando uma ferramenta rejeita o contrato, identifique primeiro a camada da falha: / inválido, regra da , referência não resolvida, palavra-chave de , extensão desconhecida ou limitação específica do produto. Testar o mesmo arquivo em vários editores sem registrar versões pode confundir, pois cada implementação possui cobertura diferente.

Erros de referência exigem verificar base , caminho relativo, Pointer, codificação de caracteres e disponibilidade do recurso. Em ambientes isolados, referências externas podem falhar. Empacotar dependências ou usar um registry interno torna builds reproduzíveis. Ciclos podem ser válidos para modelos recursivos, mas alguns geradores não os suportam.

Quando documentação e runtime divergem, capture a requisição e resposta reais, identifique a operação por method e path, valide media type e , confira versão implantada e compare commit do contrato. O problema pode estar no , , transformação, do portal ou artefato antigo. e identificador de build expostos em metadados ajudam a correlacionar.

Falhas de importação em precisam ser reproduzidas com o artefato exato. Verifique versão aceita, tamanho, extensões, complexos, operationIds duplicados, paths incompatíveis e security schemes. Não simplifique o contrato manualmente sem registrar o que foi perdido; crie transformação automatizada e teste regressão.

Tabela 8 - Diagnóstico deve separar validade da especificação, suporte da ferramenta e conformidade do runtime.
SintomaHipótese inicialEvidência
Editor não abre o arquivoSintaxe YAML/JSON ou tamanho excessivo.Parser local, linha/coluna e encoding.
$ref não encontradoBase relativa, pointer ou arquivo ausente.URI resolvida e bundle gerado.
SDK muda nomes inesperadamenteoperationId ou nome de schema instável.Diff do contrato e configuração do gerador.
Portal mostra versão antigaCache ou artefato não promovido.Checksum, commit e timestamp da publicação.
Gateway ignora restriçãoImportador não suporta palavra-chave.Matriz de suporte e configuração efetiva.
Resposta real falha no schemaDrift de runtime ou schema incorreto.Payload mascarado e relatório de validação.

12.25 Estudos de caso e laboratórios

Estudo de caso 1 - contrato gerado depois do

Uma equipe implementou e gerou por anotações. O contrato publicado continha apenas respostas 200, sem required e operationIds derivados dos nomes dos métodos Java. Após uma refatoração interna, SDKs foram regenerados com nomes diferentes e consumidores precisaram alterar código apesar de e permanecerem iguais.

A correção foi estabilizar operationIds, modelar respostas de erro, declarar obrigatoriedade e submeter o artefato gerado a diff e revisão. O caso mostra que não elimina design de contrato; apenas desloca o ponto em que ele precisa ser controlado.

Estudo de caso 2 - importação parcial no

Um contrato 3.1 utilizava palavras-chave de não reconhecidas pelo importador do . A importação terminava sem erro grave, mas algumas restrições eram descartadas. O portal mostrava o completo enquanto o runtime aceitava mensagens mais amplas.

A equipe criou uma etapa de transformação para a versão suportada, publicou um relatório de perdas e manteve validação de mensagens críticas em componente compatível. Testes de regressão passaram a comparar o contrato canônico, o artefato transformado e o comportamento efetivo.

Laboratório 1 - construir e validar uma de clientes

  • Crie info, servers e tags para uma fictícia de clientes.
  • Descreva /clientes/{clienteId} e /clientes com operationIds estáveis.
  • Modele Cliente, NovoCliente e Problem Details em components/ .
  • Inclua parâmetros, exemplos, respostas 201, 400, 401, 404, 409 e 500 conforme o comportamento definido.
  • Execute parser, validação estrutural e linter; corrija cada diagnóstico registrando a causa.

Laboratório 2 - detectar mudanças quebradoras

  • Crie uma versão inicial do contrato e gere um cliente.
  • Remova uma propriedade, torne outra obrigatória e adicione um valor de enum de resposta.
  • Execute um diff semântico e classifique cada mudança pela direção dos dados.
  • Restaure compatibilidade ou proponha uma nova versão major com plano de depreciação.

Laboratório 3 - publicar com mock e

  • Inicie um a partir dos exemplos e valide um consumidor simples.
  • Gere um bundle para importação e compare-o com a fonte modular.
  • Importe em um ambiente autorizado de ou simulador e registre campos ignorados.
  • Compare uma resposta real com o e produza relatório de conformidade.

Resumo do capítulo

fornece uma linguagem padronizada para descrever interfaces de forma legível e processável. O contrato conecta consumidores, , testes, documentação, portal, e governança. Seu valor depende da precisão de paths, operações, parâmetros, corpos, respostas, e segurança.

A descrição não substitui implementação nem garante conformidade. Parsing, validação, , exemplos, testes e observabilidade são necessários para manter contrato e runtime alinhados. Reuso com components e reduz duplicação, mas exige controle de identidade, modularização e compatibilidade.

, e abordagens híbridas podem funcionar quando existe uma fonte de verdade e um que bloqueia divergências. Mudanças quebradoras precisam ser detectadas semanticamente e avaliadas pelo comportamento real dos consumidores. A versão da , a versão do contrato e a versão pública da são conceitos distintos.

Em plataformas corporativas, deve ser tratado como artefato governado: versionado, revisado, validado, promovido e correlacionado com o estado do e do portal. Um arquivo que apenas renderiza em uma UI não é suficiente; o objetivo é um contrato confiável que reduza ambiguidade e permita automação segura.

Próximo passo do curso

Depois de formalizar o contrato com , o curso pode aprofundar versionamento, compatibilidade, governança e ciclo de vida de , conectando decisões de design a publicação, depreciação e operação em escala.

Checklist de revisão de uma Description

  • A versão é suportada por parser, portal, gerador e usados no .
  • info identifica , versão, responsável e escopo sem confundir versão da .
  • Cada operação possui summary, operationId único, tags, entradas e respostas relevantes.
  • Parâmetros possuem localização, obrigatoriedade, e serialização coerentes.
  • bodies e declaram media types realmente suportados.
  • possuem tipos, required, limites e estratégia para campos desconhecidos.
  • Erros seguem modelo comum e preservam status, correlação e detalhes seguros.
  • Security schemes e requisitos representam corretamente alternativas e combinações.
  • Examples são sintéticos, válidos e testados automaticamente.
  • Referências são resolvíveis e o bundle publicado é reproduzível.
  • O diff de compatibilidade é executado contra a versão atualmente suportada.
  • Portal, e runtime podem ser correlacionados ao mesmo commit e checksum.

Exercícios

  • Explique por que uma Description válida pode ainda ser um contrato fraco.
  • Diferencie Specification, Description, 2.0 e UI.
  • Modele a operação /clientes/{id} e descreva a diferença entre campo ausente e null.
  • Crie um Parameter Object para uma lista de status e escolha style/explode, justificando a serialização.
  • Modele respostas 200, 304, 404 e 412 para um condicional com .
  • Compare allOf e oneOf e apresente um caso em que alternativas sobrepostas tornam oneOf inválido.
  • Descreva como exigir simultaneamente 2.0 e e como declarar alternativas.
  • Classifique como compatível ou quebradora a adição de uma propriedade opcional em resposta.
  • Proponha de governança para contrato publicado em um .
  • Explique como investigar uma divergência entre documentação do portal e resposta real.

Glossário

Tabela 9 - Vocabulário essencial do capítulo.
TermoDefinição
OASOpenAPI Specification, padrão para descrição de APIs HTTP.
OADOpenAPI Description, documento concreto que descreve uma API.
OpenAPI ObjectObjeto raiz da descrição.
Path ItemObjeto associado a um template de caminho e suas operações.
Operation ObjectDescrição de uma operação HTTP específica.
Schema ObjectEstrutura e restrições de dados em parâmetros e mensagens.
JSON SchemaVocabulário para descrever e validar documentos JSON.
$refReferência a outro objeto ou documento.
BundlingEmpacotamento de documentos mantendo referências.
DereferencingSubstituição de referências pelo conteúdo referenciado.
LintingAplicação de regras de qualidade e governança.
Semantic diffComparação que considera impacto do contrato, não apenas texto.
Mock serverServidor simulado baseado no contrato e exemplos.
Design-firstProcesso em que o contrato antecede a implementação.
Code-firstProcesso em que o contrato é derivado do código.
DriftDivergência entre contrato, configuração publicada e runtime.

Anexo A - Exemplo integrado de contrato

O trecho a seguir reúne os elementos centrais estudados: metadados, servidor, path, operação, parâmetro, segurança, resposta e reutilizável. Ele é propositalmente compacto e deve ser expandido com erros, exemplos e regras específicas antes de uso real.

Exemplo consolidado em YAML
openapi: 3.1.1
info:
  title: API de Clientes
  version: 1.0.0
servers:
  - url: https://api.empresa.example/clientes/v1
paths:
  /clientes/{clienteId}:
    get:
      operationId: obterCliente
      security:
        - OAuthCorporativo: [clientes.leitura]
      parameters:
        - name: clienteId
          in: path
          required: true
          schema: { type: string, pattern: '^[0-9]{10}$' }
      responses:
        '200':
          description: Cliente localizado
          content:
            application/json:
              schema: { $ref: '#/components/schemas/Cliente' }
        '404': { $ref: '#/components/responses/NaoEncontrado' }
components:
  securitySchemes:
    OAuthCorporativo:
      type: oauth2
      flows:
        clientCredentials:
          tokenUrl: https://id.example/oauth2/token
          scopes: { clientes.leitura: Consulta clientes }
  schemas:
    Cliente:
      type: object
      required: [id, nome, status]
      properties:
        id: { type: string }
        nome: { type: string, maxLength: 120 }
        status: { type: string, enum: [ATIVO, BLOQUEADO] }

Como usar o anexo

Valide o trecho, gere documentação, inicie um mock e depois acrescente respostas de autenticação, autorização, validação, conflito e indisponibilidade. Em seguida, execute um diff após alterar enum, required e para observar o impacto.

Referências técnicas

  • Initiative. Specification 3.2.0. Documento normativo publicado em 19 set. 2025.
  • Initiative. Specification 3.1.1. Documento normativo publicado em 24 out. 2024.
  • Initiative. Learn - Introduction, Structure, Paths, Components, Security, Referencing e Best Practices.
  • . Draft 2020-12 - Core e Validation specifications.
  • . 9110 - Semantics.
  • . 9111 - .
  • . 9457 - Problem Details for .
  • Fielding, Roy T. Architectural Styles and the Design of Network-based Software Architectures. 2000.
  • Initiative. Arazzo Specification 1.1.0, para descrição de sequências de chamadas e dependências.

Nota sobre versões

A especificação e o suporte das ferramentas evoluem. Antes de adotar recursos de uma versão, consulte a documentação oficial e teste toda a cadeia: editor, parser, linter, gerador, portal, e runtime. Este material prioriza princípios duráveis e usa a família 3 como base.