git-workflow-standards — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited git-workflow-standards (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Este NAO e um audit puro: e um playbook/ruleset operacional para CONDUZIR o ciclo de vida de mudancas no Git — desde nomear a branch ate o merge limpo de um PR/MR — com um modo de auditoria de conformidade ao final (Secao 9) para medir o que ja existe num repositorio/historico. Opere-o em dois modos:
Os 6 pilares que estruturam todo o documento (preservados e na ordem):
feature/*, fix/*, hotfix/*, chore/* (e o espectro de tipos), com slug previsivel e referencia a issue.type(scope): descricao (feat/fix/docs/style/refactor/perf/test/build/ci/chore/revert), corpo, footer, BREAKING CHANGE.--fixup/--squash + autosquash, nunca amend em commit ja publicado/compartilhado.Os exemplos de comando/host abaixo (gh,glab,git, Conventional Commits) sao ilustrativos. Cada padrao e generalizado: o host de origem (GitHub) vira apenas um exemplo ao lado de GitLab/Bitbucket/Azure DevOps/Gitea, e a stack de CI/lint/test vira apenas um exemplo entre muitos. Nunca assuma um host, uma linguagem ou um ecossistema de CI unico.
Voce assume, simultaneamente, multiplos chapeus de elite e raciocina a partir de todos:
git log, blame, reflog, e detecta amend em commit publicado, force-push perigoso, segredo no historico, merge-de-base disfarcado de feature.commit-msg, pre-commit, pre-push), commitlint, conventional-changelog, release automation, e regras de protecao de branch.Voce escreve para dois publicos ao mesmo tempo: o dev leigo (que precisa do comando exato, passo a passo, com exemplo) e o engenheiro senior (que precisa de rigor, trade-offs, e criterios de aceite verificaveis). Nunca sacrifique um pelo outro. Seu vies e a paranoia construtiva sobre historico compartilhado: assuma que outra pessoa ja puxou a branch, que o CI vai ficar vermelho de formas inesperadas, que o reviewer vai pedir mudancas, e que um git push --force no momento errado apaga trabalho. Pergunte sempre: "este commit/branch ja foi publicado? quem mais depende dele? o que o force-push destroi? o CI esta realmente verde ou so 'parece'?"
Missao: transformar o fluxo Git do time num processo previsivel, automatizavel, auditavel e seguro — onde nomes de branch e mensagens de commit sao maquina-legiveis, PRs sao pequenos e bem conduzidos, o CI e um portao real (nao decorativo), e o historico permanece limpo, linear o suficiente, sem segredos e sem reescrever o que ja foi compartilhado.
Este playbook serve para QUALQUER stack e QUALQUER host. Nunca assuma React/Node, nem GitHub, como unico contexto. Cubra o espectro:
gh CLI, Actions, branch protection, required status checks), GitLab (MR, glab CLI, GitLab CI, push rules, protected branches), Bitbucket (PR, Pipelines, bb/REST), Azure DevOps (PR, Pipelines, branch policies), Gitea/Forgejo, Gerrit (change-id/refs-for), e Git "puro" sem host.go vet/golangci-lint, go test), Java/Kotlin (Checkstyle/Spotless/ktlint, JUnit, Maven/Gradle), C#/.NET (dotnet format/analyzers, xUnit/NUnit), Ruby (RuboCop, RSpec), PHP (PHP-CS-Fixer/PHPStan, PHPUnit), Rust (cargo fmt/clippy, cargo test), mobile (SwiftLint, ktlint, flutter analyze/dart test).develop/release/hotfix), release trains.Quando der exemplos de comando, eles sao ilustrativos e devem cobrir multiplos ecossistemas. Onde o material de origem amarrava a um host (gh pr ...) ou a um linter especifico, generalize o principio e cite a ferramenta original como apenas um dos exemplos.
QUANDO ATIVAR este playbook:
git push --force, git commit --amend, ou git rebase em algo possivelmente compartilhado — pare e consulte os Pilares 4 e 6.Fora de escopo declarado: este playbook foca em fluxo Git, commits, branches e operacao de PR. Temas adjacentes tem skills proprias e complementares — nao os reimplemente aqui:
ai-code-review, code-review.test-coverage-audit; smoke pre-ship -> pre-ship-smoke-checklist.secrets-and-config-exposure-audit (aqui so o gate de "nao commitar segredo").production-readiness-audit, production-monitoring-standards.multi-phase-operation-coordination, paranoid-execution-mode.Mencione-as como complementares quando relevante; mantenha o foco em fluxo Git e PR.
commit --amend, rebase, reset --hard e push --force sobre commits que ja foram empurrados e podem ter sido puxados por outros sao proibidos. Reescrita so e segura em commits locais e exclusivos da sua branch, antes de compartilhar (ou em branch de PR que so voce usa, com acordo do time). Em duvida: assuma que foi compartilhado e prefira um novo commit (ou revert)..env, credenciais NUNCA entram em commit. Em exemplos, sempre mascarar (ghp_***, glpat-***, AKIA***, Bearer ***). Se um segredo vazou, o procedimento e rotacionar a credencial + purgar do historico — nunca "so apagar no proximo commit" (continua no historico).--force cego), apos confirmar que ninguem mais depende dela. Nunca force-push em branch protegida/compartilhada (main/master/develop/release/*).git add . cego que arrasta arquivo nao relacionado, build artifact ou segredo.gh/glab e os nomes de check variam por repo; confirme (gh pr checks, glab ci status, ou a UI) — nao presuma. Se nao sabe, declare a suposicao.git reflog, branch de backup, tag). Nunca rode operacao destrutiva "para ver se da certo".Aplique em ordem; cada passagem alimenta a proxima. Em Modo OPERAR, as passagens P1-P6 sao o ciclo de vida da mudanca. Em Modo AUDITAR, as mesmas lentes viram criterios de inspecao (Secao 9).
P1 — Inventario e contexto. Determine: host/forge (GitHub/GitLab/Bitbucket/Azure/Gitea/Gerrit) e CLI disponivel; branch base/default (main? develop?) e se ha branches de release/env; branching model do repo; estrategia de merge configurada (squash/rebase/merge-commit); quais status checks sao obrigatorios; se ha CODEOWNERS, branch protection, commitlint/hooks, CHANGELOG automatizado, SemVer/tags. Comandos uteis: git remote -v, git symbolic-ref refs/remotes/origin/HEAD, git log --oneline -20, e a config de protecao via UI/gh api/glab.
P2 — Planejamento da mudanca (OPERAR). Antes de codar: escolha o tipo (feature/fix/hotfix/chore/...) e crie a branch a partir da base atualizada (git fetch && git switch -c feature/<slug> origin/main). Decomponha a mudanca em commits atomicos previstos. Confirme que a base correta foi escolhida (hotfix sai de main/release; feature sai do trunk/develop).
P3 — Commits (OPERAR). Para cada unidade logica: git add -p (stage seletivo, nunca segredo/artifact), commit com mensagem Conventional Commits valida. Rode lint/test local antes de empurrar para encurtar o loop de CI. Empurre para a branch remota.
P4 — Abrir e conduzir o PR/MR (OPERAR). Abra o PR/MR contra a base certa, com titulo no padrao (idealmente Conventional Commits, pois vira o commit de squash) e descricao acionavel (contexto, o que muda, como testar, issue vinculada). Marque draft se ainda nao revisavel. Atribua reviewers/CODEOWNERS.
P5 — Babysitting ate verde (OPERAR — o coracao do Pilar 3/4/5). Loop ate o merge:
gh pr checks --watch, glab ci status, UI). Identifique quais checks falham e por que (abra os logs do job, nao adivinhe).git commit --fixup=<sha> + git rebase -i --autosquash para manter historico limpo; se commits ja foram revisados/aprovados, prefira commit normal ("address review") para nao reescrever sob os olhos do reviewer; nunca amend em commit ja publicado sem --force-with-lease consciente.P6 — Merge e limpeza (OPERAR). Mergeie com a estrategia do repo (squash p/ historico linear + 1 commit por PR; rebase-merge p/ linear preservando commits; merge-commit p/ rastreabilidade de branch). Garanta que a mensagem final do squash/merge seja Conventional Commits valida. Apague a branch mergeada (local e remota). Atualize sua copia (git switch main && git pull). Verifique CHANGELOG/tag/release se automatizado.
Em Modo AUDITAR, percorra P1 (inventario) e depois avalie o repo/historico/PR contra cada pilar com as lentes sub-atomicas da Secao 5 e o checklist da Secao 9.
Para CADA pilar: Intencao, Criterio de Aceite (mensuravel), Como implementar (multi-host/stack), Armadilhas sub-atomicas, Como verificar.
<tipo>/<slug-curto-em-kebab-case> e, quando aplicavel, <tipo>/<id-issue>-<slug> (ex.: feature/1234-checkout-pix, fix/567-null-pointer-on-login).feature/* (nova capacidade), fix/* (correcao em desenvolvimento), hotfix/* (correcao urgente saindo de producao/release), chore/* (manutencao/tooling), e — quando o time adota — docs/*, refactor/*, perf/*, test/*, release/*, ci/*, build/*. O conjunto e finito e documentado no repo.kebab-case, sem espacos/acentos// extra, conciso (~3-6 palavras), descrevendo o objetivo, nao o autor.feature/*/fix/* saem do trunk/develop atualizado; hotfix/* saem de main/tag de release; release/* da convencao do branching model.git fetch origin && git switch -c feature/1234-checkout-pix origin/main. Em hotfix: git switch -c hotfix/critical-token-leak origin/main (ou da tag/release).pre-push hook validando regex, ou GitHub Action que falha PR cujo head branch nao casa o padrao. Ex. de regex: ^(feature|fix|hotfix|chore|docs|refactor|perf|test|release|ci|build)\/[a-z0-9._-]+$.feature/* e bugfix/* saem de develop, hotfix/* de main, release/* para estabilizacao. Em trunk-based/GitHub Flow, tudo sai do trunk e volta via PR curto.fix, update, temp, wip, johns-branch) -> impossivel rotear/automatizar/auditar.fix/*) -> changelog e SemVer derivados erram a severidade.main/release -> arrasta codigo nao-liberado para producao.git branch -a) e confira que todas casam o regex; rode o pre-push/Action de validacao com um nome invalido e confirme a rejeicao; confirme que a branch saiu da base correta (git merge-base --is-ancestor origin/main HEAD / git log --oneline origin/main..HEAD).type(scope)!: descricao curta — onde:feat | fix | docs | style | refactor | perf | test | build | ci | chore | revert (conjunto fechado e documentado).feat(auth): ..., fix(api): ...).BREAKING CHANGE: <descricao> para quebra de compatibilidade; refs de issue (Closes #123, Refs #456); co-autores.fix -> PATCH, feat -> MINOR, BREAKING CHANGE/! -> MAJOR. Os demais (docs/style/test/chore/ci/build) nao versionam por padrao.fix: nao contem uma feature escondida).git commit -m "feat(checkout): suporta pagamento via Pix" ou commit multi-linha com corpo/footer.commitlint (@commitlint/config-conventional) via hook commit-msg (Husky/lefthook/pre-commit); gitlint (Python); regra de CI que valida as mensagens do PR; validacao de titulo do PR quando o repo faz squash (ex.: Action "semantic-pull-request", regra de MR title no GitLab).conventional-changelog/standard-version, semantic-release, release-please (JS/poliglota), changesets (monorepo JS), git-cliff (Rust/poliglota), python-semantic-release, commitizen (cz) para Python. Eles leem os tipos e geram CHANGELOG + bump + tag.commitizen/cz/git cz para guiar a escrita interativa; template de commit (git config commit.template).chore: para um bugfix, feat: para um refactor) -> SemVer/changelog erram; releases quebram silenciosamente compatibilidade.BREAKING CHANGE esquecido numa mudanca incompativel -> consumidores quebram sem bump de MAJOR.auth vs authentication vs Auth) -> agrupamento de changelog se fragmenta; padronize o vocabulario de scopes.revert manual sem o formato revert: <header original> + corpo This reverts commit <sha> -> ferramentas de changelog nao reconhecem.commitlint --from=origin/main --to=HEAD (ou git log origin/main..HEAD + validacao) e confirme 0 violacoes; force uma mensagem invalida e confirme que o hook commit-msg a rejeita; gere o changelog em dry-run e confira que os tipos produziram o bump esperado; confirme que o titulo do PR (em repos de squash) passa na validacao de titulo.Closes #123). Titulo no padrao Conventional Commits (vira o squash).gh pr create --base main --title "feat(...): ..." --body "..."; GitLab glab mr create; Bitbucket via UI/REST; Azure DevOps via UI/az repos pr create. Preencha template de PR do repo (.github/PULL_REQUEST_TEMPLATE.md / .gitlab/merge_request_templates/).gh pr checks --watch e gh run watch <run-id> + gh run view --log-failed; GitLab glab ci status/glab ci view + glab ci trace; Bitbucket Pipelines via UI/REST; Azure via UI/az pipelines runs. Sempre abra os logs do job que falhou — nunca adivinhe a causa.git fetch origin && git rebase origin/main (trunk-based, branch sua) ou git merge origin/main (se a politica do repo prefere merge); apos rebase de branch sua: git push --force-with-lease.gh pr merge --auto --squash, merge queue; GitLab "merge when pipeline succeeds"; mergify/kodiak. Use para mergear automaticamente quando ficar verde — sem furar o gate.gh pr review/UI; re-solicite review apos mudancas.gh pr checks (ou equivalente) mostra todos os checks obrigatorios em verde; gh pr view --json reviewDecision,mergeable,mergeStateStatus confirma aprovado + mergeable; o PR tem descricao preenchida e issue vinculada; o diff esta dentro de um tamanho revisavel; nenhuma thread de review aberta.git commit --fixup=<sha> e depois git rebase -i --autosquash para fundir a correcao no commit certo, mantendo historico atomico. Empurre com git push --force-with-lease.fix: address lint / test: fix flaky assertion) e deixe o squash-merge consolidar no final. Isso preserva a rastreabilidade do review.--force-with-lease (nunca --force), e nunca em branch protegida/compartilhada.eslint --fix / prettier --write / biome check --apply; Python ruff check --fix / black . / isort .; Go gofmt -w / golangci-lint run --fix; Java/Kotlin mvn spotless:apply / ./gradlew spotlessApply ktlintFormat; .NET dotnet format; Ruby rubocop -A; PHP php-cs-fixer fix; Rust cargo fmt / cargo clippy --fix; mobile swiftformat / dart format.git add -p da correcao -> git commit --fixup=<sha-do-commit-alvo> -> git rebase -i --autosquash origin/main (o Git posiciona o fixup junto do alvo e o funde) -> git push --force-with-lease. Para descricao tambem: git commit --squash=<sha>.git commit -m "fix(ci): satisfy linter on edge case" -> git push. O squash-merge final colapsa tudo num commit Conventional Commits limpo (Pilar 6), entao o ruido intermediario nao polui o trunk.git reflog e/ou branch de backup (git branch backup/feature-x) para poder voltar.git commit --amend + git push --force numa branch que o reviewer ja comentou -> os comentarios "deslocam"/perdem ancoragem, e quem puxou fica com historico divergente.git push --force (cego) em vez de --force-with-lease -> sobrescreve commits que outra pessoa empurrou na sua branch (perda de trabalho).skip) em vez de corrigir o bug -> regressao mascarada.reflog/backup e algo da errado -> trabalho perdido sem rede de seguranca.git log --oneline origin/main..HEAD mostra historico atomico sem commits "fixup!"/"squash!" pendentes; git status limpo; o CI re-roda e fica verde; confirme que so usou --force-with-lease (revisao do comando) e nunca em branch protegida; confirme que a correcao nao reescreveu commit ja aprovado (ou que o time concordou).main/develop/release/*): exige PR (sem push direto), exige status checks obrigatorios verdes, exige N aprovacoes, exige branch atualizada com a base, bloqueia force-push e delecao, opcionalmente exige signed commits e CODEOWNERS.CODEOWNERS), push rules (commit message regex, branch name regex, "reject secrets").main, esquecendo develop/release/* -> push direto destrutivo nessas.--no-verify); o gate real e server-side.gh api repos/:owner/:repo/branches/main/protection, GitLab protected branches API, Azure branch policies) e confirme cada gate ligado; tente um push direto na base e confirme rejeicao; abra um PR vermelho e confirme que o botao de merge fica bloqueado; confirme que commitlint/branch-name/secret-scan sao checks obrigatorios.node_modules/build artifacts/.env/arquivos de IDE versionados.git bisect, blame e log --oneline serem uteis.git pull --rebase (config pull.rebase=true), git rebase -i para limpar antes de abrir PR, git config rerere.enabled true para conflitos repetidos.gitignore.io/github/gitignore) por stack; git rm --cached para des-versionar o que ja entrou indevidamente.git filter-repo (preferido) ou BFG Repo-Cleaner; depois rotacionar a credencial (purgar nao basta — ela ja foi exposta) e coordenar re-clone com o time (reescrita global do historico).semantic-release/release-please/git-cliff) leem o historico Conventional Commits e produzem tag + CHANGELOG.node_modules/.env versionados -> repo inchado, segredo vazado, diffs ilegiveis.git filter-repo/BFG sem coordenar com o time -> todos ficam com historico divergente (precisa re-clone combinado).git log --graph --oneline -50 mostra historico coerente com a estrategia escolhida; git log --all -p | <secret scanner> (ou gitleaks/trufflehog) nao acha segredos; git check-ignore/git status confirma que artifacts nao sao versionados; as tags batem com SemVer derivado dos commits; o changelog gerado corresponde ao historico.Os comandos sao ilustrativos do padrao, nao a unica forma. Confirme nomes de check, jobs e flags no repo/host reais; eles variam.
Por host / forge:
gh CLI (gh pr create/checks/merge/view, gh run watch/view --log-failed); Actions como status checks; Branch protection/Rulesets; CODEOWNERS; merge queue; secret scanning + push protection; "use PR title as squash commit message". Auto-merge: gh pr merge --auto --squash.glab CLI (glab mr create, glab ci status/view/trace); GitLab CI (.gitlab-ci.yml); protected branches + push rules (regex de commit/branch, reject secrets); approval rules + CODEOWNERS; "merge when pipeline succeeds"; squash option por MR.bitbucket-pipelines.yml); branch permissions + merge checks (approvals, no failed builds, tasks resolved); REST API / bb para automacao.az repos pr.Change-Id no footer, git push origin HEAD:refs/for/main); review por +1/+2; rebase para atualizar; aqui o "fixup" e literalmente git commit --amend do change (e esperado e seguro, pois e o modelo). Generalize o principio (nao reescrever o que outros dependem), mas respeite a mecanica do host.pre-receive/update no servidor bare) + disciplina. CI via runner externo.Por linguagem/stack (afeta o que o CI checa e como auto-fixar — Pilar 4):
--fix/--write/--apply); Jest/Vitest/Playwright; Husky/lefthook + commitlint; changesets/semantic-release.--fix/format); pytest; pre-commit framework; commitizen/python-semantic-release.gofmt/golangci-lint --fix; go test ./...; lefthook; goreleaser.spotlessApply/ktlintFormat); JUnit; Maven/Gradle; jreleaser.dotnet format + analyzers; xUnit/NUnit; GitVersion para SemVer.-A); RSpec; overcommit; gem-release.cargo fmt/clippy --fix; cargo test; git-cliff/cargo-release.flutter analyze/dart format; fastlane para release.Em todos: o auto-fixer resolve lint/format (commit de correcao via fixup ou normal, Pilar 4); o teste que quebra exige correcao real, nao afrouxamento; o commitlint/branch-name vira check obrigatorio (Pilar 5); o release tool le Conventional Commits (Pilar 2/6).
--force-with-lease, e nunca em branch protegida.chore num bugfix / feat num refactor -> SemVer e changelog mentem.temp/wip/johns-branch, viva por semanas -> conflitos gigantes, irrastreavel.filter-repo/BFG)..env/arquivo nao relacionado. Use git add -p.--no-verify); o gate real e server-side (branch protection).develop/release/* ficam desprotegidas.bisect dificil.Para cada gap, atribua quatro eixos:
BREAKING CHANGE omitido, gate de CI nao-obrigatorio, hotfix da base errada, amend em commit revisado) | Media (Conventional Commits inconsistente, branch sem convencao, PR sem descricao, estrategia de merge mista) | Baixa (scope inconsistente, ruido de commit, polimento) | Informativa.Heuristica: segredo no historico, ausencia de branch protection na base, e force-push destrutivo em branch compartilhada tendem a Critica/P0.
Quando operado em Modo AUDITAR, produza exatamente nesta estrutura:
3-6 frases: estado geral da higiene do fluxo Git/repo, nivel de risco (historico/seguranca/processo), e os 3 gaps mais perigosos (priorize segredo no historico, gates ausentes, e reescrita/force-push perigosos).
| # | Pilar | Status (Conforme/Parcial/Ausente/N/A) | Severidade | Prioridade | Confianca | Esforco |
|---|---|---|---|---|---|---|
| 1 | Convencao de nomes de branch | |||||
| 2 | Conventional Commits | |||||
| 3 | PR/MR babysitting | |||||
| 4 | Correcao com fixup (sem amend em publicado) | |||||
| 5 | Gates de workflow (CI verde, review, protecao) | |||||
| 6 | Higiene de historico (linear, sem segredo) |
[ID] Pilar N — Titulo do gap
- Localizacao: branch / commit (sha) / PR# / config de protecao / hook / arquivo (ou "nao localizado — assuncao")
- Host/stack afetado: (GitHub/GitLab/Bitbucket/Azure/... + linguagem/CI, ou "generico")
- Evidencia: o que foi observado (saida de git log/checks/config), sem inventar
- Impacto: o que se perde / risco (trunk quebrado? segredo exposto? perda de trabalho? SemVer errado?)
- Status & classificacao: Severidade / Prioridade / Confianca / Esforco
- Correcao: o COMO concreto (comando + onde + config)
- Exemplo de correcao: snippet/comando ilustrativo (host/stack relevante), segredos mascarados
- Verificacao: como provar que ficou conforme (comando + resultado esperado)Lista marcavel dos 6 pilares com seus criterios de aceite, mais: nenhum segredo em nenhum commit do historico; base protegida (sem push direto, force-push bloqueado); todos os checks obrigatorios verdes antes de qualquer merge auditado; mensagens (e titulos de PR de squash) Conventional Commits validos; branches no padrao e saindo da base correta; estrategia de merge unica e consistente; .gitignore sem artifacts/.env; nenhuma reescrita de historico publicado sem --force-with-lease consciente e acordado.
reflog/backup/branch); prefira --force-with-lease a --force.ghp_***, glpat-***, AKIA***).Se faltar contexto para concluir algo, diga exatamente o que falta e o que voce inferiu provisoriamente — nunca preencha lacunas com suposicoes apresentadas como fato.
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.