Política de selos
Especifica as fontes de selos dinâmicos e estáticos do README, cobrindo o status de fluxo de trabalho nativo do GitHub, o JSON de endpoint do shields.io e as formas de selo estático.
Este documento é a referência canônica para a faixa de selos do README e para a infraestrutura que publica suas fontes de dados dinâmicas. Todo selo no README do projeto é resolvido por meio de uma das três formas especificadas aqui; os novos selos adicionados no futuro seguem as mesmas formas ou são rejeitados na revisão.
1. Contexto
URLs estáticas https://img.shields.io/badge/X-Y-Z nunca mudam por conta
própria, então se distanciam do estado real do projeto — um selo
release-vN-blue continua mostrando vN muito depois de vN+1 ser lançado.
Por isso, a política exige formas dinâmicas para todo valor que muda e reserva
os selos estáticos para o pequeno conjunto de valores (licença, versão alvo do
Python) que raramente mudam, nos quais a forma estática é honesta.
2. Arquitetura
Quatro formas cobrem todos os selos do projeto:
- Selos de status de fluxo de trabalho nativos do GitHub. A URL do selo de
um fluxo de trabalho tem a forma
https://github.com/<owner>/<repo>/actions/workflows/<file>/badge.svge reflete a execução mais recente na branch padrão. O GitHub serve o selo a partir dos metadados públicos do repositório. - Selos de endpoint do shields.io. Um selo de endpoint do shields.io
resolve uma URL
https://img.shields.io/endpoint?url=<published-json>na qual o JSON segue o schema de endpoint do shields.io (schemaVersion,label,message,color). O JSON publicado fica emapothem.ahmedgad.com/badges/*.json; seu conteúdo é gerado por um fluxo de trabalho de CI a cada execução bem-sucedida do CI. Os selos de endpoint mantêm as métricas sob publicação controlada pelo projeto, e não em um armazenamento mutável de terceiros. - Selos estáticos do shields.io. Um selo estático tem a forma
https://img.shields.io/badge/<label>-<message>-<color>, sem fonte de dados reativa. Reservados para valores que de fato raramente mudam (identificador de licença, versão alvo do Python). - Selos de registro e de scorecard. Um selo cujo valor um terceiro calcula a partir de dados públicos que ele já detém: o registro do npm (versão e downloads, renderizados pelo shields.io) e a API do OpenSSF Scorecard. O projeto não publica nada para esses selos; o terceiro é a fonte.
A publicação de métricas do projeto em Gists públicos é excluída por design. Os endpoints do shields.io sobre o domínio controlado pelo projeto são o substituto canônico.
3. Especificação por selo
A tabela lista a faixa de selos do README em ordem. A última coluna marca os selos cuja imagem só é renderizada enquanto o repositório é público: o GitHub serve o selo de fluxo de trabalho de um repositório privado apenas a membros autenticados, e o Scorecard analisa somente repositórios públicos.
| Selo | Forma | Fonte | Forma da URL | Exige repositório público |
|---|---|---|---|---|
| Último lançamento | Endpoint do shields.io | badges/release.json | https://img.shields.io/endpoint?url=https%3A%2F%2Fapothem.ahmedgad.com%2Fbadges%2Frelease.json | Não |
| Status do CI | Nativo do GitHub | .github/workflows/ci.yml | https://github.com/ahmed-g-gad/apothem/actions/workflows/ci.yml/badge.svg?branch=main | Sim |
| Licença | Estático do shields.io | LICENSE (MIT) | https://img.shields.io/badge/license-MIT-0F172A | Não |
| Versão no npm | Registro | Registro do npm | https://img.shields.io/npm/v/%40ahmed-g-gad%2Fapothem?color=10B981&label=npm | Não |
| Portão de cobertura | Estático do shields.io | pyproject.toml fail_under = 80 | https://img.shields.io/badge/coverage%20gate-%E2%89%A580%25-2563EB | Não |
| OpenSSF Scorecard | Scorecard | Resultados de .github/workflows/scorecard.yml | https://api.securityscorecards.dev/projects/github.com/ahmed-g-gad/apothem/badge | Sim |
| Feedback | Estático do shields.io | GitHub Issues | https://img.shields.io/badge/feedback-GitHub%20issues-7C3AED | Não |
| Documentação | Estático do shields.io | O site de documentação | https://img.shields.io/badge/docs-Fumadocs-0F172A | Não |
| Downloads no npm | Registro | Registro do npm | https://img.shields.io/npm/dm/%40ahmed-g-gad%2Fapothem?color=10B981&label=downloads | Não |
O destino do link de cada selo em github.com (os lançamentos, o fluxo de
trabalho, o arquivo de licença, as issues) só abre enquanto o repositório é
público.
O fluxo de trabalho de selos também publica os arquivos de endpoint
coverage.json, security.json, supply-chain.json e docs.json para selos
futuros; o README não os exibe hoje.
O CodeQL é executado como um fluxo de trabalho dedicado,
.github/workflows/codeql.yml, que analisa as superfícies de Python e de
Actions; o job security-scan do ci.yml executa apenas o bandit, deixando a
publicação do SARIF do CodeQL para o codeql.yml. O selo de segurança consome o
JSON de endpoint publicado pelo fluxo de trabalho de selos em vez de um selo de
fluxo de trabalho nativo do GitHub, o que mantém o selo estável
independentemente da topologia de scanners subjacente.
4. Mecanismo de publicação dos JSONs
Os JSONs de endpoint são produzidos por .github/workflows/badges.yml. O fluxo
de trabalho:
- É disparado por
workflow_rundepois que o fluxo de trabalhocitermina (e porworkflow_dispatchmanual, para republicar sem uma execução do CI). - Resolve a tag de lançamento mais recente com
git describe --tags --abbrev=0 --match 'v[0-9]*.[0-9]*.[0-9]*'em um checkout com o histórico completo (fetch-depth: 0; em um checkout de profundidade 1, nenhum commit com tag é alcançável e o selo mostraunreleased), e a conclusão do CI pai a partir do eventoworkflow_run. - Gera cada JSON via
jq -n, para que a saída corresponda estritamente ao schema de endpoint do shields.io (schemaVersion: 1, maislabel,message,color). - Valida cada JSON emitido com
jq -eantes do upload. - Faz o upload do diretório como um artefato de fluxo de trabalho chamado
badges.
A implantação dos artefatos em apothem.ahmedgad.com/badges/ fica a cargo de
.github/workflows/publish-static-site.yml. Durante o build do site, esse fluxo
de trabalho baixa o artefato badges bem-sucedido mais recente e o prepara em
site/dist/badges/. Se o artefato estiver ausente ou expirado, o site ainda é
implantado e registra o artefato de selos ausente nos logs do fluxo de trabalho,
em vez de publicar um JSON quebrado.
5. Protocolo de manutenção
Para adicionar um novo selo, decida primeiro a forma:
- Se o selo reflete o estado de execução de um fluxo de trabalho de CI, prefira a forma nativa do GitHub. A URL do selo é fixada pelo arquivo do fluxo de trabalho; nenhuma infraestrutura de publicação é necessária.
- Se o selo reflete uma métrica (uma contagem, uma porcentagem, uma string de
versão, um rótulo graduado) que se atualiza ao longo do tempo, use a forma de
endpoint do shields.io. Adicione uma etapa de geração de JSON a
.github/workflows/badges.ymlao lado das cinco existentes e adicione a URL consumidoraapothem.ahmedgad.com/badges/<name>.jsonà faixa de selos do README. - Se o selo reflete um valor que de fato raramente muda (licença, linguagem alvo, modo de governança), use a forma estática do shields.io. Documente a cadência de mudança na tabela por selo deste arquivo ao adicionar o selo.
Para aposentar um selo, remova-o primeiro do README, depois remova sua etapa de geração de JSON do fluxo de trabalho de selos e, por fim, remova sua linha da tabela por selo acima. Mantenha a exclusão atômica, para que o README nunca faça referência a um artefato JSON que o fluxo de trabalho não produz.
6. Referências cruzadas
- O fluxo de trabalho de CI cujo estado de execução o selo de CI nativo do
GitHub reflete:
.github/workflows/ci.yml. - O fluxo de trabalho de selos que publica os JSONs de endpoint:
.github/workflows/badges.yml. - O domínio do site estático que serve os JSONs:
apothem.ahmedgad.com. - A referência do schema de endpoint do shields.io: https://shields.io/badges/endpoint-badge.
Política de engenharia de lançamento
Cinco políticas canônicas para versionamento, tags de lançamento, ciclos de descontinuação, mudanças incompatíveis e procedimentos de reversão.
Segurança
Postura de segurança do Apothem — meta no OpenSSF Scorecard, reporte de vulnerabilidades, superfícies de endurecimento.