synapos 2.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.github/copilot-instructions.md +72 -0
- package/.synapos/.manifest.json +155 -0
- package/.synapos/GUIDE.md +660 -0
- package/.synapos/VERSION +1 -0
- package/.synapos/_memory/company.md +11 -0
- package/.synapos/_memory/preferences.md +15 -0
- package/.synapos/copilot.md +451 -0
- package/.synapos/core/best-practices/_catalog.yaml +56 -0
- package/.synapos/core/best-practices/content/blog-post.md +238 -0
- package/.synapos/core/best-practices/content/copywriting.md +164 -0
- package/.synapos/core/best-practices/content/linkedin-post.md +186 -0
- package/.synapos/core/best-practices/dev/api-design.md +274 -0
- package/.synapos/core/best-practices/dev/code-review.md +138 -0
- package/.synapos/core/best-practices/dev/git-workflow.md +256 -0
- package/.synapos/core/best-practices/dev/testing-strategy.md +213 -0
- package/.synapos/core/best-practices/product/product-spec.md +235 -0
- package/.synapos/core/best-practices/product/technical-writing.md +264 -0
- package/.synapos/core/best-practices/product/user-research.md +242 -0
- package/.synapos/core/commands/bump.md +59 -0
- package/.synapos/core/commands/debug/session.md +100 -0
- package/.synapos/core/commands/migrate/v1-to-v2.md +142 -0
- package/.synapos/core/commands/set-model.md +197 -0
- package/.synapos/core/commands/setup/build-business.md +378 -0
- package/.synapos/core/commands/setup/build-tech.md +374 -0
- package/.synapos/core/commands/setup/discover.md +543 -0
- package/.synapos/core/commands/setup/from-code.md +407 -0
- package/.synapos/core/commands/setup/start.md +201 -0
- package/.synapos/core/copilot-adapter.md +283 -0
- package/.synapos/core/gate-system.md +417 -0
- package/.synapos/core/model-adapter.md +245 -0
- package/.synapos/core/orchestrator.md +794 -0
- package/.synapos/core/pipeline-runner.md +784 -0
- package/.synapos/core/pipelines/pre-execution.yaml +107 -0
- package/.synapos/core/rules/product-agent.mdc +59 -0
- package/.synapos/core/skills-engine.md +207 -0
- package/.synapos/core/versioning.md +218 -0
- package/.synapos/skills/.gitkeep +0 -0
- package/.synapos/skills/brave-search/SKILL.md +130 -0
- package/.synapos/skills/fetch-url/SKILL.md +135 -0
- package/.synapos/skills/filesystem/SKILL.md +162 -0
- package/.synapos/skills/github/SKILL.md +148 -0
- package/.synapos/skills/playwright-browser/SKILL.md +124 -0
- package/.synapos/squad-templates/backend/agents/alexandre-api.agent.md +243 -0
- package/.synapos/squad-templates/backend/agents/bruno-base.agent.md +240 -0
- package/.synapos/squad-templates/backend/agents/daniela-dados.agent.md +267 -0
- package/.synapos/squad-templates/backend/agents/roberto-revisao-be.agent.md +219 -0
- package/.synapos/squad-templates/backend/agents/sergio-seguranca.agent.md +266 -0
- package/.synapos/squad-templates/backend/pipelines/api-development.yaml +83 -0
- package/.synapos/squad-templates/backend/pipelines/bug-fix.yaml +41 -0
- package/.synapos/squad-templates/backend/pipelines/database-migration.yaml +56 -0
- package/.synapos/squad-templates/backend/pipelines/quick-fix.yaml +40 -0
- package/.synapos/squad-templates/backend/pipelines/steps/01-gate-integridade.md +66 -0
- package/.synapos/squad-templates/backend/pipelines/steps/02-design-api.md +155 -0
- package/.synapos/squad-templates/backend/pipelines/steps/03-checkpoint-contrato.md +44 -0
- package/.synapos/squad-templates/backend/pipelines/steps/04-implementacao.md +113 -0
- package/.synapos/squad-templates/backend/pipelines/steps/05-seguranca.md +100 -0
- package/.synapos/squad-templates/backend/pipelines/steps/06-review.md +80 -0
- package/.synapos/squad-templates/backend/pipelines/steps/atualizar-tarefa.md +138 -0
- package/.synapos/squad-templates/backend/pipelines/steps/bfbe-02-diagnostico.md +47 -0
- package/.synapos/squad-templates/backend/pipelines/steps/bfbe-03-fix.md +41 -0
- package/.synapos/squad-templates/backend/pipelines/steps/bfbe-04-review.md +42 -0
- package/.synapos/squad-templates/backend/pipelines/steps/dm-02-schema.md +85 -0
- package/.synapos/squad-templates/backend/pipelines/steps/dm-03-checkpoint.md +30 -0
- package/.synapos/squad-templates/backend/pipelines/steps/dm-04-migration.md +58 -0
- package/.synapos/squad-templates/backend/pipelines/steps/dm-05-review.md +44 -0
- package/.synapos/squad-templates/backend/pipelines/steps/qf-02-contexto.md +34 -0
- package/.synapos/squad-templates/backend/pipelines/steps/qf-03-executar.md +49 -0
- package/.synapos/squad-templates/backend/pipelines/steps/qf-04-registrar.md +35 -0
- package/.synapos/squad-templates/backend/template.yaml +72 -0
- package/.synapos/squad-templates/devops/agents/claudio-containers.agent.md +245 -0
- package/.synapos/squad-templates/devops/agents/igor-infra.agent.md +198 -0
- package/.synapos/squad-templates/devops/agents/osvaldo-observabilidade.agent.md +262 -0
- package/.synapos/squad-templates/devops/agents/patricia-pipeline.agent.md +253 -0
- package/.synapos/squad-templates/devops/pipelines/ci-cd-setup.yaml +93 -0
- package/.synapos/squad-templates/devops/pipelines/infra-provision.yaml +56 -0
- package/.synapos/squad-templates/devops/pipelines/quick-fix.yaml +41 -0
- package/.synapos/squad-templates/devops/pipelines/steps/01-gate-integridade.md +62 -0
- package/.synapos/squad-templates/devops/pipelines/steps/02-infra-design.md +31 -0
- package/.synapos/squad-templates/devops/pipelines/steps/03-containers.md +28 -0
- package/.synapos/squad-templates/devops/pipelines/steps/04-checkpoint.md +20 -0
- package/.synapos/squad-templates/devops/pipelines/steps/05-pipeline-cicd.md +29 -0
- package/.synapos/squad-templates/devops/pipelines/steps/06-observabilidade.md +28 -0
- package/.synapos/squad-templates/devops/pipelines/steps/07-review.md +27 -0
- package/.synapos/squad-templates/devops/pipelines/steps/atualizar-tarefa.md +138 -0
- package/.synapos/squad-templates/devops/pipelines/steps/ip-02-design.md +21 -0
- package/.synapos/squad-templates/devops/pipelines/steps/ip-03-iac.md +20 -0
- package/.synapos/squad-templates/devops/pipelines/steps/ip-04-checkpoint.md +22 -0
- package/.synapos/squad-templates/devops/pipelines/steps/ip-05-apply.md +22 -0
- package/.synapos/squad-templates/devops/pipelines/steps/qf-02-contexto.md +34 -0
- package/.synapos/squad-templates/devops/pipelines/steps/qf-03-executar.md +52 -0
- package/.synapos/squad-templates/devops/pipelines/steps/qf-04-registrar.md +35 -0
- package/.synapos/squad-templates/devops/template.yaml +68 -0
- package/.synapos/squad-templates/engineer/agents/leo-engenheiro.agent.md +203 -0
- package/.synapos/squad-templates/engineer/pipeline/steps/01-gate.md +22 -0
- package/.synapos/squad-templates/engineer/pipeline/steps/02-preparacao.md +66 -0
- package/.synapos/squad-templates/engineer/pipeline/steps/03-investigacao.md +110 -0
- package/.synapos/squad-templates/engineer/pipeline/steps/04-checkpoint-contexto.md +24 -0
- package/.synapos/squad-templates/engineer/pipeline/steps/05-arquitetura.md +127 -0
- package/.synapos/squad-templates/engineer/pipeline/steps/06-checkpoint-arquitetura.md +27 -0
- package/.synapos/squad-templates/engineer/pipeline/steps/07-planejamento.md +109 -0
- package/.synapos/squad-templates/engineer/pipeline/steps/08-checkpoint-plano.md +27 -0
- package/.synapos/squad-templates/engineer/pipeline/steps/09-execucao.md +121 -0
- package/.synapos/squad-templates/engineer/pipeline/steps/atualizar-tarefa.md +27 -0
- package/.synapos/squad-templates/engineer/pipeline/steps/visual-spec.md +74 -0
- package/.synapos/squad-templates/engineer/pipelines/feature-development.yaml +107 -0
- package/.synapos/squad-templates/engineer/template.yaml +56 -0
- package/.synapos/squad-templates/frontend/agents/ana-arquitetura-fe.agent.md +245 -0
- package/.synapos/squad-templates/frontend/agents/paulo-performance.agent.md +234 -0
- package/.synapos/squad-templates/frontend/agents/renata-revisao-fe.agent.md +219 -0
- package/.synapos/squad-templates/frontend/agents/rodrigo-react.agent.md +261 -0
- package/.synapos/squad-templates/frontend/agents/tiago-testes-fe.agent.md +229 -0
- package/.synapos/squad-templates/frontend/agents/ursula-ui.agent.md +283 -0
- package/.synapos/squad-templates/frontend/pipelines/bug-fix.yaml +40 -0
- package/.synapos/squad-templates/frontend/pipelines/component-development.yaml +48 -0
- package/.synapos/squad-templates/frontend/pipelines/feature-development.yaml +76 -0
- package/.synapos/squad-templates/frontend/pipelines/quick-fix.yaml +40 -0
- package/.synapos/squad-templates/frontend/pipelines/steps/01-gate-integridade.md +66 -0
- package/.synapos/squad-templates/frontend/pipelines/steps/02-arquitetura.md +100 -0
- package/.synapos/squad-templates/frontend/pipelines/steps/03-checkpoint-design.md +43 -0
- package/.synapos/squad-templates/frontend/pipelines/steps/04-implementacao.md +114 -0
- package/.synapos/squad-templates/frontend/pipelines/steps/05-review.md +104 -0
- package/.synapos/squad-templates/frontend/pipelines/steps/06-docs.md +51 -0
- package/.synapos/squad-templates/frontend/pipelines/steps/atualizar-tarefa.md +138 -0
- package/.synapos/squad-templates/frontend/pipelines/steps/bf-02-diagnostico.md +52 -0
- package/.synapos/squad-templates/frontend/pipelines/steps/bf-03-fix.md +58 -0
- package/.synapos/squad-templates/frontend/pipelines/steps/bf-04-review.md +43 -0
- package/.synapos/squad-templates/frontend/pipelines/steps/cd-02-spec.md +96 -0
- package/.synapos/squad-templates/frontend/pipelines/steps/qf-02-contexto.md +34 -0
- package/.synapos/squad-templates/frontend/pipelines/steps/qf-03-executar.md +45 -0
- package/.synapos/squad-templates/frontend/pipelines/steps/qf-04-registrar.md +35 -0
- package/.synapos/squad-templates/frontend/template.yaml +77 -0
- package/.synapos/squad-templates/fullstack/agents/carlos-coordenador.agent.md +266 -0
- package/.synapos/squad-templates/fullstack/pipelines/bug-fix.yaml +46 -0
- package/.synapos/squad-templates/fullstack/pipelines/integration-feature.yaml +92 -0
- package/.synapos/squad-templates/fullstack/pipelines/quick-fix.yaml +40 -0
- package/.synapos/squad-templates/fullstack/pipelines/steps/01-gate-integridade.md +66 -0
- package/.synapos/squad-templates/fullstack/pipelines/steps/02-contrato-api.md +63 -0
- package/.synapos/squad-templates/fullstack/pipelines/steps/03-checkpoint-contrato.md +25 -0
- package/.synapos/squad-templates/fullstack/pipelines/steps/04-frontend.md +35 -0
- package/.synapos/squad-templates/fullstack/pipelines/steps/05-backend.md +36 -0
- package/.synapos/squad-templates/fullstack/pipelines/steps/06-integracao.md +47 -0
- package/.synapos/squad-templates/fullstack/pipelines/steps/07-review.md +49 -0
- package/.synapos/squad-templates/fullstack/pipelines/steps/atualizar-tarefa.md +138 -0
- package/.synapos/squad-templates/fullstack/pipelines/steps/bf-02-diagnostico.md +34 -0
- package/.synapos/squad-templates/fullstack/pipelines/steps/bf-03-fix.md +22 -0
- package/.synapos/squad-templates/fullstack/pipelines/steps/bf-04-review.md +22 -0
- package/.synapos/squad-templates/fullstack/pipelines/steps/qf-02-contexto.md +34 -0
- package/.synapos/squad-templates/fullstack/pipelines/steps/qf-03-executar.md +49 -0
- package/.synapos/squad-templates/fullstack/pipelines/steps/qf-04-registrar.md +35 -0
- package/.synapos/squad-templates/fullstack/template.yaml +93 -0
- package/.synapos/squad-templates/ia-dados/agents/diana-dados.agent.md +269 -0
- package/.synapos/squad-templates/ia-dados/agents/larissa-llm.agent.md +255 -0
- package/.synapos/squad-templates/ia-dados/agents/marco-ml.agent.md +227 -0
- package/.synapos/squad-templates/ia-dados/agents/nelson-notebook.agent.md +252 -0
- package/.synapos/squad-templates/ia-dados/pipelines/data-pipeline.yaml +71 -0
- package/.synapos/squad-templates/ia-dados/pipelines/ml-feature.yaml +91 -0
- package/.synapos/squad-templates/ia-dados/pipelines/quick-fix.yaml +40 -0
- package/.synapos/squad-templates/ia-dados/pipelines/steps/01-gate-integridade.md +62 -0
- package/.synapos/squad-templates/ia-dados/pipelines/steps/02-exploracao.md +36 -0
- package/.synapos/squad-templates/ia-dados/pipelines/steps/03-design.md +25 -0
- package/.synapos/squad-templates/ia-dados/pipelines/steps/04-checkpoint.md +23 -0
- package/.synapos/squad-templates/ia-dados/pipelines/steps/05-implementacao.md +26 -0
- package/.synapos/squad-templates/ia-dados/pipelines/steps/06-avaliacao.md +29 -0
- package/.synapos/squad-templates/ia-dados/pipelines/steps/07-deploy.md +30 -0
- package/.synapos/squad-templates/ia-dados/pipelines/steps/atualizar-tarefa.md +138 -0
- package/.synapos/squad-templates/ia-dados/pipelines/steps/dp-02-design.md +21 -0
- package/.synapos/squad-templates/ia-dados/pipelines/steps/dp-03-checkpoint.md +14 -0
- package/.synapos/squad-templates/ia-dados/pipelines/steps/dp-04-implementacao.md +19 -0
- package/.synapos/squad-templates/ia-dados/pipelines/steps/dp-05-qualidade.md +21 -0
- package/.synapos/squad-templates/ia-dados/pipelines/steps/dp-06-deploy.md +22 -0
- package/.synapos/squad-templates/ia-dados/pipelines/steps/qf-02-contexto.md +34 -0
- package/.synapos/squad-templates/ia-dados/pipelines/steps/qf-03-executar.md +53 -0
- package/.synapos/squad-templates/ia-dados/pipelines/steps/qf-04-registrar.md +35 -0
- package/.synapos/squad-templates/ia-dados/template.yaml +68 -0
- package/.synapos/squad-templates/mobile/agents/felipe-feature.agent.md +234 -0
- package/.synapos/squad-templates/mobile/agents/marina-mobile.agent.md +219 -0
- package/.synapos/squad-templates/mobile/agents/viviane-visual.agent.md +218 -0
- package/.synapos/squad-templates/mobile/pipelines/bug-fix.yaml +47 -0
- package/.synapos/squad-templates/mobile/pipelines/feature-development.yaml +77 -0
- package/.synapos/squad-templates/mobile/pipelines/quick-fix.yaml +40 -0
- package/.synapos/squad-templates/mobile/pipelines/steps/01-gate-integridade.md +62 -0
- package/.synapos/squad-templates/mobile/pipelines/steps/02-arquitetura.md +35 -0
- package/.synapos/squad-templates/mobile/pipelines/steps/03-design-ux.md +29 -0
- package/.synapos/squad-templates/mobile/pipelines/steps/04-checkpoint.md +20 -0
- package/.synapos/squad-templates/mobile/pipelines/steps/05-implementacao.md +26 -0
- package/.synapos/squad-templates/mobile/pipelines/steps/06-review.md +27 -0
- package/.synapos/squad-templates/mobile/pipelines/steps/atualizar-tarefa.md +138 -0
- package/.synapos/squad-templates/mobile/pipelines/steps/bf-02-diagnostico.md +22 -0
- package/.synapos/squad-templates/mobile/pipelines/steps/bf-03-fix.md +23 -0
- package/.synapos/squad-templates/mobile/pipelines/steps/bf-04-review.md +20 -0
- package/.synapos/squad-templates/mobile/pipelines/steps/qf-02-contexto.md +34 -0
- package/.synapos/squad-templates/mobile/pipelines/steps/qf-03-executar.md +49 -0
- package/.synapos/squad-templates/mobile/pipelines/steps/qf-04-registrar.md +35 -0
- package/.synapos/squad-templates/mobile/template.yaml +73 -0
- package/.synapos/squad-templates/produto/agents/ana-analise.agent.md +243 -0
- package/.synapos/squad-templates/produto/agents/eduardo-estrategia.agent.md +258 -0
- package/.synapos/squad-templates/produto/agents/paulo-pesquisa.agent.md +226 -0
- package/.synapos/squad-templates/produto/agents/priscila-produto.agent.md +235 -0
- package/.synapos/squad-templates/produto/agents/tania-tecnica.agent.md +239 -0
- package/.synapos/squad-templates/produto/agents/ursula-ux.agent.md +231 -0
- package/.synapos/squad-templates/produto/pipelines/discovery-spec-handoff.yaml +152 -0
- package/.synapos/squad-templates/produto/pipelines/nova-feature.yaml +77 -0
- package/.synapos/squad-templates/produto/pipelines/quick-fix.yaml +40 -0
- package/.synapos/squad-templates/produto/pipelines/quick-spec.yaml +60 -0
- package/.synapos/squad-templates/produto/pipelines/refinar-docs.yaml +33 -0
- package/.synapos/squad-templates/produto/pipelines/steps/01-gate-integridade.md +48 -0
- package/.synapos/squad-templates/produto/pipelines/steps/02-contexto-negocio.md +119 -0
- package/.synapos/squad-templates/produto/pipelines/steps/03-personas.md +107 -0
- package/.synapos/squad-templates/produto/pipelines/steps/04-checkpoint-research.md +53 -0
- package/.synapos/squad-templates/produto/pipelines/steps/04b-alinhamento-estrategico.md +92 -0
- package/.synapos/squad-templates/produto/pipelines/steps/05-spec.md +138 -0
- package/.synapos/squad-templates/produto/pipelines/steps/05b-checkpoint-spec.md +60 -0
- package/.synapos/squad-templates/produto/pipelines/steps/06-requisitos.md +118 -0
- package/.synapos/squad-templates/produto/pipelines/steps/06b-checkpoint-requisitos.md +53 -0
- package/.synapos/squad-templates/produto/pipelines/steps/06c-visual-spec.md +59 -0
- package/.synapos/squad-templates/produto/pipelines/steps/07-arquitetura.md +160 -0
- package/.synapos/squad-templates/produto/pipelines/steps/08-handoff.md +130 -0
- package/.synapos/squad-templates/produto/pipelines/steps/nf-02-validar-requisito.md +73 -0
- package/.synapos/squad-templates/produto/pipelines/steps/nf-03-verificar-docs.md +69 -0
- package/.synapos/squad-templates/produto/pipelines/steps/nf-04-spec.md +160 -0
- package/.synapos/squad-templates/produto/pipelines/steps/nf-05-checkpoint-aprovacao.md +50 -0
- package/.synapos/squad-templates/produto/pipelines/steps/nf-06-versionar.md +71 -0
- package/.synapos/squad-templates/produto/pipelines/steps/nf-07-handoff.md +99 -0
- package/.synapos/squad-templates/produto/pipelines/steps/nf-08-criar-tarefas.md +232 -0
- package/.synapos/squad-templates/produto/pipelines/steps/qf-02-contexto.md +34 -0
- package/.synapos/squad-templates/produto/pipelines/steps/qf-03-executar.md +49 -0
- package/.synapos/squad-templates/produto/pipelines/steps/qf-04-registrar.md +35 -0
- package/.synapos/squad-templates/produto/pipelines/steps/qs-02-contexto.md +59 -0
- package/.synapos/squad-templates/produto/pipelines/steps/qs-03-spec.md +67 -0
- package/.synapos/squad-templates/produto/pipelines/steps/qs-05-handoff.md +49 -0
- package/.synapos/squad-templates/produto/pipelines/steps/rf-02-selecionar.md +66 -0
- package/.synapos/squad-templates/produto/pipelines/steps/rf-03-delta.md +73 -0
- package/.synapos/squad-templates/produto/pipelines/steps/rf-04-criar-versao.md +86 -0
- package/.synapos/squad-templates/produto/template.yaml +91 -0
- package/.synapos/squads/.gitkeep +0 -0
- package/README.md +285 -0
- package/bin/synapos.js +331 -0
- package/package.json +26 -0
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: testing-strategy
|
|
3
|
+
version: "1.0.0"
|
|
4
|
+
domain: [frontend, backend, fullstack, mobile]
|
|
5
|
+
whenToUse: "Quando o squad escreve ou define estratégia de testes"
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Estratégia de Testes
|
|
9
|
+
|
|
10
|
+
> Referência para definir cobertura, pirâmide de testes e abordagem por domínio.
|
|
11
|
+
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
## Pirâmide de Testes
|
|
15
|
+
|
|
16
|
+
```
|
|
17
|
+
/\
|
|
18
|
+
/ \
|
|
19
|
+
/ E2E \ ← Poucos, lentos, caros — validam fluxos críticos
|
|
20
|
+
/────────\
|
|
21
|
+
/Integration\ ← Médio volume — validam contratos e integrações reais
|
|
22
|
+
/──────────────\
|
|
23
|
+
/ Unit Tests \ ← Muitos, rápidos, baratos — validam lógica isolada
|
|
24
|
+
/──────────────────\
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
### Distribuição recomendada
|
|
28
|
+
|
|
29
|
+
| Nível | % do total | Foco |
|
|
30
|
+
|-------|-----------|------|
|
|
31
|
+
| Unit | 70% | Lógica pura, transformações, validações |
|
|
32
|
+
| Integration | 20% | Módulos integrados, banco de dados real, APIs internas |
|
|
33
|
+
| E2E | 10% | Fluxos críticos de negócio (login, checkout, onboarding) |
|
|
34
|
+
|
|
35
|
+
---
|
|
36
|
+
|
|
37
|
+
## Testes Unitários
|
|
38
|
+
|
|
39
|
+
### Quando usar
|
|
40
|
+
- Funções puras com lógica complexa
|
|
41
|
+
- Transformações e cálculos
|
|
42
|
+
- Validações de domínio
|
|
43
|
+
- Componentes de UI isolados (comportamento, não visual)
|
|
44
|
+
|
|
45
|
+
### Princípios
|
|
46
|
+
- Um teste = um comportamento
|
|
47
|
+
- Nomes descritivos: `deve retornar erro quando email é inválido`
|
|
48
|
+
- Estrutura **AAA**: Arrange → Act → Assert
|
|
49
|
+
- Sem dependências externas (use mocks para I/O)
|
|
50
|
+
|
|
51
|
+
### Exemplo (TypeScript / Vitest)
|
|
52
|
+
```typescript
|
|
53
|
+
describe('calcularDesconto', () => {
|
|
54
|
+
it('deve aplicar 10% para compras acima de R$100', () => {
|
|
55
|
+
// Arrange
|
|
56
|
+
const valor = 150
|
|
57
|
+
|
|
58
|
+
// Act
|
|
59
|
+
const resultado = calcularDesconto(valor)
|
|
60
|
+
|
|
61
|
+
// Assert
|
|
62
|
+
expect(resultado).toBe(135)
|
|
63
|
+
})
|
|
64
|
+
|
|
65
|
+
it('deve retornar valor original para compras abaixo de R$100', () => {
|
|
66
|
+
expect(calcularDesconto(80)).toBe(80)
|
|
67
|
+
})
|
|
68
|
+
})
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
---
|
|
72
|
+
|
|
73
|
+
## Testes de Integração
|
|
74
|
+
|
|
75
|
+
### Quando usar
|
|
76
|
+
- Endpoints de API (request → response completo)
|
|
77
|
+
- Queries ao banco de dados
|
|
78
|
+
- Integrações com serviços externos (mockados ou reais em ambiente de teste)
|
|
79
|
+
- Fluxos entre módulos do sistema
|
|
80
|
+
|
|
81
|
+
### Princípios
|
|
82
|
+
- Use banco de dados real em ambiente de teste (não mocks de DB)
|
|
83
|
+
- Isole o estado entre testes (truncate tables, transactions rollback)
|
|
84
|
+
- Teste o contrato (status code, formato da resposta, efeitos colaterais)
|
|
85
|
+
|
|
86
|
+
### Exemplo (supertest / Node.js)
|
|
87
|
+
```typescript
|
|
88
|
+
describe('POST /api/users', () => {
|
|
89
|
+
it('deve criar usuário e retornar 201 com id', async () => {
|
|
90
|
+
const response = await request(app)
|
|
91
|
+
.post('/api/users')
|
|
92
|
+
.send({ name: 'Ana', email: 'ana@test.com' })
|
|
93
|
+
|
|
94
|
+
expect(response.status).toBe(201)
|
|
95
|
+
expect(response.body).toMatchObject({
|
|
96
|
+
id: expect.any(String),
|
|
97
|
+
name: 'Ana',
|
|
98
|
+
email: 'ana@test.com',
|
|
99
|
+
})
|
|
100
|
+
})
|
|
101
|
+
|
|
102
|
+
it('deve retornar 400 quando email já existe', async () => {
|
|
103
|
+
await createUser({ email: 'ana@test.com' })
|
|
104
|
+
|
|
105
|
+
const response = await request(app)
|
|
106
|
+
.post('/api/users')
|
|
107
|
+
.send({ name: 'Ana 2', email: 'ana@test.com' })
|
|
108
|
+
|
|
109
|
+
expect(response.status).toBe(400)
|
|
110
|
+
expect(response.body.error).toMatch(/email já cadastrado/i)
|
|
111
|
+
})
|
|
112
|
+
})
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
---
|
|
116
|
+
|
|
117
|
+
## Testes de Contrato
|
|
118
|
+
|
|
119
|
+
> Garantem que produtor e consumidor de uma API concordam com o formato dos dados.
|
|
120
|
+
|
|
121
|
+
### Quando usar
|
|
122
|
+
- APIs consumidas por múltiplos clientes (mobile + web + parceiros)
|
|
123
|
+
- Microsserviços com contratos inter-serviço
|
|
124
|
+
- Quando mudanças de API têm alto impacto
|
|
125
|
+
|
|
126
|
+
### Ferramentas
|
|
127
|
+
- **Pact** — consumer-driven contract testing
|
|
128
|
+
- **OpenAPI + spectral** — validação de schema estático
|
|
129
|
+
- **Zod / io-ts** — validação de schema em runtime
|
|
130
|
+
|
|
131
|
+
### Estratégia mínima
|
|
132
|
+
1. Documente o contrato esperado (OpenAPI / JSON Schema)
|
|
133
|
+
2. Valide o contrato nos testes de integração
|
|
134
|
+
3. Versione o contrato junto com o código
|
|
135
|
+
|
|
136
|
+
---
|
|
137
|
+
|
|
138
|
+
## Testes E2E
|
|
139
|
+
|
|
140
|
+
### Quando usar
|
|
141
|
+
- Fluxos críticos de negócio (autenticação, pagamento, onboarding)
|
|
142
|
+
- Regressões de alto impacto
|
|
143
|
+
- Smoke tests em produção
|
|
144
|
+
|
|
145
|
+
### Princípios
|
|
146
|
+
- Teste comportamento do usuário, não implementação
|
|
147
|
+
- Use seletores semânticos (`getByRole`, `getByLabel`), nunca classes CSS
|
|
148
|
+
- Cada teste deve ser independente (sem compartilhar estado)
|
|
149
|
+
- Mantenha suíte pequena — E2E lento desincentiva uso
|
|
150
|
+
|
|
151
|
+
### Ferramentas
|
|
152
|
+
- **Playwright** — browser automation (recomendado)
|
|
153
|
+
- **Cypress** — alternativa popular para web
|
|
154
|
+
- **Detox** — testes E2E mobile (React Native)
|
|
155
|
+
|
|
156
|
+
---
|
|
157
|
+
|
|
158
|
+
## Cobertura de Código
|
|
159
|
+
|
|
160
|
+
### Metas por tipo de projeto
|
|
161
|
+
|
|
162
|
+
| Tipo | Cobertura mínima | Foco |
|
|
163
|
+
|------|-----------------|------|
|
|
164
|
+
| Biblioteca / SDK | 90%+ | Toda a superfície pública |
|
|
165
|
+
| API crítica (pagamentos, auth) | 85%+ | Caminho feliz + erros |
|
|
166
|
+
| Feature de produto | 70%+ | Lógica de negócio |
|
|
167
|
+
| Prototipagem / PoC | Sem meta | Valor sobre cobertura |
|
|
168
|
+
|
|
169
|
+
### Importante
|
|
170
|
+
- Cobertura alta ≠ qualidade de teste
|
|
171
|
+
- 80% com testes que validam comportamento real > 100% com testes triviais
|
|
172
|
+
- Foque em cobertura de **branches**, não só de linhas
|
|
173
|
+
|
|
174
|
+
---
|
|
175
|
+
|
|
176
|
+
## Testes de Frontend
|
|
177
|
+
|
|
178
|
+
### Componentes React (Testing Library)
|
|
179
|
+
```typescript
|
|
180
|
+
it('deve exibir mensagem de erro quando formulário é submetido vazio', async () => {
|
|
181
|
+
render(<LoginForm />)
|
|
182
|
+
|
|
183
|
+
await userEvent.click(screen.getByRole('button', { name: /entrar/i }))
|
|
184
|
+
|
|
185
|
+
expect(screen.getByText(/email obrigatório/i)).toBeInTheDocument()
|
|
186
|
+
})
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
### Princípios
|
|
190
|
+
- Teste comportamento visível ao usuário, não detalhes de implementação
|
|
191
|
+
- Evite testar state interno do componente
|
|
192
|
+
- Use `userEvent` em vez de `fireEvent` (mais realista)
|
|
193
|
+
- Não teste implementação de bibliotecas de terceiros
|
|
194
|
+
|
|
195
|
+
---
|
|
196
|
+
|
|
197
|
+
## O que NÃO testar
|
|
198
|
+
|
|
199
|
+
- Configuração de bibliotecas externas
|
|
200
|
+
- Código gerado automaticamente
|
|
201
|
+
- Simples getters/setters sem lógica
|
|
202
|
+
- Detalhes de implementação que podem mudar
|
|
203
|
+
|
|
204
|
+
---
|
|
205
|
+
|
|
206
|
+
## Ferramentas por Stack
|
|
207
|
+
|
|
208
|
+
| Stack | Unit | Integration | E2E |
|
|
209
|
+
|-------|------|-------------|-----|
|
|
210
|
+
| Node.js / TypeScript | Vitest / Jest | Supertest + Vitest | Playwright |
|
|
211
|
+
| React | Vitest + Testing Library | — | Playwright |
|
|
212
|
+
| React Native | Jest + RNTL | — | Detox |
|
|
213
|
+
| Python | pytest | pytest + SQLAlchemy | — |
|
|
@@ -0,0 +1,235 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: product-spec
|
|
3
|
+
version: "1.0.0"
|
|
4
|
+
domain: [produto]
|
|
5
|
+
whenToUse: "Quando o squad de produto escreve especificações"
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Product Spec
|
|
9
|
+
|
|
10
|
+
> Estrutura padrão para especificações de produto: do problema à solução pronta para desenvolvimento.
|
|
11
|
+
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
## Estrutura Completa
|
|
15
|
+
|
|
16
|
+
```
|
|
17
|
+
1. Contexto e Problema
|
|
18
|
+
2. Objetivo e Métricas de Sucesso
|
|
19
|
+
3. Usuários Afetados
|
|
20
|
+
4. Solução Proposta
|
|
21
|
+
5. Requisitos Funcionais
|
|
22
|
+
6. Requisitos Não Funcionais
|
|
23
|
+
7. Critérios de Aceite
|
|
24
|
+
8. Casos de Borda
|
|
25
|
+
9. Fora de Escopo
|
|
26
|
+
10. Dependências e Riscos
|
|
27
|
+
11. Open Questions
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
---
|
|
31
|
+
|
|
32
|
+
## 1. Contexto e Problema
|
|
33
|
+
|
|
34
|
+
Responda:
|
|
35
|
+
- **Situação atual**: como o usuário resolve esse problema hoje?
|
|
36
|
+
- **Problema**: o que está errado ou faltando?
|
|
37
|
+
- **Evidência**: dados, feedback de usuários, suporte, analytics
|
|
38
|
+
|
|
39
|
+
```markdown
|
|
40
|
+
## Contexto e Problema
|
|
41
|
+
|
|
42
|
+
Usuários que esquecem a senha precisam contatar o suporte via email,
|
|
43
|
+
o que gera ~200 tickets/mês e demora em média 4h para resolução.
|
|
44
|
+
|
|
45
|
+
**Evidência:**
|
|
46
|
+
- 200 tickets/mês de reset de senha (12% do total de suporte)
|
|
47
|
+
- NPS de usuários que passaram pelo suporte: 28 (vs 72 geral)
|
|
48
|
+
- Churn de 15% dos usuários que esperaram mais de 2h
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
---
|
|
52
|
+
|
|
53
|
+
## 2. Objetivo e Métricas de Sucesso
|
|
54
|
+
|
|
55
|
+
### Formato OKR mínimo
|
|
56
|
+
|
|
57
|
+
```markdown
|
|
58
|
+
## Objetivo
|
|
59
|
+
Permitir que usuários recuperem acesso à conta sem intervenção humana.
|
|
60
|
+
|
|
61
|
+
## Métricas de Sucesso (3 meses após lançamento)
|
|
62
|
+
- Tickets de reset de senha: reduzir de 200 para < 20/mês
|
|
63
|
+
- Tempo médio de recuperação de conta: de 4h para < 5min
|
|
64
|
+
- NPS de usuários que usaram o fluxo: > 60
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
---
|
|
68
|
+
|
|
69
|
+
## 3. Usuários Afetados
|
|
70
|
+
|
|
71
|
+
```markdown
|
|
72
|
+
## Personas Afetadas
|
|
73
|
+
|
|
74
|
+
**Primária: Ana — usuária casual**
|
|
75
|
+
- Acessa o app 1–2x por semana
|
|
76
|
+
- Frequentemente esquece senhas
|
|
77
|
+
- Baixa tolerância a fricção no login
|
|
78
|
+
|
|
79
|
+
**Secundária: Carlos — usuário enterprise**
|
|
80
|
+
- Gerencia 5 contas diferentes
|
|
81
|
+
- Prefere segurança à conveniência
|
|
82
|
+
- Usa autenticador 2FA
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
---
|
|
86
|
+
|
|
87
|
+
## 4. Solução Proposta
|
|
88
|
+
|
|
89
|
+
Descreva **o quê**, não o **como** (evite detalhes de implementação nesta seção).
|
|
90
|
+
|
|
91
|
+
```markdown
|
|
92
|
+
## Solução
|
|
93
|
+
|
|
94
|
+
Fluxo self-service de recuperação de senha via email:
|
|
95
|
+
|
|
96
|
+
1. Usuário clica em "Esqueci minha senha" na tela de login
|
|
97
|
+
2. Informa o email cadastrado
|
|
98
|
+
3. Recebe link de redefinição válido por 30 minutos
|
|
99
|
+
4. Define nova senha e é autenticado automaticamente
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
Inclua wireframes ou referências visuais quando disponíveis.
|
|
103
|
+
|
|
104
|
+
---
|
|
105
|
+
|
|
106
|
+
## 5. Requisitos Funcionais
|
|
107
|
+
|
|
108
|
+
Liste **o que o sistema deve fazer**, não como:
|
|
109
|
+
|
|
110
|
+
```markdown
|
|
111
|
+
## Requisitos Funcionais
|
|
112
|
+
|
|
113
|
+
RF-01: O sistema deve enviar email de recuperação para o endereço cadastrado
|
|
114
|
+
RF-02: O link de recuperação deve expirar em 30 minutos
|
|
115
|
+
RF-03: Um link usado não pode ser reutilizado
|
|
116
|
+
RF-04: O usuário deve ser autenticado automaticamente após redefinir a senha
|
|
117
|
+
RF-05: O sistema deve mostrar indicador de força de senha durante a redefinição
|
|
118
|
+
RF-06: O sistema deve bloquear tentativas após 5 links enviados em 1 hora
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
---
|
|
122
|
+
|
|
123
|
+
## 6. Requisitos Não Funcionais
|
|
124
|
+
|
|
125
|
+
```markdown
|
|
126
|
+
## Requisitos Não Funcionais
|
|
127
|
+
|
|
128
|
+
RNF-01: Email entregue em até 60 segundos (p95)
|
|
129
|
+
RNF-02: Fluxo completo acessível (WCAG 2.1 AA)
|
|
130
|
+
RNF-03: Links de recuperação com token criptograficamente seguro (min 32 bytes)
|
|
131
|
+
RNF-04: Sem exposição de informação sobre existência de email no sistema
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
---
|
|
135
|
+
|
|
136
|
+
## 7. Critérios de Aceite
|
|
137
|
+
|
|
138
|
+
Formato: **Dado** [contexto], **quando** [ação], **então** [resultado esperado].
|
|
139
|
+
|
|
140
|
+
```markdown
|
|
141
|
+
## Critérios de Aceite
|
|
142
|
+
|
|
143
|
+
**CA-01:** Dado usuário com email cadastrado,
|
|
144
|
+
quando solicitar recuperação de senha,
|
|
145
|
+
então deve receber email com link em até 60s.
|
|
146
|
+
|
|
147
|
+
**CA-02:** Dado link de recuperação gerado,
|
|
148
|
+
quando acessado após 30 minutos,
|
|
149
|
+
então deve exibir mensagem "link expirado" e oferecer gerar novo.
|
|
150
|
+
|
|
151
|
+
**CA-03:** Dado link de recuperação válido já utilizado,
|
|
152
|
+
quando acessado novamente,
|
|
153
|
+
então deve exibir mensagem "link já utilizado".
|
|
154
|
+
|
|
155
|
+
**CA-04:** Dado email não cadastrado no sistema,
|
|
156
|
+
quando usuário solicitar recuperação,
|
|
157
|
+
então deve exibir mensagem genérica sem confirmar ou negar existência do email.
|
|
158
|
+
|
|
159
|
+
**CA-05:** Dado usuário que tentou 5x em 1 hora,
|
|
160
|
+
quando tentar solicitar nova recuperação,
|
|
161
|
+
então deve ser bloqueado por 60 minutos com mensagem informativa.
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
---
|
|
165
|
+
|
|
166
|
+
## 8. Casos de Borda
|
|
167
|
+
|
|
168
|
+
Itens que precisam de comportamento definido, mas não são o caminho principal:
|
|
169
|
+
|
|
170
|
+
```markdown
|
|
171
|
+
## Casos de Borda
|
|
172
|
+
|
|
173
|
+
- Email digitado com espaços ou letras maiúsculas → normalizar antes de buscar
|
|
174
|
+
- Usuário clica no link em dispositivo diferente do que solicitou → permitido
|
|
175
|
+
- Usuário solicita 2 links em sequência → apenas o mais recente deve ser válido
|
|
176
|
+
- Email do usuário mudou desde o cadastro → usar email atual cadastrado no sistema
|
|
177
|
+
- Conta desativada/bloqueada → não enviar email, exibir mensagem de suporte
|
|
178
|
+
- Domínio de email com ponto extra (usuario@gmail..com) → validar formato antes de enviar
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
---
|
|
182
|
+
|
|
183
|
+
## 9. Fora de Escopo
|
|
184
|
+
|
|
185
|
+
Deixe explícito o que **não** está incluído para alinhar expectativas:
|
|
186
|
+
|
|
187
|
+
```markdown
|
|
188
|
+
## Fora de Escopo (v1)
|
|
189
|
+
|
|
190
|
+
- Recuperação via SMS / WhatsApp (próxima versão)
|
|
191
|
+
- Autenticação biométrica como fallback
|
|
192
|
+
- Histórico de senhas anteriores
|
|
193
|
+
- Notificação de segurança por email ao alterar senha
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
---
|
|
197
|
+
|
|
198
|
+
## 10. Dependências e Riscos
|
|
199
|
+
|
|
200
|
+
```markdown
|
|
201
|
+
## Dependências
|
|
202
|
+
- Serviço de email (SendGrid) deve estar configurado para o novo template
|
|
203
|
+
- Backend precisa de nova tabela `password_reset_tokens`
|
|
204
|
+
- Design system: componente de "força de senha" ainda não existe
|
|
205
|
+
|
|
206
|
+
## Riscos
|
|
207
|
+
| Risco | Probabilidade | Impacto | Mitigação |
|
|
208
|
+
|-------|--------------|---------|-----------|
|
|
209
|
+
| Emails caindo em spam | Média | Alto | Configurar SPF/DKIM antes do lançamento |
|
|
210
|
+
| Rate limit insuficiente (abuse) | Baixa | Médio | Monitorar nas primeiras 2 semanas |
|
|
211
|
+
```
|
|
212
|
+
|
|
213
|
+
---
|
|
214
|
+
|
|
215
|
+
## 11. Open Questions
|
|
216
|
+
|
|
217
|
+
```markdown
|
|
218
|
+
## Open Questions
|
|
219
|
+
|
|
220
|
+
- [ ] Devemos notificar o usuário por email quando a senha for alterada com sucesso? (segurança vs ruído)
|
|
221
|
+
- [ ] Qual o comportamento para usuários que fazem login via Google OAuth? (não têm senha cadastrada)
|
|
222
|
+
- [ ] Precisamos de log de auditoria dos resets? (compliance)
|
|
223
|
+
```
|
|
224
|
+
|
|
225
|
+
---
|
|
226
|
+
|
|
227
|
+
## Checklist Antes de Enviar para Dev
|
|
228
|
+
|
|
229
|
+
- [ ] Critérios de aceite cobrem o caminho feliz?
|
|
230
|
+
- [ ] Casos de borda mapeados e com comportamento definido?
|
|
231
|
+
- [ ] "Fora de escopo" explícito para evitar scope creep?
|
|
232
|
+
- [ ] Métricas de sucesso são mensuráveis?
|
|
233
|
+
- [ ] Open questions resolvidas ou com responsável definido?
|
|
234
|
+
- [ ] Design (wireframe/protótipo) linkado ou anexado?
|
|
235
|
+
- [ ] Revisado por alguém de eng antes de enviar?
|
|
@@ -0,0 +1,264 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: technical-writing
|
|
3
|
+
version: "1.0.0"
|
|
4
|
+
domain: [produto, backend, frontend]
|
|
5
|
+
whenToUse: "Quando o squad produz documentação técnica ou de produto"
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Technical Writing
|
|
9
|
+
|
|
10
|
+
> Guia para escrever ADRs, decisions logs, handoffs e documentação técnica com clareza e estrutura.
|
|
11
|
+
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
## Princípios
|
|
15
|
+
|
|
16
|
+
- **Escreva para o leitor futuro** — você em 6 meses, novo membro do time, outro squad
|
|
17
|
+
- **Contexto antes de decisão** — explique o problema antes de apresentar a solução
|
|
18
|
+
- **Registre o que foi rejeitado** — alternativas descartadas são tão valiosas quanto a escolha feita
|
|
19
|
+
- **Documentação boa é manutenível** — curta e atualizada > longa e desatualizada
|
|
20
|
+
- **Estrutura facilita leitura** — use headers, listas e tabelas em vez de parágrafos densos
|
|
21
|
+
|
|
22
|
+
---
|
|
23
|
+
|
|
24
|
+
## ADR — Architecture Decision Record
|
|
25
|
+
|
|
26
|
+
> Registra decisões arquiteturais significativas: contexto, opções consideradas e escolha feita.
|
|
27
|
+
|
|
28
|
+
### Quando escrever
|
|
29
|
+
- Mudança de stack ou biblioteca principal
|
|
30
|
+
- Decisão de design de API ou banco de dados
|
|
31
|
+
- Escolha de padrão arquitetural (ex: monolito → microsserviços)
|
|
32
|
+
- Qualquer decisão que você terá que explicar para novos membros
|
|
33
|
+
|
|
34
|
+
### Template
|
|
35
|
+
|
|
36
|
+
```markdown
|
|
37
|
+
# ADR-{NNN}: {Título da Decisão}
|
|
38
|
+
|
|
39
|
+
**Data:** YYYY-MM-DD
|
|
40
|
+
**Status:** Proposto | Aceito | Deprecado | Substituído por ADR-XXX
|
|
41
|
+
**Decisores:** {nomes ou times envolvidos}
|
|
42
|
+
|
|
43
|
+
## Contexto
|
|
44
|
+
|
|
45
|
+
{Descreva o problema ou situação que forçou essa decisão.
|
|
46
|
+
Inclua restrições técnicas, de negócio ou de time.}
|
|
47
|
+
|
|
48
|
+
## Opções Consideradas
|
|
49
|
+
|
|
50
|
+
### Opção 1: {nome}
|
|
51
|
+
**Prós:** ...
|
|
52
|
+
**Contras:** ...
|
|
53
|
+
|
|
54
|
+
### Opção 2: {nome}
|
|
55
|
+
**Prós:** ...
|
|
56
|
+
**Contras:** ...
|
|
57
|
+
|
|
58
|
+
### Opção 3: {nome}
|
|
59
|
+
**Prós:** ...
|
|
60
|
+
**Contras:** ...
|
|
61
|
+
|
|
62
|
+
## Decisão
|
|
63
|
+
|
|
64
|
+
Escolhemos a **Opção {N}** porque {justificativa principal}.
|
|
65
|
+
|
|
66
|
+
## Consequências
|
|
67
|
+
|
|
68
|
+
**Positivas:**
|
|
69
|
+
- ...
|
|
70
|
+
|
|
71
|
+
**Negativas / Trade-offs:**
|
|
72
|
+
- ...
|
|
73
|
+
|
|
74
|
+
**Neutras:**
|
|
75
|
+
- ...
|
|
76
|
+
|
|
77
|
+
## Notas
|
|
78
|
+
|
|
79
|
+
{Referências, links, discussões relacionadas}
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
### Exemplo Real
|
|
83
|
+
|
|
84
|
+
```markdown
|
|
85
|
+
# ADR-003: Adotar PostgreSQL em vez de MongoDB
|
|
86
|
+
|
|
87
|
+
**Data:** 2026-03-23
|
|
88
|
+
**Status:** Aceito
|
|
89
|
+
**Decisores:** Time de Backend, CTO
|
|
90
|
+
|
|
91
|
+
## Contexto
|
|
92
|
+
|
|
93
|
+
Nossa estrutura de dados para transações financeiras tem relacionamentos
|
|
94
|
+
complexos entre usuários, cobranças e pagamentos. O schema variável do
|
|
95
|
+
MongoDB está causando inconsistências de dados em produção e dificultando
|
|
96
|
+
queries de relatório.
|
|
97
|
+
|
|
98
|
+
## Opções Consideradas
|
|
99
|
+
|
|
100
|
+
### Opção 1: PostgreSQL
|
|
101
|
+
**Prós:** Transações ACID, joins eficientes, schema estrito evita dados inconsistentes
|
|
102
|
+
**Contras:** Migração de dados existentes, curva de aprendizado para queries complexas
|
|
103
|
+
|
|
104
|
+
### Opção 2: Manter MongoDB com schema validation
|
|
105
|
+
**Prós:** Zero migração, time já conhece
|
|
106
|
+
**Contras:** Validação fraca, joins custosos via $lookup, histórico de inconsistências
|
|
107
|
+
|
|
108
|
+
## Decisão
|
|
109
|
+
|
|
110
|
+
Escolhemos **PostgreSQL** porque a consistência de dados é crítica para
|
|
111
|
+
produto financeiro e os problemas atuais com MongoDB são estruturais, não operacionais.
|
|
112
|
+
|
|
113
|
+
## Consequências
|
|
114
|
+
|
|
115
|
+
**Positivas:** Queries de relatório 10x mais simples, zero inconsistências de schema
|
|
116
|
+
**Negativas:** 2 semanas de migração, 1 sprint de adaptação do time
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
---
|
|
120
|
+
|
|
121
|
+
## Decisions Log
|
|
122
|
+
|
|
123
|
+
> Registro contínuo de decisões do dia a dia — menos formal que ADR, mais rastreável que Slack.
|
|
124
|
+
|
|
125
|
+
### Quando usar
|
|
126
|
+
- Decisões de product que não chegam a ser ADR
|
|
127
|
+
- Mudanças de escopo, priorização, trade-offs aceitos
|
|
128
|
+
- Qualquer "por que fizemos assim?"
|
|
129
|
+
|
|
130
|
+
### Template
|
|
131
|
+
|
|
132
|
+
```markdown
|
|
133
|
+
# Decisions Log — {Squad ou Projeto}
|
|
134
|
+
|
|
135
|
+
---
|
|
136
|
+
|
|
137
|
+
## {YYYY-MM-DD} — {Título da decisão}
|
|
138
|
+
|
|
139
|
+
**Decidido por:** {nome(s)}
|
|
140
|
+
**Contexto:** {1–3 linhas do problema}
|
|
141
|
+
**Decisão:** {o que foi decidido}
|
|
142
|
+
**Motivo:** {por que essa opção}
|
|
143
|
+
**Trade-off aceito:** {o que deixamos de fora ou comprometemos}
|
|
144
|
+
**Revisão:** {quando reavaliar, se aplicável}
|
|
145
|
+
|
|
146
|
+
---
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
### Exemplo
|
|
150
|
+
|
|
151
|
+
```markdown
|
|
152
|
+
## 2026-03-23 — Lançar sem notificação por SMS na v1
|
|
153
|
+
|
|
154
|
+
**Decidido por:** Priscila (PM), Bruno (Tech Lead)
|
|
155
|
+
**Contexto:** SMS aumentaria cobertura para usuários sem acesso estável a email,
|
|
156
|
+
mas o provedor de SMS custa R$0,15/msg e precisamos validar adoção primeiro.
|
|
157
|
+
**Decisão:** Lançar v1 apenas com email. SMS entra no roadmap para v1.2.
|
|
158
|
+
**Motivo:** Reduzir custo operacional antes de validar demanda real.
|
|
159
|
+
**Trade-off aceito:** Usuários sem acesso a email não serão atendidos nesta versão.
|
|
160
|
+
**Revisão:** Após 90 dias — avaliar volume de tickets pedindo SMS.
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
---
|
|
164
|
+
|
|
165
|
+
## Handoff Document
|
|
166
|
+
|
|
167
|
+
> Transfere contexto de um squad para o próximo (dev, QA, suporte, outro time).
|
|
168
|
+
|
|
169
|
+
### Estrutura
|
|
170
|
+
|
|
171
|
+
```markdown
|
|
172
|
+
# Handoff — {Feature ou Projeto}
|
|
173
|
+
|
|
174
|
+
**Data:** YYYY-MM-DD
|
|
175
|
+
**De:** {squad / pessoa}
|
|
176
|
+
**Para:** {squad / pessoa}
|
|
177
|
+
**Versão:** {versão que está sendo entregue}
|
|
178
|
+
|
|
179
|
+
## O que foi construído
|
|
180
|
+
|
|
181
|
+
{Descrição clara e objetiva da feature ou sistema entregue}
|
|
182
|
+
|
|
183
|
+
## Como funciona
|
|
184
|
+
|
|
185
|
+
{Fluxo principal em passos ou diagrama}
|
|
186
|
+
|
|
187
|
+
## Onde está
|
|
188
|
+
|
|
189
|
+
| Artefato | Localização |
|
|
190
|
+
|----------|-------------|
|
|
191
|
+
| Código | {link ou path} |
|
|
192
|
+
| Deploy | {ambiente, URL} |
|
|
193
|
+
| Documentação | {link} |
|
|
194
|
+
| Designs | {link Figma} |
|
|
195
|
+
|
|
196
|
+
## O que testar (QA Checklist)
|
|
197
|
+
|
|
198
|
+
- [ ] Caminho feliz: {descrever}
|
|
199
|
+
- [ ] Casos de erro: {descrever}
|
|
200
|
+
- [ ] Casos de borda: {listar}
|
|
201
|
+
|
|
202
|
+
## Configurações necessárias
|
|
203
|
+
|
|
204
|
+
{Env vars, feature flags, permissões, dependências externas}
|
|
205
|
+
|
|
206
|
+
## Limitações conhecidas
|
|
207
|
+
|
|
208
|
+
{Bugs conhecidos, débito técnico aceito, limitações de escopo}
|
|
209
|
+
|
|
210
|
+
## Open Questions / Próximos passos
|
|
211
|
+
|
|
212
|
+
- [ ] {item não resolvido com responsável}
|
|
213
|
+
```
|
|
214
|
+
|
|
215
|
+
---
|
|
216
|
+
|
|
217
|
+
## Clareza e Estrutura
|
|
218
|
+
|
|
219
|
+
### Escrita objetiva
|
|
220
|
+
|
|
221
|
+
```markdown
|
|
222
|
+
❌ "O sistema foi desenvolvido de forma a possibilitar que os usuários
|
|
223
|
+
possam realizar a recuperação de suas senhas de acesso através de
|
|
224
|
+
um processo automatizado via email."
|
|
225
|
+
|
|
226
|
+
✅ "Usuários podem redefinir a senha via email sem interação do suporte."
|
|
227
|
+
```
|
|
228
|
+
|
|
229
|
+
### Use estrutura visual
|
|
230
|
+
|
|
231
|
+
```markdown
|
|
232
|
+
❌ "A feature tem três estados possíveis: ativo que significa que está
|
|
233
|
+
funcionando normalmente, pausado que significa que foi suspenso
|
|
234
|
+
temporariamente e inativo que foi encerrado."
|
|
235
|
+
|
|
236
|
+
✅ **Estados da feature:**
|
|
237
|
+
- **Ativo** — funcionando normalmente
|
|
238
|
+
- **Pausado** — suspenso temporariamente
|
|
239
|
+
- **Inativo** — encerrado
|
|
240
|
+
```
|
|
241
|
+
|
|
242
|
+
### Hierarquia de headers
|
|
243
|
+
|
|
244
|
+
```
|
|
245
|
+
# Título do documento
|
|
246
|
+
## Seção principal
|
|
247
|
+
### Subseção
|
|
248
|
+
#### Detalhe (usar com moderação)
|
|
249
|
+
```
|
|
250
|
+
|
|
251
|
+
---
|
|
252
|
+
|
|
253
|
+
## Checklist de Qualidade
|
|
254
|
+
|
|
255
|
+
Antes de entregar qualquer documento técnico:
|
|
256
|
+
|
|
257
|
+
- [ ] O problema está claro antes da solução?
|
|
258
|
+
- [ ] O documento responde "por quê", não só "o quê"?
|
|
259
|
+
- [ ] Alternativas rejeitadas estão documentadas?
|
|
260
|
+
- [ ] Está escrito para o leitor certo (eng? produto? suporte?)?
|
|
261
|
+
- [ ] Sem jargão não explicado para o público-alvo?
|
|
262
|
+
- [ ] Links e referências funcionam?
|
|
263
|
+
- [ ] Data e autoria registrados?
|
|
264
|
+
- [ ] Precisa de revisão por outra pessoa antes de publicar?
|