specifica-br 1.2.2 → 1.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/README.md +114 -44
- package/dist/boilerplate/commands/executar-task.md +133 -0
- package/dist/boilerplate/commands/gerar-contexto.md +1462 -0
- package/dist/boilerplate/commands/gerar-prd.md +289 -0
- package/dist/boilerplate/commands/gerar-tasks.md +168 -0
- package/dist/boilerplate/commands/gerar-techspec.md +1467 -0
- package/dist/boilerplate/commands/gerar-visao.md +731 -0
- package/dist/boilerplate/commands/realizar-codereview.md +288 -0
- package/dist/boilerplate/opencode-commands/executar-task.md +55 -48
- package/dist/boilerplate/opencode-commands/gerar-contexto.md +1462 -0
- package/dist/boilerplate/opencode-commands/gerar-prd.md +232 -40
- package/dist/boilerplate/opencode-commands/gerar-tasks.md +112 -31
- package/dist/boilerplate/opencode-commands/gerar-techspec.md +1464 -80
- package/dist/boilerplate/opencode-commands/gerar-visao.md +731 -0
- package/dist/boilerplate/opencode-commands/realizar-codereview.md +288 -0
- package/dist/boilerplate/skills/product-manager/SKILL.md +32 -0
- package/dist/boilerplate/skills/techspec-generator/SKILL.md +489 -0
- package/dist/boilerplate/skills/techspec-generator/references/api-contracts.md +421 -0
- package/dist/boilerplate/skills/techspec-generator/references/architecture-patterns.md +316 -0
- package/dist/boilerplate/skills/techspec-generator/references/database-modeling.md +436 -0
- package/dist/boilerplate/skills/techspec-generator/references/observability-testing.md +436 -0
- package/dist/boilerplate/skills/techspec-generator/references/security-hardening.md +238 -0
- package/dist/boilerplate/skills/techspec-generator/references/ux-ui-accessibility.md +511 -0
- package/dist/boilerplate/specs-templates/architecture-template.md +736 -0
- package/dist/boilerplate/specs-templates/codereview-template.md +95 -0
- package/dist/boilerplate/specs-templates/prd-template.md +101 -19
- package/dist/boilerplate/specs-templates/product_vision-template.md +284 -0
- package/dist/boilerplate/specs-templates/task-template.md +64 -18
- package/dist/boilerplate/specs-templates/tasks-template.md +12 -4
- package/dist/boilerplate/specs-templates/techspec-template.md +1227 -89
- package/dist/boilerplate/templates/architecture-template.md +736 -0
- package/dist/boilerplate/templates/codereview-template.md +95 -0
- package/dist/boilerplate/templates/prd-template.md +167 -0
- package/dist/boilerplate/templates/product_vision-template.md +284 -0
- package/dist/boilerplate/templates/task-template.md +169 -0
- package/dist/boilerplate/templates/tasks-template.md +15 -0
- package/dist/boilerplate/templates/techspec-template.md +1306 -0
- package/dist/commands/help.js +33 -11
- package/dist/commands/init.js +39 -43
- package/dist/tools-mapping.json +32 -0
- package/dist/types/init.d.ts +14 -17
- package/dist/utils/file-service.d.ts +5 -3
- package/dist/utils/file-service.js +168 -56
- package/dist/utils/message-formatter.d.ts +2 -1
- package/dist/utils/message-formatter.js +39 -22
- package/package.json +1 -1
|
@@ -0,0 +1,436 @@
|
|
|
1
|
+
# Observabilidade e Testes
|
|
2
|
+
|
|
3
|
+
Referência técnica para logging, métricas, tracing e estratégia de testes ao gerar Tech Specs.
|
|
4
|
+
|
|
5
|
+
## Sumário
|
|
6
|
+
|
|
7
|
+
1. [Logging Estruturado](#1-logging-estruturado)
|
|
8
|
+
2. [Métricas](#2-metricas)
|
|
9
|
+
3. [Distributed Tracing](#3-distributed-tracing)
|
|
10
|
+
4. [Estratégia de Testes](#4-estrategia-de-testes)
|
|
11
|
+
5. [Testes por Camada](#5-testes-por-camada)
|
|
12
|
+
6. [Dados de Teste](#6-dados-de-teste)
|
|
13
|
+
7. [Checklist de Observabilidade](#7-checklist-de-observabilidade)
|
|
14
|
+
8. [Checklist de Testes](#8-checklist-de-testes)
|
|
15
|
+
|
|
16
|
+
---
|
|
17
|
+
|
|
18
|
+
## 1. Logging Estruturado
|
|
19
|
+
|
|
20
|
+
### 1.1. Níveis de Log
|
|
21
|
+
|
|
22
|
+
| Nível | Quando usar | Exemplo |
|
|
23
|
+
|:---|:---|:---|
|
|
24
|
+
| **ERROR** | Falha que afeta o usuário ou dados | Pagamento rejeitado, DB indisponível |
|
|
25
|
+
| **WARN** | Situação inesperada, recuperável | Retry com sucesso, estoque baixo |
|
|
26
|
+
| **INFO** | Evento de negócio significativo | Pedido criado, usuário registrado |
|
|
27
|
+
| **DEBUG** | Informação de depuração (desligar em prod) | Query executada, payload recebido |
|
|
28
|
+
|
|
29
|
+
### 1.2. Contexto Obrigatório
|
|
30
|
+
|
|
31
|
+
Todo log deve incluir:
|
|
32
|
+
```
|
|
33
|
+
{
|
|
34
|
+
"timestamp": "2024-03-01T10:00:00.000Z",
|
|
35
|
+
"level": "INFO",
|
|
36
|
+
"message": "Order created successfully",
|
|
37
|
+
"context": {
|
|
38
|
+
"orderId": "uuid",
|
|
39
|
+
"customerId": "uuid",
|
|
40
|
+
"totalAmount": 99.99,
|
|
41
|
+
"correlationId": "uuid"
|
|
42
|
+
},
|
|
43
|
+
"service": "order-service",
|
|
44
|
+
"environment": "production",
|
|
45
|
+
"version": "1.2.0"
|
|
46
|
+
}
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
### 1.3. Padrões de Log por Evento
|
|
50
|
+
|
|
51
|
+
**Criação de recurso (sucesso):**
|
|
52
|
+
```
|
|
53
|
+
Level: INFO
|
|
54
|
+
Message: "Order created successfully"
|
|
55
|
+
Context: { orderId, customerId, totalAmount, itemCount, correlationId }
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
**Falha de processamento:**
|
|
59
|
+
```
|
|
60
|
+
Level: ERROR
|
|
61
|
+
Message: "Payment processing failed"
|
|
62
|
+
Context: { orderId, paymentId, errorCode, errorMessage, correlationId }
|
|
63
|
+
NUNCA: { creditCardNumber, cvv, password }
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
**Retry:**
|
|
67
|
+
```
|
|
68
|
+
Level: WARN
|
|
69
|
+
Message: "Retrying payment processing (attempt 2/3)"
|
|
70
|
+
Context: { orderId, attempt, backoffMs, correlationId }
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
**Performance:**
|
|
74
|
+
```
|
|
75
|
+
Level: INFO
|
|
76
|
+
Message: "Slow query detected"
|
|
77
|
+
Context: { query, durationMs, threshold, correlationId }
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
### 1.4. Dados Sensíveis - NUNCA Logar
|
|
81
|
+
|
|
82
|
+
| Dado | Log como | Exemplo |
|
|
83
|
+
|:---|:---|:---|
|
|
84
|
+
| Password | NÃO logar | - |
|
|
85
|
+
| Token JWT | NÃO logar | - |
|
|
86
|
+
| CPF | Mascaraar | "***.***.***-**" |
|
|
87
|
+
| Email | Mascarar | "j***@example.com" |
|
|
88
|
+
| Cartão | NÃO logar | - |
|
|
89
|
+
| API Key | NÃO logar | - |
|
|
90
|
+
|
|
91
|
+
---
|
|
92
|
+
|
|
93
|
+
## 2. Métricas
|
|
94
|
+
|
|
95
|
+
### 2.1. Frameworks RED e USE
|
|
96
|
+
|
|
97
|
+
**RED (para services/requests):**
|
|
98
|
+
| Métrica | Tipo | Descrição |
|
|
99
|
+
|:---|:---|:---|
|
|
100
|
+
| **Rate** | Counter | Requests por segundo |
|
|
101
|
+
| **Errors** | Counter | Taxa de erros |
|
|
102
|
+
| **Duration** | Histogram | Distribuição de latência |
|
|
103
|
+
|
|
104
|
+
**USE (para recursos):**
|
|
105
|
+
| Métrica | Tipo | Descrição |
|
|
106
|
+
|:---|:---|:---|
|
|
107
|
+
| **Utilization** | Gauge | % de uso do recurso |
|
|
108
|
+
| **Saturation** | Gauge | Fila/espera do recurso |
|
|
109
|
+
| **Errors** | Counter | Erros do recurso |
|
|
110
|
+
|
|
111
|
+
### 2.2. Métricas por Feature
|
|
112
|
+
|
|
113
|
+
**Para APIs/Endpoints:**
|
|
114
|
+
```
|
|
115
|
+
- orders_created_total (Counter): Total de pedidos criados
|
|
116
|
+
- orders_failed_total (Counter): Total de pedidos que falharam (by reason)
|
|
117
|
+
- order_creation_duration_seconds (Histogram): Tempo de criação do pedido
|
|
118
|
+
- order_amount_histogram (Histogram): Distribuição de valores de pedidos
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
**Para Processamento Assíncrono:**
|
|
122
|
+
```
|
|
123
|
+
- payment_processing_duration_seconds (Histogram): Tempo de processamento
|
|
124
|
+
- payment_queue_depth (Gauge): Mensagens na fila de pagamento
|
|
125
|
+
- payment_retry_total (Counter): Total de retries de pagamento
|
|
126
|
+
- payment_dead_letter_total (Counter): Mensagens na dead letter queue
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
**Para Banco de Dados:**
|
|
130
|
+
```
|
|
131
|
+
- db_query_duration_seconds (Histogram): Tempo de queries (by operation)
|
|
132
|
+
- db_connection_pool_active (Gauge): Conexões ativas
|
|
133
|
+
- db_connection_pool_idle (Gauge): Conexões idle
|
|
134
|
+
- db_query_errors_total (Counter): Erros de query (by type)
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
### 2.3. Nomenclatura
|
|
138
|
+
|
|
139
|
+
**Formato:** `{namespace}_{subsystem}_{metric_name}_{unit}`
|
|
140
|
+
|
|
141
|
+
```
|
|
142
|
+
orders_creation_duration_seconds
|
|
143
|
+
payments_processing_errors_total
|
|
144
|
+
inventory_stock_level_current
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
**Labels úteis:**
|
|
148
|
+
```
|
|
149
|
+
orders_created_total{ status="success" | "failed" }
|
|
150
|
+
payment_duration_seconds{ gateway="stripe" | "pagarme" }
|
|
151
|
+
api_request_duration_seconds{ method="GET", path="/api/v1/orders", status="200" }
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
### 2.4. Alertas
|
|
155
|
+
|
|
156
|
+
Na TechSpec, definir alertas críticos:
|
|
157
|
+
|
|
158
|
+
```
|
|
159
|
+
Alertas:
|
|
160
|
+
- Error rate > 5% por 5 minutos → PagerDuty (critical)
|
|
161
|
+
- Latência p99 > 2s por 5 minutos → Slack (warning)
|
|
162
|
+
- Queue depth > 1000 por 10 minutos → Slack (warning)
|
|
163
|
+
- DB connection pool > 80% → Slack (warning)
|
|
164
|
+
- Payment success rate < 95% → PagerDuty (critical)
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
---
|
|
168
|
+
|
|
169
|
+
## 3. Distributed Tracing
|
|
170
|
+
|
|
171
|
+
### 3.1. Correlation ID
|
|
172
|
+
|
|
173
|
+
**Obrigatório para:**
|
|
174
|
+
- Todas as APIs (inbound request → response)
|
|
175
|
+
- Todas as mensagens/events (publish → consume)
|
|
176
|
+
- Todas as chamadas a serviços externos
|
|
177
|
+
- Todos os logs
|
|
178
|
+
|
|
179
|
+
**Implementação:**
|
|
180
|
+
```
|
|
181
|
+
1. Gerar correlationId no entry point (API gateway / controller)
|
|
182
|
+
2. Propagar via header: X-Request-Id ou X-Correlation-Id
|
|
183
|
+
3. Incluir em todos os logs
|
|
184
|
+
4. Incluir em respostas de erro (para suporte)
|
|
185
|
+
5. Propagar para mensagens/events
|
|
186
|
+
6. Propagar para chamadas externas
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
### 3.2. Na TechSpec
|
|
190
|
+
|
|
191
|
+
```
|
|
192
|
+
Tracing:
|
|
193
|
+
- Correlation ID: UUID v4 gerado no controller/middleware
|
|
194
|
+
- Header: X-Request-Id (inbound), X-Correlation-Id (outbound)
|
|
195
|
+
- Propagação: Todos os logs, eventos, chamadas externas
|
|
196
|
+
- Error response: Incluir requestId no body (para suporte)
|
|
197
|
+
- Framework: OpenTelemetry (se configurado) ou manual
|
|
198
|
+
|
|
199
|
+
Span Tree (exemplo para criação de pedido):
|
|
200
|
+
[API] POST /orders (correlationId: uuid)
|
|
201
|
+
→ [Application] CreateOrderHandler
|
|
202
|
+
→ [Infrastructure] OrderRepository.AddAsync
|
|
203
|
+
→ [Infrastructure] ProductRepository.ValidateStock
|
|
204
|
+
→ [Infrastructure] EventBus.Publish(OrderCreated)
|
|
205
|
+
→ [API] Response 201
|
|
206
|
+
```
|
|
207
|
+
|
|
208
|
+
---
|
|
209
|
+
|
|
210
|
+
## 4. Estratégia de Testes
|
|
211
|
+
|
|
212
|
+
### 4.1. Pirâmide de Testes
|
|
213
|
+
|
|
214
|
+
```
|
|
215
|
+
/ E2E \ Poucos, lentos, caros
|
|
216
|
+
/Integration \ Alguns, médios
|
|
217
|
+
/ Unit Tests \ Muitos, rápidos, baratos
|
|
218
|
+
```
|
|
219
|
+
|
|
220
|
+
| Tipo | Quantidade | Velocidade | Custo | O que testa |
|
|
221
|
+
|:---|:---|:---|:---|:---|
|
|
222
|
+
| **Unit** | 70% | < 100ms | Baixo | Lógica isolada (entities, handlers, validators) |
|
|
223
|
+
| **Integration** | 20% | < 5s | Médio | Repositories, serviços com DB real |
|
|
224
|
+
| **E2E** | 10% | < 30s | Alto | Fluxos completos (API → DB → Response) |
|
|
225
|
+
|
|
226
|
+
### 4.2. Cobertura por Criticidade
|
|
227
|
+
|
|
228
|
+
| Criticidade | Coverage Mínimo | O que é obrigatório |
|
|
229
|
+
|:---|:---|:---|
|
|
230
|
+
| **Crítica** (pagamento, auth) | 90% | Unit + Integration + E2E |
|
|
231
|
+
| **Alta** (CRUD principal) | 80% | Unit + Integration |
|
|
232
|
+
| **Média** (listagens, filtros) | 70% | Unit + alguns Integration |
|
|
233
|
+
| **Baixa** (utils, helpers) | 60% | Unit |
|
|
234
|
+
|
|
235
|
+
---
|
|
236
|
+
|
|
237
|
+
## 5. Testes por Camada
|
|
238
|
+
|
|
239
|
+
### 5.1. Domain (Unit)
|
|
240
|
+
|
|
241
|
+
**O que testar:**
|
|
242
|
+
- Entidades: criação com dados válidos, rejeição de dados inválidos, invariantes
|
|
243
|
+
- Value Objects: igualdade, imutabilidade, validação
|
|
244
|
+
- Domain Services: lógica complexa de negócio
|
|
245
|
+
|
|
246
|
+
**Exemplo de especificação:**
|
|
247
|
+
```
|
|
248
|
+
Testes de Domínio:
|
|
249
|
+
- Order.Create() com items válidos → sucesso
|
|
250
|
+
- Order.Create() sem items → DomainException
|
|
251
|
+
- Order.Total com múltiplos items → soma correta
|
|
252
|
+
- Order.Cancel() quando PENDING → sucesso
|
|
253
|
+
- Order.Cancel() quando PAID → DomainException
|
|
254
|
+
- Money.Add() com valores negativos → DomainException
|
|
255
|
+
```
|
|
256
|
+
|
|
257
|
+
### 5.2. Application (Unit)
|
|
258
|
+
|
|
259
|
+
**O que testar:**
|
|
260
|
+
- Handlers: fluxo principal, casos de erro, validações
|
|
261
|
+
- Validators: regras de validação de input
|
|
262
|
+
- DTOs: mapeamento correto
|
|
263
|
+
|
|
264
|
+
**Exemplo:**
|
|
265
|
+
```
|
|
266
|
+
Testes de Application:
|
|
267
|
+
- CreateOrderHandler com request válido → Order criado + evento publicado
|
|
268
|
+
- CreateOrderHandler com produto inexistente → ProductNotFoundException
|
|
269
|
+
- CreateOrderHandler com estoque insuficiente → InsufficientStockException
|
|
270
|
+
- CreateOrderValidator sem items → ValidationError em items
|
|
271
|
+
- CreateOrderValidator com quantity <= 0 → ValidationError em quantity
|
|
272
|
+
- CreateOrderValidator com total > 10000 → status REVIEW_PENDING
|
|
273
|
+
```
|
|
274
|
+
|
|
275
|
+
**Padrão AAA (Arrange-Act-Assert):**
|
|
276
|
+
```
|
|
277
|
+
Test: CreateOrder_Should_CreateOrder_When_ValidRequest
|
|
278
|
+
Arrange:
|
|
279
|
+
- Mock IOrderRepository.Setup(AddAsync) → returns void
|
|
280
|
+
- Mock IProductRepository.Setup(GetByIdAsync) → returns Product
|
|
281
|
+
- Mock IEventBus.Setup(PublishAsync) → returns void
|
|
282
|
+
- Command = valid CreateOrderCommand
|
|
283
|
+
Act:
|
|
284
|
+
- Result = handler.Handle(command)
|
|
285
|
+
Assert:
|
|
286
|
+
- Result.IsSuccess == true
|
|
287
|
+
- Result.Value.OrderId != empty
|
|
288
|
+
- IOrderRepository.Verify(AddAsync, Called.Once)
|
|
289
|
+
- IEventBus.Verify(PublishAsync, Called.Once)
|
|
290
|
+
```
|
|
291
|
+
|
|
292
|
+
### 5.3. Infrastructure (Integration)
|
|
293
|
+
|
|
294
|
+
**O que testar:**
|
|
295
|
+
- Repositories: CRUD com banco real (ou container)
|
|
296
|
+
- External services: integração com APIs (usando mocks de HTTP)
|
|
297
|
+
- Migrations: schema válido
|
|
298
|
+
|
|
299
|
+
**Setup necessário:**
|
|
300
|
+
```
|
|
301
|
+
Integration Tests:
|
|
302
|
+
- Database: PostgreSQL container (TestContainers)
|
|
303
|
+
- Seed: dados mínimos para testes
|
|
304
|
+
- Transaction: cada teste em transaction com rollback
|
|
305
|
+
- Cleanup: truncar tabelas após cada teste (ou transaction rollback)
|
|
306
|
+
```
|
|
307
|
+
|
|
308
|
+
**Exemplo:**
|
|
309
|
+
```
|
|
310
|
+
Testes de Infrastructure:
|
|
311
|
+
- OrderRepository.AddAsync → persiste no banco
|
|
312
|
+
- OrderRepository.GetByIdAsync → retorna Order com Items
|
|
313
|
+
- OrderRepository.GetByCustomerIdAsync → retorna lista paginada
|
|
314
|
+
- OrderRepository.UpdateAsync → atualiza status
|
|
315
|
+
- OrderRepository com optimistic locking → lança ConcurrencyException
|
|
316
|
+
```
|
|
317
|
+
|
|
318
|
+
### 5.4. Interface (E2E / Integration)
|
|
319
|
+
|
|
320
|
+
**O que testar:**
|
|
321
|
+
- Endpoints: status codes, headers, response body
|
|
322
|
+
- Auth: token ausente/inválido/expirado
|
|
323
|
+
- Fluxos: criar → buscar → atualizar → deletar
|
|
324
|
+
|
|
325
|
+
**Exemplo:**
|
|
326
|
+
```
|
|
327
|
+
Testes E2E (API):
|
|
328
|
+
- POST /api/v1/orders com token válido → 201 + order body
|
|
329
|
+
- POST /api/v1/orders sem token → 401
|
|
330
|
+
- POST /api/v1/orders com token de outro user → 403
|
|
331
|
+
- POST /api/v1/orders com body inválido → 400 + validation errors
|
|
332
|
+
- GET /api/v1/orders/{id} → 200 + order
|
|
333
|
+
- GET /api/v1/orders/{id} com id inexistente → 404
|
|
334
|
+
- DELETE /api/v1/orders/{id} com status PENDING → 204
|
|
335
|
+
- DELETE /api/v1/orders/{id} com status PAID → 409
|
|
336
|
+
```
|
|
337
|
+
|
|
338
|
+
---
|
|
339
|
+
|
|
340
|
+
## 6. Dados de Teste
|
|
341
|
+
|
|
342
|
+
### 6.1. Factories
|
|
343
|
+
|
|
344
|
+
```
|
|
345
|
+
Test Data Factory: OrderFactory
|
|
346
|
+
Métodos:
|
|
347
|
+
- create(partial?): Order → cria Order com dados válidos padrão
|
|
348
|
+
- withItems(count): Order → cria Order com N items
|
|
349
|
+
- pending(): Order → status PENDING
|
|
350
|
+
- paid(): Order → status PAID
|
|
351
|
+
- cancelled(): Order → status CANCELLED
|
|
352
|
+
|
|
353
|
+
Exemplo:
|
|
354
|
+
const order = OrderFactory.create({ customerId: 'specific-uuid' });
|
|
355
|
+
const pendingOrder = OrderFactory.pending().withItems(3);
|
|
356
|
+
```
|
|
357
|
+
|
|
358
|
+
### 6.2. Fixtures
|
|
359
|
+
|
|
360
|
+
```
|
|
361
|
+
Seed de teste:
|
|
362
|
+
- 1 User ADMIN (admin@test.com)
|
|
363
|
+
- 1 User CUSTOMER (customer@test.com)
|
|
364
|
+
- 5 Products (disponíveis)
|
|
365
|
+
- 3 Orders (PENDING, PAID, CANCELLED)
|
|
366
|
+
|
|
367
|
+
Load: antes de cada suite de integration tests
|
|
368
|
+
Cleanup: após cada suite
|
|
369
|
+
```
|
|
370
|
+
|
|
371
|
+
### 6.3. Fakes vs Mocks
|
|
372
|
+
|
|
373
|
+
| Tipo | Quando usar | Exemplo |
|
|
374
|
+
|:---|:---|:---|
|
|
375
|
+
| **Fake** | Implementação simplificada que funciona | InMemoryOrderRepository para unit tests |
|
|
376
|
+
| **Mock** | Verificar comportamento (chamadas) | Mock<IOrderRepository> com Setup/Verify |
|
|
377
|
+
| **Stub** | Retornar dados fixos | Stub<IProductService>.GetPrice → 99.99 |
|
|
378
|
+
|
|
379
|
+
---
|
|
380
|
+
|
|
381
|
+
## 7. Checklist de Observabilidade
|
|
382
|
+
|
|
383
|
+
Antes de finalizar a seção de observabilidade na TechSpec, verificar:
|
|
384
|
+
|
|
385
|
+
### Logging
|
|
386
|
+
- [ ] Eventos de negócio logados (INFO)
|
|
387
|
+
- [ ] Erros com contexto suficiente (ERROR)
|
|
388
|
+
- [ ] Retries e warnings documentados (WARN)
|
|
389
|
+
- [ ] NENHUM dado sensível nos logs
|
|
390
|
+
- [ ] Correlation ID em todos os logs
|
|
391
|
+
- [ ] Formato estruturado (JSON)
|
|
392
|
+
- [ ] Framework de logging especificado (Winston, Serilog, Pino)
|
|
393
|
+
|
|
394
|
+
### Métricas
|
|
395
|
+
- [ ] Contadores para eventos de negócio (created, failed)
|
|
396
|
+
- [ ] Histogramas para latência (duration_seconds)
|
|
397
|
+
- [ ] Gauges para estado atual (queue depth, connections)
|
|
398
|
+
- [ ] Labels para segmentação (status, method, path)
|
|
399
|
+
- [ ] Alertas críticos definidos
|
|
400
|
+
|
|
401
|
+
### Tracing
|
|
402
|
+
- [ ] Correlation ID gerado no entry point
|
|
403
|
+
- [ ] Propagação em logs, eventos e chamadas externas
|
|
404
|
+
- [ ] Incluído em respostas de erro
|
|
405
|
+
- [ ] Framework especificado (OpenTelemetry, manual)
|
|
406
|
+
|
|
407
|
+
---
|
|
408
|
+
|
|
409
|
+
## 8. Checklist de Testes
|
|
410
|
+
|
|
411
|
+
Antes de finalizar a seção de testes na TechSpec, verificar:
|
|
412
|
+
|
|
413
|
+
### Estratégia
|
|
414
|
+
- [ ] Pirâmide de testes definida (70/20/10)
|
|
415
|
+
- [ ] Framework de testes especificado
|
|
416
|
+
- [ ] Coverage mínimo definido por criticidade
|
|
417
|
+
- [ ] CI pipeline inclui testes
|
|
418
|
+
|
|
419
|
+
### Por Camada
|
|
420
|
+
- [ ] Domain: entidades, value objects, invariantes
|
|
421
|
+
- [ ] Application: handlers, validação, casos de erro
|
|
422
|
+
- [ ] Infrastructure: repositories com DB real (TestContainers)
|
|
423
|
+
- [ ] Interface: endpoints, auth, fluxos
|
|
424
|
+
|
|
425
|
+
### Dados
|
|
426
|
+
- [ ] Factories para criação de dados de teste
|
|
427
|
+
- [ ] Fixtures para dados recorrentes
|
|
428
|
+
- [ ] Seed para integration tests
|
|
429
|
+
- [ ] Cleanup strategy definida
|
|
430
|
+
|
|
431
|
+
### Cenários Críticos
|
|
432
|
+
- [ ] Happy path testado
|
|
433
|
+
- [ ] Cada edge case da TechSpec tem teste
|
|
434
|
+
- [ ] Concorrência testada (se aplicável)
|
|
435
|
+
- [ ] Erros de integração externa testados (timeout, retry)
|
|
436
|
+
- [ ] Auth/authorization testado (unauthorized, forbidden)
|
|
@@ -0,0 +1,238 @@
|
|
|
1
|
+
# Segurança e Hardening
|
|
2
|
+
|
|
3
|
+
Referência técnica para segurança ao gerar Tech Specs.
|
|
4
|
+
|
|
5
|
+
## Sumário
|
|
6
|
+
|
|
7
|
+
1. [OWASP Top 10 no Contexto de Specs](#1-owasp-top-10-no-contexto-de-specs)
|
|
8
|
+
2. [Autenticação e Autorização](#2-autenticacao-e-autorizacao)
|
|
9
|
+
3. [Proteção de Dados](#3-protecao-de-dados)
|
|
10
|
+
4. [Validação de Input](#4-validacao-de-input)
|
|
11
|
+
5. [Configuração de Segurança](#5-configuracao-de-seguranca)
|
|
12
|
+
6. [Matriz de Segurança por Endpoint](#6-matriz-de-seguranca-por-endpoint)
|
|
13
|
+
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
## 1. OWASP Top 10 no Contexto de Specs
|
|
17
|
+
|
|
18
|
+
### O que especificar na TechSpec para cada risco:
|
|
19
|
+
|
|
20
|
+
| # | Risco OWASP | O que documentar na TechSpec |
|
|
21
|
+
|:---|:---|:---|
|
|
22
|
+
| **A01** | Broken Access Control | Auth por endpoint, ownership checks, role-based access |
|
|
23
|
+
| **A02** | Cryptographic Failures | Dados sensíveis criptografados, TLS, hashing de senhas |
|
|
24
|
+
| **A03** | Injection | Query parametrizada, input sanitization, ORM usage |
|
|
25
|
+
| **A04** | Insecure Design | Threat modeling, validação em todas as camadas |
|
|
26
|
+
| **A05** | Security Misconfiguration | Headers de segurança, CORS, error messages sem stack trace |
|
|
27
|
+
| **A06** | Vulnerable Components | Verificar versões de dependências, lock files |
|
|
28
|
+
| **A07** | Auth Failures | Rate limiting em auth, session management, MFA |
|
|
29
|
+
| **A08** | Software/Data Integrity | CI/CD pipeline seguro, validação de webhooks |
|
|
30
|
+
| **A09** | Logging Failures | Audit logging, dados sensíveis NOS logs |
|
|
31
|
+
| **A10** | SSRF | Validar URLs de webhook, whitelist de serviços |
|
|
32
|
+
|
|
33
|
+
---
|
|
34
|
+
|
|
35
|
+
## 2. Autenticação e Autorização
|
|
36
|
+
|
|
37
|
+
### 2.1. Padrões de Autenticação
|
|
38
|
+
|
|
39
|
+
| Padrão | Quando usar | O que especificar |
|
|
40
|
+
|:---|:---|:---|
|
|
41
|
+
| **JWT Bearer** | APIs stateless | Algoritmo (RS256), expiry, refresh token strategy |
|
|
42
|
+
| **OAuth2** | Login social, third-party | Provider, scopes, flow (Authorization Code) |
|
|
43
|
+
| **API Key** | Service-to-service | Header (X-API-Key), rotation, scope |
|
|
44
|
+
| **Session** | Apps web tradicionais | Cookie httpOnly, secure, sameSite |
|
|
45
|
+
|
|
46
|
+
### 2.2. JWT - O que Especificar
|
|
47
|
+
|
|
48
|
+
```
|
|
49
|
+
Authentication: JWT Bearer Token
|
|
50
|
+
Header: Authorization: Bearer {token}
|
|
51
|
+
Algoritmo: RS256 (asymmetric, recomendado) ou HS256
|
|
52
|
+
Expiry: 15 minutos (access token) + 7 dias (refresh token)
|
|
53
|
+
Issuer: auth.example.com
|
|
54
|
+
Audience: api.example.com
|
|
55
|
+
Claims: { sub: userId, role: user_role, exp: timestamp }
|
|
56
|
+
Refresh: POST /api/v1/auth/refresh com refresh_token no body
|
|
57
|
+
Blacklist: Redis para tokens revogados (TTL = expiry)
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
### 2.3. Autorização
|
|
61
|
+
|
|
62
|
+
**Role-Based Access Control (RBAC):**
|
|
63
|
+
```
|
|
64
|
+
Roles: ADMIN, MANAGER, CUSTOMER
|
|
65
|
+
|
|
66
|
+
Permissions por endpoint:
|
|
67
|
+
| Role | POST /orders | GET /orders | DELETE /orders/{id} |
|
|
68
|
+
|:---|:---|:---|:---|
|
|
69
|
+
| ADMIN | Qualquer | Todos | Qualquer |
|
|
70
|
+
| MANAGER | Qualquer | Todos | Qualquer |
|
|
71
|
+
| CUSTOMER | Próprio | Próprios | Próprio (se PENDING) |
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
**Ownership Check (Resource-Level):**
|
|
75
|
+
```
|
|
76
|
+
GET /api/v1/orders/{id}:
|
|
77
|
+
1. Verificar se order existe (404 se não)
|
|
78
|
+
2. Verificar se user.role == ADMIN OU order.userId == user.id (403 se não)
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
---
|
|
82
|
+
|
|
83
|
+
## 3. Proteção de Dados
|
|
84
|
+
|
|
85
|
+
### 3.1. Dados Sensíveis
|
|
86
|
+
|
|
87
|
+
| Categoria | Exemplos | Tratamento |
|
|
88
|
+
|:---|:---|:---|
|
|
89
|
+
| **Credenciais** | Senhas, tokens, API keys | Hash (Argon2id/bcrypt), NUNCA logar, NUNCA retornar em API |
|
|
90
|
+
| **PII** | CPF, RG, endereço | Criptografia em repouso (AES-256), masking em logs |
|
|
91
|
+
| **Financeiro** | Cartão, conta bancária | Tokenização, PCI compliance, NUNCA armazenar completo |
|
|
92
|
+
| **Saúde** | Dados médicos | Criptografia forte, LGPD/HIPAA compliance |
|
|
93
|
+
| **Children** | Dados de menores | Consentimento parental, proteção reforçada |
|
|
94
|
+
|
|
95
|
+
### 3.2. Criptografia
|
|
96
|
+
|
|
97
|
+
| Contexto | Algoritmo | Uso |
|
|
98
|
+
|:---|:---|:---|
|
|
99
|
+
| **Senhas (hashing)** | Argon2id (preferido) ou bcrypt (cost ≥ 12) | Armazenamento de senhas |
|
|
100
|
+
| **Dados em repouso** | AES-256-GCM | Campos sensíveis no banco |
|
|
101
|
+
| **Dados em trânsito** | TLS 1.3 (mínimo TLS 1.2) | HTTPS para todas as APIs |
|
|
102
|
+
| **Assinatura** | RS256 / ES256 | JWT, webhooks |
|
|
103
|
+
| **Chaves simétricas** | HKDF para derivação | Derivar chaves de master key |
|
|
104
|
+
|
|
105
|
+
### 3.3. Especificação na TechSpec
|
|
106
|
+
|
|
107
|
+
```
|
|
108
|
+
Dados Sensíveis:
|
|
109
|
+
- password: Hash com Argon2id (conforme padrão em AuthService)
|
|
110
|
+
- cpf: AES-256-GCM em repouso, masking em logs (***.***.***-**)
|
|
111
|
+
- credit_card: NÃO armazenar, usar tokenização do gateway (Stripe)
|
|
112
|
+
- email: Armazenado em claro, mas NÃO logar
|
|
113
|
+
|
|
114
|
+
Logs:
|
|
115
|
+
- NUNCA logar: password, token, credit_card, cpf completo
|
|
116
|
+
- SEMPRE mascarar em logs: cpf → "***.***.***-**", email → "j***@example.com"
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
---
|
|
120
|
+
|
|
121
|
+
## 4. Validação de Input
|
|
122
|
+
|
|
123
|
+
### 4.1. Estratégia por Camada
|
|
124
|
+
|
|
125
|
+
| Camada | Validação | Objetivo |
|
|
126
|
+
|:---|:---|:---|
|
|
127
|
+
| **Interface** | Schema validation (Zod, Joi, FluentValidation) | Rejeitar requests inválidos cedo |
|
|
128
|
+
| **Application** | Business rules validation | Garantir regras de negócio |
|
|
129
|
+
| **Domain** | Entity invariants | Garantir consistência do domínio |
|
|
130
|
+
| **Database** | Constraints (CHECK, NOT NULL, FK) | Última barreira de integridade |
|
|
131
|
+
|
|
132
|
+
### 4.2. Sanitização
|
|
133
|
+
|
|
134
|
+
| Tipo | Risco | Prevenção |
|
|
135
|
+
|:---|:---|:---|
|
|
136
|
+
| **SQL Injection** | Acesso não autorizado ao banco | Query parametrizada (ORM prepared statements) |
|
|
137
|
+
| **XSS** | Execução de script no browser | Escape HTML, Content-Security-Policy, sanitize input |
|
|
138
|
+
| **CSV Injection** | Execução de fórmulas em Excel | Sanitizar prefixos (=, +, -, @) |
|
|
139
|
+
| **Path Traversal** | Acesso a arquivos do sistema | Validar paths, whitelist de diretórios |
|
|
140
|
+
| **Command Injection** | Execução de comandos do SO | NUNCA concatenar input em commands |
|
|
141
|
+
|
|
142
|
+
### 4.3. Na TechSpec
|
|
143
|
+
|
|
144
|
+
```
|
|
145
|
+
Validação de Input:
|
|
146
|
+
- Schema: Zod (conforme padrão do projeto)
|
|
147
|
+
- Campos de texto: trim + escape HTML
|
|
148
|
+
- Email: regex + verificação de formato
|
|
149
|
+
- UUID: validação de formato v4
|
|
150
|
+
- Números: min/max bounds
|
|
151
|
+
- Arrays: max length + item validation
|
|
152
|
+
- SQL: Prisma ORM com prepared statements (sem raw queries)
|
|
153
|
+
- Upload: whitelist de extensões, max size 5MB, magic bytes validation
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
---
|
|
157
|
+
|
|
158
|
+
## 5. Configuração de Segurança
|
|
159
|
+
|
|
160
|
+
### 5.1. HTTP Headers
|
|
161
|
+
|
|
162
|
+
```
|
|
163
|
+
Content-Security-Policy: default-src 'self'; script-src 'self'; style-src 'self' 'unsafe-inline'
|
|
164
|
+
X-Content-Type-Options: nosniff
|
|
165
|
+
X-Frame-Options: DENY
|
|
166
|
+
X-XSS-Protection: 0 (desativar, usar CSP)
|
|
167
|
+
Strict-Transport-Security: max-age=31536000; includeSubDomains; preload
|
|
168
|
+
Referrer-Policy: strict-origin-when-cross-origin
|
|
169
|
+
Permissions-Policy: camera=(), microphone=(), geolocation=()
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
### 5.2. CORS
|
|
173
|
+
|
|
174
|
+
```
|
|
175
|
+
Origins permitidos: https://app.example.com, https://admin.example.com
|
|
176
|
+
Methods: GET, POST, PUT, PATCH, DELETE
|
|
177
|
+
Headers: Content-Type, Authorization, X-Request-Id
|
|
178
|
+
Credentials: true (para cookies)
|
|
179
|
+
Max Age: 86400 (24h)
|
|
180
|
+
|
|
181
|
+
NUNCA: Access-Control-Allow-Origin: * em produção
|
|
182
|
+
```
|
|
183
|
+
|
|
184
|
+
### 5.3. Rate Limiting
|
|
185
|
+
|
|
186
|
+
```
|
|
187
|
+
Rate Limiting:
|
|
188
|
+
- Storage: Redis (conforme padrão do projeto)
|
|
189
|
+
- Key: user_id para autenticado, IP para anônimo
|
|
190
|
+
- Strategy: Sliding window
|
|
191
|
+
- Response: 429 com Retry-After header
|
|
192
|
+
|
|
193
|
+
Endpoints:
|
|
194
|
+
| Endpoint | Limite | Janela |
|
|
195
|
+
|:---|:---|:---|
|
|
196
|
+
| POST /auth/login | 5 req | 1 minuto por IP |
|
|
197
|
+
| POST /auth/refresh | 20 req | 1 minuto por user |
|
|
198
|
+
| POST /orders | 10 req | 1 minuto por user |
|
|
199
|
+
| GET /orders | 100 req | 1 minuto por user |
|
|
200
|
+
```
|
|
201
|
+
|
|
202
|
+
### 5.4. Secrets Management
|
|
203
|
+
|
|
204
|
+
```
|
|
205
|
+
NUNCA:
|
|
206
|
+
- Hardcoded secrets no código
|
|
207
|
+
- Secrets em arquivos versionados (.env em .gitignore)
|
|
208
|
+
- Secrets em logs ou error messages
|
|
209
|
+
|
|
210
|
+
SEMPRE:
|
|
211
|
+
- Environment variables para configuração
|
|
212
|
+
- Secret Manager para produção (AWS Secrets Manager, Vault)
|
|
213
|
+
- Rotação de secrets planejada
|
|
214
|
+
|
|
215
|
+
Na TechSpec:
|
|
216
|
+
- Listar variáveis de ambiente necessárias (NOMES apenas, sem valores)
|
|
217
|
+
- Documentar rotación policy
|
|
218
|
+
- Documentar onde secrets são armazenados em cada ambiente
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
---
|
|
222
|
+
|
|
223
|
+
## 6. Matriz de Segurança por Endpoint
|
|
224
|
+
|
|
225
|
+
Template para documentar segurança na TechSpec:
|
|
226
|
+
|
|
227
|
+
```
|
|
228
|
+
| Endpoint | Auth | Role/Permission | Dados Sensíveis | Rate Limit | Notas |
|
|
229
|
+
|:---|:---|:---|:---|:---|:---|
|
|
230
|
+
| POST /api/v1/auth/login | Nenhum | Público | Password (transit only) | 5/min/IP | Retorna JWT |
|
|
231
|
+
| POST /api/v1/auth/refresh | JWT | Qualquer | Refresh token | 20/min/user | Renova access token |
|
|
232
|
+
| GET /api/v1/users | JWT | ADMIN | Email (masked) | 100/min/user | Listar todos |
|
|
233
|
+
| GET /api/v1/users/{id} | JWT | ADMIN ou owner | Email, CPF (masked) | 100/min/user | Ownership check |
|
|
234
|
+
| POST /api/v1/orders | JWT | CUSTOMER+ | Nenhum | 10/min/user | Idempotent key |
|
|
235
|
+
| GET /api/v1/orders | JWT | ADMIN=all, CUSTOMER=own | Nenhum | 100/min/user | Filtered by role |
|
|
236
|
+
| DELETE /api/v1/orders/{id} | JWT | ADMIN ou owner (PENDING) | Nenhum | 5/min/user | Soft delete |
|
|
237
|
+
| POST /api/v1/payments | JWT + Idempotency | CUSTOMER+ | Card token (Stripe) | 5/min/user | Non-retryable errors |
|
|
238
|
+
```
|