Fluxo de Desenvolvimento¶
Do início de uma tarefa até o deploy em produção — passo a passo.
Visão Geral¶
Linear issue
│
▼
branch de feature (a partir de develop)
│
▼
desenvolvimento local
│ git commit → pre-commit hooks (ruff, ty, yaml, json...)
▼
Pull Request → develop
│ CI: docs-build, pre-commit, unit tests, integration tests
│ Aprovação: 1 CODEOWNER
▼
develop
│ deploy automático → ambiente de staging (Railway)
▼
Pull Request → main
│ CI: tudo acima + e2e tests
│ Aprovação: 1 CODEOWNER
▼
main
│ deploy automático → produção (Railway)
1. Criar a branch¶
Sempre crie a branch a partir de develop, nunca de main:
Convenção de nomenclatura¶
| Tipo | Quando usar |
|---|---|
feat/ |
Nova funcionalidade |
fix/ |
Correção de bug |
chore/ |
Infraestrutura, CI, dependências, docs |
refactor/ |
Refatoração sem mudança de comportamento |
test/ |
Adição ou correção de testes |
Exemplos:
feat/agent-approval-workflow
fix/webhook-signature-validation
chore/update-logfire-integrations
refactor/billing-subscription-guard
Se a tarefa tem issue no Linear, inclua o identificador no branch ou no título do PR para linkar automaticamente:
2. Desenvolvimento local¶
Antes de começar, garanta que o ambiente está rodando:
make db-start # PostgreSQL local via Supabase CLI
docker run -d --name spryx-redis -p 6379:6379 redis:7-alpine # Redis
make dev-api # App API com hot reload
Ver Desenvolvimento Local para o setup completo.
3. Commits¶
Formato — Conventional Commits¶
| Tipo | Quando usar |
|---|---|
feat |
Nova funcionalidade |
fix |
Correção de bug |
chore |
Build, CI, dependências, docs |
refactor |
Refatoração sem mudança de comportamento |
test |
Testes |
perf |
Melhoria de performance |
Exemplos:
feat(agent): add approval request workflow
fix(billing): prevent duplicate webhook processing
chore(ci): add docs-build job to validate zensical on PRs
refactor(identity): extract tenant validation to repository
Escopo: nome do módulo afetado (agent, billing, identity, connections, etc.) ou da camada (ci, docker, deps).
Pre-commit hooks¶
Ao fazer git commit, os hooks rodam automaticamente antes de aceitar o commit:
| Hook | O que verifica |
|---|---|
ruff format --check |
Formatação Python (equivalente ao black) |
ruff check |
Lint Python (equivalente ao flake8 + isort) |
ty check |
Type checking estático |
check-yaml |
Sintaxe YAML válida |
check-toml |
Sintaxe TOML válida |
check-json |
Sintaxe JSON válida |
check-merge-conflict |
Detecta marcadores <<<<<< esquecidos |
python-check-blanket-noqa |
Proíbe # noqa sem especificar regra |
python-use-type-annotations |
Força anotações de tipo (não comentários) |
Se um hook falhar:
# Corrigir formato automaticamente
make fix
# Verificar o que ainda tem problema
make lint
# Rodar typecheck separadamente
make typecheck
# Tentar commitar de novo
git add -p
git commit
Nunca use --no-verify
Pular hooks (git commit --no-verify) faz o CI falhar de qualquer forma — os mesmos checks rodam no job pre-commit. Corrija o problema na raiz.
4. Abrir Pull Request¶
Para qual branch abrir¶
| Tipo de mudança | Abrir PR para |
|---|---|
| Feature, fix, refactor, chore | develop |
| Hotfix urgente de produção | main (ver seção Hotfix) |
Título do PR¶
Siga o mesmo formato de Conventional Commits:
Descrição¶
Inclua no mínimo:
- O que muda — contexto da mudança, decisões não óbvias
- Como testar — como o revisor pode verificar o comportamento
- Link do Linear — se houver issue associada
Quem aprova¶
O CODEOWNERS define que todos os arquivos requerem aprovação de @ppcantidio ou @LuizHenriquerg. Na prática: 1 aprovação de CODEOWNER desbloqueia o merge.
PRs de um CODEOWNER ainda precisam de aprovação do outro.
5. CI — O que roda e o que bloqueia¶
Todos os checks abaixo rodam automaticamente ao abrir ou atualizar um PR. Nenhum merge é possível sem que todos passem.
PRs para develop¶
| Job | O que faz | Bloqueia? |
|---|---|---|
docs-build |
zensical build — verifica que a documentação compila |
Sim |
pre-commit |
Ruff + ty + hooks de qualidade | Sim |
test-unit |
Pytest unit sem banco | Sim |
test-integration |
Pytest integration contra Supabase Preview | Sim |
Os testes de integração aguardam o job Supabase Preview criar o banco isolado para a branch do PR antes de rodar.
PRs para main (adicionalmente)¶
| Job | O que faz | Bloqueia? |
|---|---|---|
test-e2e |
Testes HTTP/WebSocket com Doppler secrets reais | Sim |
Se um check falhar¶
- Clique no job que falhou no GitHub para ver os logs
- Corrija localmente, commite e faça push — o CI roda de novo automaticamente
- Não force o merge sem todos os checks passando
6. Deploy e ambientes¶
Ambientes¶
| Ambiente | Branch | URL | Quando |
|---|---|---|---|
| Staging | develop |
staging.spryx.ai | Merge automático após PR aprovado |
| Produção | main |
spryx.ai | Merge automático após PR aprovado |
Acompanhar o deploy¶
O deploy acontece automaticamente no Railway após o merge. Para acompanhar:
- Abra o Railway dashboard
- Selecione o serviço (App API, Backoffice API ou Worker)
- A aba Deployments mostra o status em tempo real:
Building,Deploying,Active - Logs de build e runtime disponíveis no próprio dashboard
Verificar que subiu¶
Após o deploy ficar Active:
- App API staging:
GET /healthou abrir o Swagger em/docs - Logfire: verifique se novos spans estão chegando do ambiente correto
7. Hotfix — Correção urgente em produção¶
Use apenas quando main tem um bug crítico que não pode esperar o ciclo normal de develop → main.
# 1. Crie a branch a partir de main (não develop)
git checkout main
git pull origin main
git checkout -b fix/nome-do-bug-critico
# 2. Faça a correção mínima necessária
# 3. Abra PR direto para main
# 4. Após merge em main, backporte para develop também
git checkout develop
git pull origin develop
git merge main
git push origin develop
Backporte obrigatório
Sempre leve o hotfix de main para develop logo após o merge. Caso contrário, a correção será perdida no próximo release.
Checklist antes de abrir o PR¶
[ ] Branch criada a partir de develop (ou main, se hotfix)
[ ] make lint passou sem erros
[ ] make typecheck passou sem erros
[ ] make test-unit passou
[ ] make test-integration passou (opcional local, mas roda no CI)
[ ] Commits seguem Conventional Commits
[ ] Título do PR segue o formato convencional
[ ] Descrição explica o que muda e como testar
[ ] Issue do Linear linkada (se aplicável)