O gatilho
on: push · pull_request · workflow_dispatchTodo push na main, todo pull request e o disparo manual. Os dois jobs começam juntos, cada um no seu próprio ubuntu-latest.
Um projeto clean-architecture-single-module gerado e desenvolvido só com o Nerviz. Cada spec, cada relatório de run e cada commit estão públicos.
clean-architecture-single-module, 20 minutos, build verde.
Abrir no GitHub →O primeiro spec aprovado, com um partial por camada.
Abrir no GitHub →@Scheduled sem ShedLock, decidido pelo jobs-architect: o delete divide o trabalho entre réplicas.
Abrir no GitHub →Uma leitura pública, registrada no spec como risco aceito explícito.
Abrir no GitHub →O primeiro producer Kafka, com outbox, relay e prune.
Abrir no GitHub →310 testes, 0 falhas, 96,7% de linhas, 50 minutos.
Abrir no GitHub →Um DELETE que anonimiza o cliente e mantém a linha e o id. Traz o primeiro security filter chain do projeto: só o papel DATA_PROTECTION_OFFICER pode chamar.
Abrir no GitHub →O build.yml veio no scaffold do /init-project e mudou duas vezes desde então. 54 runs desde 2026-10-06: 51 verdes e 3 vermelhos. Contagem de 2026-10-15.
doctor gate varreu 203 arquivos-fonte contra elas no último runO que cada step confere, na ordem em que o último run passou por ele. Dois jobs rodam em paralelo; qualquer step que falhe deixa o push vermelho.
on: push · pull_request · workflow_dispatchTodo push na main, todo pull request e o disparo manual. Os dois jobs começam juntos, cada um no seu próprio ubuntu-latest.
actions/checkout · actions/setup-javafetch-depth: 0 · temurin 21 · cache: mavenO checkout traz o histórico completo, que o Sonar usa para o blame. Java 21 da Temurin, com o cache do Maven.
doctorjava .claude/hooks/ArchHook.java doctor gateUm job à parte, em paralelo. O doctor gate reprova o build quando uma linha com gate falha: as 15 regras de boundary, a varredura de imports proibidos em cada arquivo-fonte, o schema das extensões, o jar do hook gerado do ArchHook.java atual e os registros de hook. Linhas que dependem do runner, como CLAUDE_PROJECT_DIR, aparecem mas nunca reprovam.
Boundaries ........ ✅ 15 active rules Boundary violations . ✅ 203 file(s) swept against 15 rule(s) Schema ............ ✅ all extension files pass Hook jar .......... ✅ built from the current .claude/hooks/ArchHook.java Hooks ............. ✅ 28 registration(s) across 12 event(s)✅ doctor gate: no gated line failed (Boundaries, Boundary violations, Schema, Hook jar, Hooks, MCP, Audit overrides).
checkstyle:check (checkstyle-validate)./mvnw -B clean verifyNa fase validate, o Checkstyle lê src/main contra config/checkstyle/checkstyle.xml, a metade mecânica de rules/code-quality.md: tamanho, parâmetros, complexidade, aninhamento, números mágicos. Uma violação reprova o build.
[INFO] You have 0 Checkstyle violations.compiler:compile · compiler:testCompileCódigo de produção e de teste compilados com Java 21. O agente do JaCoCo já está ligado, para medir a cobertura dos testes que vêm a seguir.
surefire:test (default-test)287 testes, sem banco e sem broker. Entre eles, o ArchitectureTest, com 21 regras ArchUnit.
[INFO] Tests run: 21, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 2.496 s -- in dev.nerviz.bankapp.ArchitectureTest[INFO] Tests run: 287, Failures: 0, Errors: 0, Skipped: 0
failsafe:integration-test (default)80 testes contra containers de verdade, subidos pelo Testcontainers: postgres:16-alpine e apache/kafka:4.1.0. O runner do GitHub tem Docker, então nenhum é pulado.
Creating container for image: postgres:16-alpineCreating container for image: apache/kafka:4.1.0[INFO] Tests run: 80, Failures: 0, Errors: 0, Skipped: 0
spotless:check (spotless-check)O Spotless confere src/main e src/test com o palantir-java-format e reprova import não usado. Pega o arquivo escrito por fora do hook de formatação.
[INFO] Spotless.Java is keeping 202 files clean - 0 needs changes to be clean, 202 were already clean, 0 were skipped because caching determined they were already cleancheckstyle:check (checkstyle-test)src/test contra checkstyle-test.xml, um conjunto próprio para código de teste. Foi este check que deixou três runs vermelhos em 12/10/2026, com duas violações que o a28934c corrigiu.
[INFO] You have 0 Checkstyle violations.jacoco:check (check)O JaCoCo exige 80% das linhas e 70% dos branches no projeto todo, fora as classes de startup e de configuração. Os números vêm de rules/testing.md e nunca baixam para o build passar.
[INFO] All coverage checks have been met.[INFO] BUILD SUCCESS
integration tests actually ranUm step de shell lê o failsafe-summary.xml. Se existe *IT.java e nenhum teste de integração rodou, ou algum foi pulado, o build falha: um IT pulado não prova nada.
✅ 80 integration test(s) ran, none skipped.sonar analysis./mvnw -B sonar:sonarDepois do verify, com o relatório do JaCoCo pronto. Só roda quando o secret SONAR_TOKEN existe, então o pull request de um fork passa sem ele. O step envia a análise e não espera o quality gate: o resultado fica no SonarQube Cloud.
[INFO] ANALYSIS SUCCESSFUL, you can find the results at: https://sonarcloud.io/dashboard?id=nerviz-ai_bank-app&branch=mainCada barra é um run do build.yml, na ordem em que rodou. A altura é o total de testes que o Maven reportou, unidade mais integração. Os saltos são os casos de uso.
build.yml · mudou| Quando (UTC) | Commit | Testes | Tempo | Resultado |
|---|---|---|---|---|
| 2026-10-06 15:56 | f5eaf3b chore: initial project scaffold — clean-architecture-single-module, m… | 5 (2 unidade · 3 integração) | 1m30s | ✓ passou |
| 2026-10-06 16:34 | 1a8432a docs: show the app starting and passing verify in the README | 5 (2 unidade · 3 integração) | 1m09s | ✓ passou |
| 2026-10-06 16:35 | 523bcc3 docs: show the app starting and passing verify in the README | 5 (2 unidade · 3 integração) | 1m12s | ✓ passou |
| 2026-10-06 16:38 | f561bb0 Merge pull request #1 from nerviz-ai/docs/readme-run-gifs | 5 (2 unidade · 3 integração) | 53s | ✓ passou |
| 2026-10-06 16:41 | dd2dd2b docs: describe the CI pipeline and what it covers in the README | 5 (2 unidade · 3 integração) | 57s | ✓ passou |
| 2026-10-06 16:48 | badb714 Merge pull request #2 from nerviz-ai/docs/readme-ci-pipeline | 5 (2 unidade · 3 integração) | 58s | ✓ passou |
| 2026-10-07 09:02 | 24558a5 docs(UC-001-create-customer): approved spec | 5 (2 unidade · 3 integração) | 1m02s | ✓ passou |
| 2026-10-07 09:08 | d62c8d4 commit audit-usage | 5 (2 unidade · 3 integração) | 1m03s | ✓ passou |
| 2026-10-07 10:24 | 0e74c8c feat(UC-001-create-customer): create customer with idempotent POST /a… | 113 (98 unidade · 15 integração) | 1m56s | ✓ passou |
| 2026-10-07 10:25 | 9861ede commit audit-usage | 113 (98 unidade · 15 integração) | 1m53s | ✓ passou |
| 2026-10-07 10:49 | 651b779 ci: run SonarQube Cloud analysis on nerviz-ai_bank-app | 113 (98 unidade · 15 integração) | 2m25s | ✓ passou |
| 2026-10-07 10:56 | 249c4fa docs: add SonarQube Cloud badges and public report link to README | 113 (98 unidade · 15 integração) | 2m20s | ✓ passou |
| 2026-10-07 11:06 | d7b62a3 chore(arch): adopt nerviz v0.17.8 and gate CI on doctor | 113 (98 unidade · 15 integração) | 2m17s | ✓ passou |
| 2026-10-07 12:33 | 31fc27c updating readme | 113 (98 unidade · 15 integração) | 1m36s | ✓ passou |
| 2026-10-07 20:43 | 940e578 report issue | 113 (98 unidade · 15 integração) | 2m32s | ✓ passou |
| 2026-10-07 23:13 | a59c52c arch-update | 113 (98 unidade · 15 integração) | 1m58s | ✓ passou |
| 2026-10-07 23:25 | 2da91cd arch-update | 113 (98 unidade · 15 integração) | 2m18s | ✓ passou |
| 2026-10-08 00:53 | 7c4e714 arch-update | 137 (117 unidade · 20 integração) | 2m11s | ✓ passou |
| 2026-10-08 01:06 | 1c966b0 chore: arch-update | 137 (117 unidade · 20 integração) | 2m04s | ✓ passou |
| 2026-10-08 08:51 | 7985d5d chore(arch): update .claude to nerviz v0.20.0 | 137 (117 unidade · 20 integração) | 2m12s | ✓ passou |
| 2026-10-08 11:34 | 3061f71 arch-update | 137 (117 unidade · 20 integração) | 2m08s | ✓ passou |
| 2026-10-08 12:00 | 6e57955 chore(arch): update .claude to nerviz v0.22.0 | 137 (117 unidade · 20 integração) | 2m10s | ✓ passou |
| 2026-10-08 12:24 | 0f96c8b chore: commit changes from before this run | 149 (126 unidade · 23 integração) | 2m11s | ✓ passou |
| 2026-10-08 12:26 | 4fae2c3 audit-usage | 149 (126 unidade · 23 integração) | 2m09s | ✓ passou |
| 2026-10-08 13:28 | 5068ff2 audit-usage | 149 (126 unidade · 23 integração) | 2m01s | ✓ passou |
| 2026-10-08 13:38 | b3c4896 build(sonar): align coverage exclusions with JaCoCo gate | 149 (126 unidade · 23 integração) | 3m06s | ✓ passou |
| 2026-10-08 22:14 | 71015af docs(UC-004-initiate-kyc-verification): approved spec | 149 (126 unidade · 23 integração) | 2m07s | ✓ passou |
| 2026-10-08 22:19 | 8be721f audit-usage | 149 (126 unidade · 23 integração) | 2m16s | ✓ passou |
| 2026-10-09 00:29 | 7bc5c8f feat(UC-004-initiate-kyc-verification): initiate KYC verification via… | 260 (211 unidade · 49 integração) | 2m48s | ✓ passou |
| 2026-10-11 13:05 | 31ff9e0 docs: bring README in line with the current build and CI | 260 (211 unidade · 49 integração) | 2m32s | ✓ passou |
| 2026-10-11 13:13 | 08773e6 Merge pull request #3 from nerviz-ai/docs/readme-current-state | 260 (211 unidade · 49 integração) | 2m25s | ✓ passou |
| 2026-10-11 15:12 | 1fcda1f audit-usage | 260 (211 unidade · 49 integração) | 2m31s | ✓ passou |
| 2026-10-11 15:14 | 13484e7 chore(arch): update .claude to nerviz v0.23.0 | 260 (211 unidade · 49 integração) | 2m12s | ✓ passou |
| 2026-10-11 23:12 | 4fe0f0d chore(arch): update .claude to nerviz v0.25.1 and apply single-module… | 260 (211 unidade · 49 integração) | 2m40s | ✓ passou |
| 2026-10-12 14:49 | be62511 feat(UC-005-record-kyc-verdict): record KYC verdict on customer | 294 (235 unidade · 59 integração) | 2m09s | ✕ falhou |
| 2026-10-12 15:23 | 0079e7c audit-usage | 294 (235 unidade · 59 integração) | 2m25s | ✕ falhou |
| 2026-10-12 16:00 | ba4f5ad gifs | 294 (235 unidade · 59 integração) | 2m36s | ✕ falhou |
| 2026-10-12 16:06 | a28934c chore(arch): update .claude to nerviz v0.25.3 and pass stop-gate-runs… | 294 (235 unidade · 59 integração) | 2m48s | ✓ passou |
| 2026-10-12 21:30 | 076f6f1 chore(arch): update .claude to nerviz v0.26.0 | 294 (235 unidade · 59 integração) | 3m24s | ✓ passou |
| 2026-10-12 21:55 | 27e2456 chore(arch): update .claude to nerviz v0.27.0 | 294 (235 unidade · 59 integração) | 3m20s | ✓ passou |
| 2026-10-12 23:44 | 79fe59c chore(arch): update .claude to nerviz v0.28.0 | 294 (235 unidade · 59 integração) | 2m41s | ✓ passou |
| 2026-10-13 00:12 | 9423b11 docs(UC-006-anonymize-customer): approved spec | 294 (235 unidade · 59 integração) | 2m52s | ✓ passou |
| 2026-10-13 00:51 | d1527eb audit-usage | 294 (235 unidade · 59 integração) | 3m24s | ✓ passou |
| 2026-10-13 01:06 | 8e8bf56 chore(arch): update .claude to nerviz v0.29.0 | 294 (235 unidade · 59 integração) | 3m34s | ✓ passou |
| 2026-10-13 01:08 | 6037ed3 chore(audit-usage): remove stale report citing deleted UC-004-initiate | 294 (235 unidade · 59 integração) | 3m08s | ✓ passou |
| 2026-10-13 09:59 | 02c4c17 feat(UC-006-anonymize-customer): anonymize a customer via DELETE /api… | 355 (276 unidade · 79 integração) | 3m56s | ✓ passou |
| 2026-10-13 10:21 | 6b55699 feat(UC-006-anonymize-customer): add local Keycloak service to docker… | 355 (276 unidade · 79 integração) | 3m03s | ✓ passou |
| 2026-10-13 15:17 | 80564c1 build(sonar): exempt java:S4502 on SecurityConfig | 355 (276 unidade · 79 integração) | 4m09s | ✓ passou |
| 2026-10-13 22:14 | 45fc2bb refactor(api): move REST versioning to native API versioning | 359 (280 unidade · 79 integração) | 3m26s | ✓ passou |
| 2026-10-14 12:48 | eb89105 chore: update .claude to nerviz v0.34.0 and apply its migrations | 360 (281 unidade · 79 integração) | 3m16s | ✓ passou |
| 2026-10-14 17:37 | 7a5c534 chore: commit pending changes | 366 (287 unidade · 79 integração) | 3m17s | ✓ passou |
| 2026-10-14 19:58 | 3187bac chore(arch): update .claude to nerviz v0.35.0 | 366 (287 unidade · 79 integração) | 3m22s | ✓ passou |
| 2026-10-15 09:02 | c0047d8 chore(arch): update .claude to nerviz v0.36.0 | 366 (287 unidade · 79 integração) | 3m18s | ✓ passou |
| 2026-10-15 21:16 | a3cc28a chore: commit pending changes | 367 (287 unidade · 80 integração) | 3m40s | ✓ passou |
Todo push na main manda o código para o SonarQube Cloud, no step sonar analysis do CI. O relatório é público: abaixo, os badges ao vivo e um retrato da última análise.
Estes badges são desenhados pelo SonarQube Cloud a cada carregamento da página. O SonarQube Cloud não deixa o relatório abrir dentro do frame de outro site, então o relatório completo abre lá. Análise de 2026-10-24 23:26 UTC, commit 948c8dc.
O Sonar way é o gate padrão do SonarQube Cloud. Ele julga o código novo, aqui tudo desde a versão anterior (2026-10-07), em seis condições:
new_reliability_ratingAexigido ≤ Anew_security_ratingAexigido ≤ Anew_maintainability_ratingAexigido ≤ Anew_coverage96,5%exigido ≥ 80%new_duplicated_lines_density0,0%exigido ≤ 3%new_security_hotspots_reviewed100%exigido = 100%3.946 linhas de código em 142 arquivos
No CI, o jacoco:check reprova o build abaixo de 80% das linhas ou 70% dos branches. O SonarQube Cloud lê o mesmo relatório do JaCoCo.