Files
EvandroandClaude Opus 5.5 f2db2d69da refactor(skills): cut the workflows to ~100 lines and scale phases by tier
Each workflow was ~300 lines of grep-count "VERIFICAR" steps and ran every
phase for every request. Phases now state their minimum tier, checks are the
quality gate plus real tools, detail moved to references/, and machine-specific
paths and non-public skills are gone. Security references move to OWASP Top
10:2025, ASVS 5.0 and the OWASP LLM Top 10.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-09-24 21:52:06 -03:00

2.2 KiB

Checagens de backend que dependem do app de pé

Estas checagens entram como [[check]] no .dev-workflows.toml do projeto, porque precisam de servidor, banco ou carga reais. O gate roda cada uma no nível indicado e trata ferramenta ausente como "não verificado".

Contrato de exemplo (docs/contract.md)

POST /api/v1/users      -> 201 | 400 | 401 | 409 | 429
GET  /api/v1/users/:id  -> 200 | 403 | 404
Erros: RFC 9457 (application/problem+json)
Paginação: ?cursor=&limit= (limit máx. 100)
Rate limit: 60 req/min por usuário em escrita; 429 com Retry-After
Auth: sessão em cookie httpOnly; rotas /admin exigem papel admin

Receitas de [[check]]

# Fuzz da API a partir do OpenAPI: zero 5xx e zero violação de schema
[[check]]
name = "api-fuzz"
cmd = "schemathesis run http://localhost:8000/openapi.json --checks all"
tier = 2

# Contrato com consumidores (quando outro serviço usa a API)
[[check]]
name = "pact-verify"
cmd = "npx pact-provider-verifier --provider-base-url http://localhost:8000 --pact-broker-url $PACT_BROKER_URL"
tier = 2

# Migração reversível num banco descartável (up -> down -> up)
[[check]]
name = "migration-roundtrip"
cmd = "alembic upgrade head && alembic downgrade -1 && alembic upgrade head"
tier = 2

# Carga no caminho quente, com threshold de p95 no próprio script k6
[[check]]
name = "load"
cmd = "k6 run --quiet load/hot-path.js"
tier = 3

No k6, o threshold fica no script e faz o comando sair com erro quando estoura:

export const options = {
  vus: 20, duration: "30s",
  thresholds: { http_req_duration: ["p(95)<300"], http_req_failed: ["rate<0.01"] },
};

Para a migração, suba um Postgres descartável (testcontainers ou docker run --rm -p 5433:5432 postgres) e aponte a DATABASE_URL do comando para ele. Nunca rode o roundtrip num banco com dados reais.

Queries novas

  • Rode EXPLAIN (ANALYZE, BUFFERS) em cada query nova com volume parecido com o de produção; seq scan em tabela grande pede índice ou filtro.
  • N+1: conte as queries de uma requisição de listagem (log do ORM ou django-debug-toolbar, nplusone, bullet). O número não pode crescer com o tamanho da página.