Every workflow used to run all of its phases for any request, so a one-line fix paid the cost of a feature. dev-router classifies the request into tiers 0-3 with security triggers that raise the tier, and picks the workflow, agents and gate tier. Agents get only the tools their role needs. Co-Authored-By: Claude Opus 5.5 <[email protected]>
72 lines
3.0 KiB
Markdown
72 lines
3.0 KiB
Markdown
# Quality gate: checagens e configuração
|
|
|
|
`scripts/quality-gate --tier N` roda as checagens do nível N e dos níveis abaixo, só sobre os arquivos
|
|
alterados em relação à branch base (merge-base com `origin/HEAD`, `main` ou `master`). O resultado vai
|
|
para `.dev-workflows/gate.json` (ignorado pelo git automaticamente) e uma linha resumida vai para
|
|
`.dev-workflows/log.jsonl`.
|
|
|
|
`--list` mostra o que rodaria e o que está faltando, sem rodar nada.
|
|
|
|
## Checagens
|
|
|
|
| Nível | Checagem | Ferramenta | Como é detectada |
|
|
|---|---|---|---|
|
|
| 0 | lint | script `lint` do package.json, eslint, ruff, `go vet`, clippy | primeira que existir |
|
|
| 0 | typecheck | script `typecheck`, `tsc --noEmit`, pyright, mypy | tsconfig ou config do checker |
|
|
| 0 | test | script `test`, pytest (usa `.venv` se existir), `go test`, `cargo test` | stack do projeto |
|
|
| 0 | secrets | gitleaks, só nos arquivos alterados | binário no PATH |
|
|
| 1 | diff-coverage | diff-cover sobre `coverage.xml` | relatório de cobertura presente |
|
|
| 1 | semgrep | `semgrep --config p/default --baseline-commit <base>` | binário no PATH |
|
|
| 1 | dead-code (info) | knip, vulture | binário no projeto ou PATH |
|
|
| 2 | build | script `build` | package.json |
|
|
| 2 | mutation | Stryker nos arquivos alterados; mutmut (paths configurados) | config do Stryker ou `[tool.mutmut]` |
|
|
| 2 | osv-scanner | `osv-scanner scan source --recursive .` | binário no PATH |
|
|
| 2 | architecture | dependency-cruiser, import-linter | arquivo de config |
|
|
| 2 | duplication (info) | jscpd | binário no projeto |
|
|
| 3 | trivy | vulnerabilidades, misconfig e segredos, HIGH e CRITICAL | binário no PATH |
|
|
| 3 | traceability | todo `REQ-NNN` da spec aparece em algum teste | `[spec]` na config |
|
|
|
|
Estados: `pass`, `fail`, `unverified` (ferramenta ou config ausente, nunca conta como aprovado) e
|
|
`info` (só relatório). Veredito: `fail` se algo falhou; `incomplete` se algo ficou não verificado; senão `pass`.
|
|
|
|
## `.dev-workflows.toml` (opcional, na raiz do projeto)
|
|
|
|
```toml
|
|
timeout = 600 # segundos por checagem
|
|
|
|
[commands] # substitui o que foi detectado
|
|
test = "pnpm vitest run --coverage"
|
|
lint = "pnpm eslint ."
|
|
mutation = "pnpm stryker run --incremental"
|
|
|
|
[thresholds]
|
|
diff_coverage = 80
|
|
|
|
[coverage]
|
|
report = "coverage/cobertura-coverage.xml"
|
|
|
|
[spec] # nível 3: rastreabilidade requisito -> teste
|
|
file = "docs/spec.md"
|
|
tests = ["tests", "e2e"]
|
|
|
|
[[check]] # checagem extra; kind = "gate" (padrão) ou "info"
|
|
name = "lighthouse"
|
|
cmd = "npx lhci autorun"
|
|
tier = 2
|
|
|
|
[[check]]
|
|
name = "a11y"
|
|
cmd = "npx playwright test e2e/a11y.spec.ts"
|
|
tier = 2
|
|
|
|
[[check]]
|
|
name = "api-fuzz"
|
|
cmd = "schemathesis run http://localhost:8000/openapi.json --checks all"
|
|
tier = 2
|
|
```
|
|
|
|
Frontend, API e carga dependem do app estar de pé, então entram como `[[check]]` do projeto
|
|
(Lighthouse CI com orçamento, Playwright com `@axe-core/playwright`, schemathesis, k6 com thresholds).
|
|
|
|
`DW_GATE=off` desliga o hook de `Stop` numa sessão.
|