Stack Ideal
~45 min Avançado Parte 6

W6: O Stack Ideal

A proposta de maior qualidade. Combina GSD para estrutura, agentes paralelos para execução, TDD hard gate, pirâmide de testes completa, OWASP em CI, e PM integrado nos gates críticos.

Filosofia

W6 não é o workflow mais rápido. É o workflow que você não vai se arrepender. Cada fase existe por uma razão de qualidade precisa — não há etapa decorativa, não há cerimônia vazia. Se uma fase parece lenta, é porque o custo de pular ela está escondido em retrabalho, incidentes e dívida técnica acumulada.

O PM está presente nos gates certos — Fase 0 (definição) e Fase 4 (validação) — e fora do caminho crítico durante a execução. Isso elimina o ciclo vicioso de interrupcões durante implementação sem abrir mão da validação de negócio onde ela realmente importa.

Quando usar W6: Use este workflow quando o custo de um bug em produção é maior que o custo de fazer certo. Sistemas financeiros, saúde, infraestrutura crítica, features que afetam retenção de receita ou compliance regulatório. Para protótipos e MVPs internos, considere W2 (GSD) ou W3 (Cortex).

Os cinco pilares que distinguem W6 dos outros workflows:

  • Arquitetura antes de código — hexagonal arch como contrato de qualidade, não como documentação post-hoc.
  • TDD hard gate — o agente não avança sem teste existente e passando no nível anterior.
  • Execução paralela com handoff formal — backend, frontend e security rodam em paralelo com protocolo de contrato via arquivo.
  • Pirâmide de testes completa — unit, integration, E2E, load e stress com thresholds definidos que param o pipeline.
  • PM integrado em gates, não em cada passo — validação de negócio sem interrupção de fluxo.

Diagrama completo do W6

O fluxo abaixo mostra todos os atores, fases, handoffs e gates de decisão. Um ciclo completo bem executado leva de 2 a 5 dias dependendo da complexidade da feature.

flowchart TD PM[PM: PRD com critérios\nmensuráveis de aceite] --> F0 subgraph F0["FASE 0 — Product Discovery"] F0A[/gsd:discuss-phase] --> F0B[Assumptions + ADR.md] F0B --> F0C[UI-SPEC.md via\n/gsd:ui-phase] F0C --> F0D[REQUIREMENTS.md aprovado pelo PM] end F0D --> F1 subgraph F1["FASE 1 — Architecture First"] F1A[Claude desenha\nhexagonal arch] --> F1B[Domain model\nEntities + Use Cases] F1B --> F1C[Ports: interfaces\nde contrato] F1C --> F1D[Testes de contrato\nnos ports — RED] end F1D --> F2 subgraph F2["FASE 2 — Parallel Implementation"] direction LR BA2[Backend Agent\n< 60K tokens\nDomain → Ports → Adapters\nTDD rigoroso] FA2[Frontend Agent\n< 60K tokens\nshadcn/ui + Lucide\nfrontend-design skill] SA2[Security Agent\nOWASP Top 10\nem paralelo] BA2 -.->|handoff via arquivo| FA2 end F2 --> F3 subgraph F3["FASE 3 — Testing Pyramid Completa"] T1[Unit: vitest\n> 80% coverage\ndomínio isolado] --> T2 T2[Integration: DB real\ntestcontainers\nsem mocks] --> T3 T3[E2E: Cypress\njornadas críticas\nheadless] --> T4 T4[Load: k6\nbaseline throughput\np95 latência] --> T5 T5[Stress: k6\nponto de ruptura\ndegradação graceful] end F3 --> F4 subgraph F4["FASE 4 — PM Review Gate"] PR1[Preview deploy\nvercel --preview] --> PR2[PM valida contra\ncritérios de aceite] PR2 --> PR3{Aprovado?} PR3 -->|Não| PR4[Novo ciclo com\nfeedback capturado] PR4 --> F0 PR3 -->|Sim| F5 end subgraph F5["FASE 5 — Ship"] SH1[/gsd:ship] --> SH2[gh pr create] SH2 --> SH3[code-reviewer\nfinal pass] SH3 --> SH4[npm audit\nOWASP A06] SH4 --> SH5[Merge → Deploy] SH5 --> SH6[Alertas configurados\npré-produção] end

W6 completo: 6 fases, 3 agentes paralelos, 5 níveis de teste, 2 gates de PM.

Leitura do diagrama: Setas sólidas representam fluxo sequencial obrigatório. A seta pontilhada de Backend Agent para Frontend Agent indica handoff via arquivo de contrato de API — os agentes nunca se comunicam in-memory. O loop de retorno de F4 para F0 não é retrabalho: é um ciclo de refinamento com feedback estruturado.

Fase 0 — Product Discovery

A Fase 0 existe para eliminar ambiguidade antes que ela se torne código errado. O PM traz um PRD — o Claude entrevista, questiona, e produz artefatos de decisão que se tornam o contrato de qualidade para todas as fases seguintes.

O que o PM precisa trazer

Um PRD com critérios SMART de aceite. Critérios vagos como "o usuário deve conseguir fazer login" não são aceitos. O formato mínimo esperado:

# PRD — [Nome da Feature]

## Critérios de aceite (SMART)
- [ ] Tempo de resposta do endpoint POST /auth < 200ms no p95 sob 500 req/s
- [ ] Taxa de erro < 0.1% em 1 hora de carga contínua
- [ ] Fluxo de recuperação de senha completo em < 3 cliques
- [ ] Compatível com WCAG 2.1 AA (acessibilidade)
- [ ] Dados de PII encriptados em repouso (AES-256)

## Fora de escopo (explícito)
- SSO via SAML (próxima fase)
- Login social (backlog)

## Restrições técnicas conhecidas
- PostgreSQL 15, sem migração de schema destrutiva
- Deploy em edge functions Vercel

discuss-phase: como Claude entrevista

O skill /gsd:discuss-phase conduz uma entrevista adaptativa para descobrir gaps no PRD. Claude faz perguntas até ter confiança suficiente para gerar o plano sem assumir decisões de negócio. Tipicamente 5 a 12 perguntas.

# Iniciar a fase de discovery
/gsd:discuss-phase

# Claude vai perguntar sobre: edge cases, estados de erro,
# integrações externas, volume esperado, rollback strategy,
# dependências de outras features, critérios de performance

ADR.md — Architectural Decision Record

Cada decisão arquitetural não-trivial gera uma entrada no ADR.md. O formato padrão usado no W6:

# ADR-001: JWT vs Session Tokens para autenticação

**Data:** 2025-03-15
**Status:** Aceito

## Contexto
Sistema SaaS multi-tenant, 50K usuários ativos, edge functions sem estado.

## Decisão
JWT com refresh token rotation (RFC 7519). Access token com TTL de 15min,
refresh token com TTL de 7 dias armazenado em httpOnly cookie.

## Consequências
+ Stateless: compatível com edge runtime sem Redis
+ Revogação granular via refresh token blacklist (Redis opcional)
- Overhead de validação de assinatura em cada request
- Payload público: não colocar dados sensíveis no token

## Alternativas descartadas
- Sessions com Redis: requer infraestrutura adicional, custo operacional
- Opaque tokens: requer lookup no DB em cada request

UI-SPEC.md via /gsd:ui-phase

O skill /gsd:ui-phase gera a especificação visual antes de qualquer linha de CSS. O Frontend Agent recebe esse arquivo como contrato de design — não há decisões visuais ad hoc durante a implementação.

# Gerar UI-SPEC.md baseado no PRD
/gsd:ui-phase

# Resultado: UI-SPEC.md com:
# - Layout wireframe em ASCII
# - Componentes shadcn/ui mapeados
# - Estados: default, loading, error, empty
# - Paleta: zinc/slate, accent único
# - Tokens tipográficos: Geist Sans + Geist Mono
Gate obrigatório: O PM deve assinar o REQUIREMENTS.md antes de avançar para Fase 1. "Assinar" significa revisar e confirmar explicitamente — não apenas receber. Um REQUIREMENTS.md não aprovado bloqueia o spawn dos agentes de implementação.

Fase 1 — Architecture First

Antes de escrever uma linha de código de negócio, Claude produz o modelo arquitetural. Não como documentação — como contrato de qualidade que guia a implementação e os testes.

Por que arquitetura antes de código

Código escrito sem arquitetura explícita tende a violar Single Responsibility e Dependency Inversion desde o primeiro commit. Refatorar depois tem custo exponencial: testes precisam ser reescritos, contratos de API mudam, e o contexto que justificou a decisão original já se perdeu.

Na prática: 2 horas de design arquitetural evitam 2 dias de refatoração. O ROI é claro para qualquer feature com mais de 3 dias de implementação.

Hexagonal Arch aplicada ao problema

Claude recebe o PRD e os ADRs e produz o mapeamento hexagonal para aquela feature específica — não um template genérico. A sequência é domain first, depois ports, depois adapters:

// DOMAIN: sem dependências externas
// src/domain/auth/entities/User.ts
export class User {
  constructor(
    readonly id: UserId,
    readonly email: Email,
    private passwordHash: PasswordHash
  ) {}

  verifyPassword(candidate: string): boolean {
    return this.passwordHash.verify(candidate);
  }

  static create(email: string, password: string): User {
    return new User(
      UserId.generate(),
      Email.parse(email),        // lança InvalidEmailError
      PasswordHash.bcrypt(password)
    );
  }
}

// PORT: interface de contrato (sem implementação)
// src/domain/auth/ports/UserRepository.ts
export interface UserRepository {
  findByEmail(email: Email): Promise;
  save(user: User): Promise;
  delete(id: UserId): Promise;
}

// ADAPTER: implementação concreta (depende da infra)
// src/infra/postgres/PostgresUserRepository.ts
export class PostgresUserRepository implements UserRepository {
  constructor(private readonly db: PrismaClient) {}

  async findByEmail(email: Email): Promise {
    const row = await this.db.user.findUnique({
      where: { email: email.value }
    });
    return row ? UserMapper.toDomain(row) : null;
  }
  // ...
}

Testes de contrato nos Ports

Antes de qualquer adapter existir, Claude escreve testes de contrato para cada Port. Esses testes definem o comportamento esperado do contrato — qualquer adapter que implemente o Port deve passar nesses testes. Isso é TDD na camada de portas:

// src/domain/auth/ports/__tests__/UserRepository.contract.ts
// Contrato: qualquer implementação de UserRepository DEVE passar nesses testes

import type { UserRepository } from '../UserRepository';

export function userRepositoryContract(
  createRepo: () => UserRepository,
  cleanup: () => Promise
) {
  let repo: UserRepository;

  beforeEach(() => { repo = createRepo(); });
  afterEach(cleanup);

  it('persiste e recupera usuário por email', async () => {
    const user = User.create('alice@example.com', 'S3cr3t!');
    await repo.save(user);

    const found = await repo.findByEmail(Email.parse('alice@example.com'));
    expect(found).not.toBeNull();
    expect(found!.id.value).toBe(user.id.value);
  });

  it('retorna null para email inexistente', async () => {
    const found = await repo.findByEmail(Email.parse('ghost@example.com'));
    expect(found).toBeNull();
  });

  it('sobrescreve ao salvar usuário existente', async () => {
    const user = User.create('bob@example.com', 'P4ss!');
    await repo.save(user);
    await repo.save(user); // idempotente
    const found = await repo.findByEmail(Email.parse('bob@example.com'));
    expect(found).not.toBeNull();
  });
}

// Uso no teste do adapter concreto:
// PostgresUserRepository.test.ts
userRepositoryContract(
  () => new PostgresUserRepository(testDb),
  () => testDb.user.deleteMany()
);
Se você pular essa fase, vai refatorar depois. A questão é apenas quando. Features que chegam em produção com domain logic acoplada a infra são as que geram os maiores incidentes. A Fase 1 é o seguro mais barato que existe.

Fase 2 — Execução Paralela

Com arquitetura definida e testes de contrato escritos (RED), a implementação começa em paralelo. Três agentes rodam simultaneamente, cada um com escopo isolado e orçamento de contexto controlado.

Como spawnar os agentes

O Orchestrator Master (máximo 80K tokens) spawna os três agentes com contexto inicial mínimo e preciso. Cada agente recebe apenas o que precisa — não o histórico completo da conversa.

# Orchestrator Master envia para cada subagente:

# Backend Agent — contexto inicial:
# - REQUIREMENTS.md
# - ADR.md
# - src/domain/ (entities + ports)
# - Testes de contrato já escritos
# - Instrução: "Implemente os adapters em TDD. RED já existe. GREEN e REFACTOR são sua responsabilidade."

# Frontend Agent — contexto inicial:
# - UI-SPEC.md
# - API_CONTRACT.md (gerado pelo Backend Agent ao completar)
# - Instrução: "Implemente a UI conforme UI-SPEC.md. Dados via API_CONTRACT.md."

# Security Agent — contexto inicial:
# - REQUIREMENTS.md
# - ADR.md
# - OWASP checklist ativa
# - Instrução: "Audite em paralelo. Reporte em SECURITY_FINDINGS.md."

Backend Agent

  • Contexto: < 60K tokens
  • Implementa domain core
  • Implementa adapters (DB, HTTP)
  • TDD rigoroso: RED existente
  • Produz: API_CONTRACT.md
  • Produz: testes de integração

Frontend Agent

  • Contexto: < 60K tokens
  • Aguarda API_CONTRACT.md
  • shadcn/ui + Lucide Icons
  • Dark mode padrão
  • Geist Sans / Geist Mono
  • Testes: Testing Library

Security Agent

  • Contexto: < 60K tokens
  • OWASP Top 10 (2021)
  • Audita em paralelo
  • Sem bloquear os outros
  • Produz: SECURITY_FINDINGS.md
  • Findings bloqueantes vs. observações

Protocolo de handoff via arquivo

Backend Agent e Frontend Agent nunca se comunicam in-memory. O handoff ocorre via arquivo API_CONTRACT.md escrito pelo Backend Agent ao completar os endpoints. O Frontend Agent começa apenas após esse arquivo existir.

# API_CONTRACT.md — gerado pelo Backend Agent

## POST /api/auth/login
**Request:**
```json
{ "email": "string", "password": "string" }
```
**Response 200:**
```json
{ "accessToken": "string", "expiresIn": 900 }
```
**Response 401:**
```json
{ "error": "INVALID_CREDENTIALS", "message": "string" }
```
**Headers de resposta:**
- `Set-Cookie: refreshToken=...; HttpOnly; Secure; SameSite=Strict`

## GET /api/auth/me
**Headers:** `Authorization: Bearer {accessToken}`
**Response 200:**
```json
{ "id": "string", "email": "string", "createdAt": "ISO8601" }
```
**Response 401:** Token inválido ou expirado

Quando um agente falha

Falhas de agente no W6 têm protocolo definido. Não existe "tenta de novo até funcionar":

  • Falha de lógica de domínio — agente reporta o bloqueio com contexto. Orchestrator avalia se é gap no PRD (volta para Fase 0) ou bug implementável (retry com contexto adicional).
  • Context window excedida — o agente deve ter executado /compact ao atingir 50K. Se chegou ao limite sem compactar, abort e restart com instrução de compactar a cada 30K de saída acumulada.
  • Testes não passando após 3 tentativas — escalar para o Orchestrator com o diff atual e a mensagem de erro. Não tentar corrigir o teste para forçar verde.

Fase 3 — Pirâmide de Testes

O pipeline de testes no W6 é sequencial e bloqueante: cada nível deve passar antes de avançar para o próximo. Um único teste falhando em qualquer nível para o pipeline e impede o deploy.

/\ /E2E\ ← Cypress: jornadas críticas do usuário /──────\ / Integr \ ← Jest/Vitest: DB real (testcontainers), sem mocks /──────────\ / Unit Tests \ ← Vitest: domínio isolado, < 500ms total /______________\ / Static Anal. \ ← TypeScript strict + ESLint (zero warnings)

Nível 1 — Static Analysis (zero tolerance)

# TypeScript strict: nenhum erro permitido
npx tsc --noEmit --strict

# ESLint: zero warnings (warnings viram erros no CI)
npx eslint . --max-warnings 0

# Configuração tsconfig.json para projetos W6:
# "strict": true
# "noUncheckedIndexedAccess": true
# "exactOptionalPropertyTypes": true

Nível 2 — Unit Tests (> 80% coverage no domínio)

# Rodar apenas unit tests (padrão de naming: *.unit.test.ts)
npx vitest run --reporter=verbose src/domain

# Coverage com threshold que falha o build se não atingido
npx vitest run --coverage --coverage.thresholds.lines=80 \
  --coverage.thresholds.functions=85 \
  --coverage.thresholds.branches=75 \
  src/domain

# vitest.config.ts
coverage: {
  provider: 'v8',
  thresholds: { lines: 80, functions: 85, branches: 75 },
  include: ['src/domain/**'],
  exclude: ['**/*.d.ts', '**/__tests__/**']
}

Nível 3 — Integration Tests (DB real, sem mocks)

# Testcontainers sobe o Postgres real para os testes
# Padrão de naming: *.integration.test.ts
npx vitest run --reporter=verbose src/infra

# setup de testcontainer:
# src/test/setup-integration.ts
import { PostgreSqlContainer } from '@testcontainers/postgresql';

let container: PostgreSqlContainer;

beforeAll(async () => {
  container = await new PostgreSqlContainer('postgres:15')
    .withDatabase('testdb')
    .start();
  process.env.DATABASE_URL = container.getConnectionUri();
  await runMigrations(process.env.DATABASE_URL);
}, 60_000);

afterAll(async () => {
  await container.stop();
});

Nível 4 — E2E (Cypress, jornadas críticas)

# Cypress em modo headless no CI
npx cypress run --headless --browser chrome

# cypress.config.ts
export default defineConfig({
  e2e: {
    baseUrl: 'http://localhost:3000',
    specPattern: 'cypress/e2e/**/*.cy.ts',
    // Apenas jornadas críticas: login, checkout, onboarding
    // Não testar cada componente — isso é responsabilidade dos unit tests
  },
  video: false,  // desativa no CI para performance
  screenshotOnRunFailure: true
});

Nível 5 — Load e Stress (k6)

// k6/load.js — baseline: 500 req/s por 5 minutos
import http from 'k6/http';
import { check, sleep } from 'k6';

export const options = {
  stages: [
    { duration: '1m', target: 500 },   // ramp up
    { duration: '3m', target: 500 },   // sustain
    { duration: '1m', target: 0 },     // ramp down
  ],
  thresholds: {
    http_req_duration: ['p95<200'],      // p95 < 200ms
    http_req_failed: ['rate<0.001'],     // < 0.1% erro
  },
};

export default function () {
  const res = http.post('http://localhost:3000/api/auth/login', JSON.stringify({
    email: 'load-test@example.com',
    password: 'LoadTest123!'
  }), { headers: { 'Content-Type': 'application/json' } });

  check(res, { 'status is 200': (r) => r.status === 200 });
  sleep(0.1);
}
// k6/stress.js — descobrir ponto de ruptura
export const options = {
  stages: [
    { duration: '2m', target: 1000 },
    { duration: '3m', target: 2000 },
    { duration: '2m', target: 5000 },  // ponto de ruptura esperado aqui
    { duration: '5m', target: 0 },     // observar degradação graceful
  ],
  thresholds: {
    // Stress test: não falha o build — gera relatório de capacidade
    http_req_duration: ['p99<5000'],
  },
};
O que para o pipeline: Qualquer falha em TypeScript strict, ESLint com warnings, coverage abaixo do threshold, teste de contrato falhando, teste de integração falhando, E2E falhando em jornada crítica, ou p95 de latência acima de 200ms no load test. Stress test gera relatório mas não bloqueia o deploy.

Relatório consolidado

# Gerar relatório consolidado antes de avançar para Fase 4
npm run test:report

# package.json scripts sugeridos:
"test:ci": "tsc --noEmit && eslint . --max-warnings 0 && vitest run --coverage && cypress run --headless && k6 run k6/load.js",
"test:report": "vitest run --reporter=json --outputFile=test-results/unit.json && open coverage/index.html"

Fase 4 — PM Review Gate

O PM Review Gate é o momento em que o produto volta para validação de negócio. A implementação está completa, todos os testes passando — agora o PM verifica se o que foi construído resolve o problema original conforme os critérios de aceite definidos na Fase 0.

Preview deploy

# Deploy de preview — URL única por branch/commit
vercel --preview

# A URL gerada é enviada para o PM junto com:
# 1. Link para o REQUIREMENTS.md (critérios de aceite originais)
# 2. Lista de testes que passaram (relatório da Fase 3)
# 3. SECURITY_FINDINGS.md (findings do Security Agent)
# 4. Instruções específicas de como testar cada critério

Como o PM valida

O PM recebe a URL de preview, o REQUIREMENTS.md e o guia de teste. A validação é contra os critérios SMART definidos na Fase 0 — não contra uma impressão subjetiva. Cada critério é marcado como aprovado ou rejeitado com evidência.

Template de feedback estruturado

# PM Review — [Feature Name] — [Data]

## Resultado geral: [ ] APROVADO  [ ] REJEITAR COM FEEDBACK

## Critérios de aceite

| Critério | Status | Evidência / Observação |
|---|---|---|
| Tempo de resposta < 200ms p95 | APROVADO | Testei com DevTools: 145ms p95 |
| Taxa de erro < 0.1% | APROVADO | 0 erros em 30 min de uso |
| Fluxo em < 3 cliques | REJEITADO | Recuperação de senha exige 4 cliques |
| WCAG 2.1 AA | APROVADO | aXe extension: 0 violations |
| PII encriptado em repouso | A VERIFICAR | Requer confirmação do Security Agent |

## Feedback específico (apenas se REJEITADO)

### Critério: Fluxo de recuperação de senha
**Problema:** Tela de confirmação de email tem um passo extra desnecessário.
**Critério original:** "Fluxo de recuperação em < 3 cliques"
**Sugestão:** Remover a tela de "email enviado com sucesso" e redirecionar diretamente.
**Bloqueante:** Sim — não vai para prod assim.

## Próximos passos
- [ ] Time ajusta o fluxo de recuperação de senha
- [ ] Novo deploy de preview
- [ ] Re-validação apenas do critério afetado
Novo ciclo não é retrabalho — é refinamento. Quando a Fase 4 retorna para Fase 0, o feedback capturado no template acima torna o próximo ciclo mais rápido e mais preciso. O custo de um ciclo de refinamento no W6 é significativamente menor que o custo de um rollback em produção.

Fase 5 — Ship

Com o PM Review aprovado, a Fase 5 orquestra o processo de ship. /gsd:ship não é apenas criar um PR — é um conjunto de verificações finais que garantem que nada foi esquecido entre a validação e o merge.

/gsd:ship — o que acontece

# Executa o processo completo de ship
/gsd:ship

# Internamente, /gsd:ship faz:
# 1. Verifica que todos os testes estão passando no estado atual
# 2. Cria o PR via gh pr create com template padronizado
# 3. Executa o code-reviewer final pass
# 4. Roda npm audit para OWASP A06
# 5. Checa SECURITY_FINDINGS.md — findings bloqueantes impedem merge
# 6. Gera o CHANGELOG entry
# 7. Aguarda aprovação de reviewer humano antes de merge

Final pass do code-reviewer

O code-reviewer no W6 não é uma revisão de estilo — é uma auditoria técnica contra padrões SOLID e Clean Code configurados no CLAUDE.md do projeto:

# CLAUDE.md — seção de code review padrão W6

## Code Review Checklist (obrigatório antes de qualquer PR)

### Clean Code
- [ ] Funções com responsabilidade única (< 20 linhas na maioria dos casos)
- [ ] Nomes que revelam intenção (sem abbreviações obscuras)
- [ ] Zero comentários que explicam o que o código faz (apenas o porquê)
- [ ] Sem números mágicos — use constantes nomeadas

### SOLID
- [ ] SRP: nenhuma classe com mais de uma razão para mudar
- [ ] OCP: extensão via interface, não modificação de classe existente
- [ ] LSP: subclasses substituem superclasses sem surpresas
- [ ] ISP: interfaces pequenas e focadas (max 3-5 métodos)
- [ ] DIP: injeção de dependência via construtor, não instanciação direta

### Hexagonal Arch
- [ ] Domain core sem imports de infra (prisma, express, etc.)
- [ ] Adapters implementam Ports — nunca ao contrário
- [ ] Use cases dependem de Ports, nunca de Adapters diretamente

npm audit — gate OWASP A06

# Audit obrigatório — vulnerabilidades críticas e high bloqueiam o merge
npm audit --audit-level=high

# Se houver vulnerabilidades:
npm audit fix        # tenta auto-fix
npm audit fix --force  # USAR COM CUIDADO: pode introduzir breaking changes

# O que fazer com falsos positivos ou vulnerabilidades sem fix:
# 1. Criar .nsprc ou npm audit exception com justificativa documentada
# 2. Abrir issue de tracking com prazo de resolução
# 3. Revisor humano deve aprovar explicitamente a exceção

Alertas pré-produção (não depois)

Os alertas de observabilidade são configurados como parte do processo de ship — nunca como uma tarefa de "fazer depois do deploy":

# Checklist de alertas antes de merge para main

# 1. Error rate alert: > 1% em 5 minutos → PagerDuty
# 2. P95 latência > 500ms por 3 minutos → Slack #incidents
# 3. CPU > 80% por 5 minutos → auto-scale trigger
# 4. DB connections > 80% do pool → alerta preventivo

# Vercel Observability — configurar antes do deploy prod:
# - Log drain para sistema centralizado
# - Speed Insights habilitado
# - Web Analytics habilitado para monitorar Core Web Vitals

Post-mortem template (quando algo der errado em prod)

# Post-Mortem — [Título do Incidente]

**Severidade:** P0 / P1 / P2
**Duração:** [início] → [resolução]
**Impacto:** X usuários afetados, R$ Y de receita impactada

## Timeline
- 14:23 — Deploy de prod (commit abc123)
- 14:31 — Primeiros erros no Sentry (error rate 12%)
- 14:35 — Alerta PagerDuty disparado
- 14:40 — Rollback executado via `vercel rollback`
- 14:45 — Sistema estável, investigação iniciada

## Root Cause
[Análise técnica objetiva — sem culpar pessoas]

## O que o W6 detectou / não detectou
- [ ] TypeScript strict: não detectou (runtime error, não type error)
- [ ] Testes de integração: não cobriram esse edge case
- [ ] Load test: cobriu o volume, não a combinação de inputs

## Ações corretivas
- [ ] Adicionar teste de regressão para o caso exato que falhou
- [ ] Adicionar ao load test o padrão de tráfego que causou o incidente
- [ ] Revisar cobertura de testes na área afetada

Context Window no W6

Context Window Discipline é um cross-cutting concern em todos os workflows, mas no W6 tem regras mais rígidas porque múltiplos agentes rodam em paralelo e o Orchestrator Master precisa manter coerência entre todos.

Ator Limite Acao quando se aproxima
Orchestrator Master < 80K tokens ativos /compact antes de spawnar agentes da Fase 2
Backend Agent < 60K tokens /compact ao atingir 50K; estado persiste em arquivos
Frontend Agent < 60K tokens /compact ao atingir 50K; UI-SPEC.md permanece no contexto
Security Agent < 60K tokens Escreve SECURITY_FINDINGS.md incremental; compacta early

/compact obrigatório entre Fase 1 e Fase 2

O ponto mais crítico de Context Window Discipline no W6 é a transição entre Fase 1 e Fase 2. A Fase 1 acumula contexto de arquitetura denso. Antes de spawnar os três agentes paralelos, o Orchestrator deve compactar:

# Ao final da Fase 1, antes de spawnar agentes:
/compact

# O que preservar no CONTEXT.md antes de compactar:
# - Decisões arquiteturais tomadas (resumo dos ADRs)
# - Estrutura de diretórios acordada
# - Interfaces (Ports) definidas
# - Quais testes de contrato já existem e qual seu status
# - Dependências entre os agentes (qual aguarda o quê)

Handoffs via arquivo — nunca in-memory

Todos os handoffs entre fases e entre agentes ocorrem via arquivos explícitos. Um agente que termina escreve seu output em um arquivo. O próximo agente começa lendo esse arquivo. Isso garante que o estado do projeto sobrevive a resets de contexto, reinicializações e sessões diferentes.

# Estrutura de arquivos de handoff no W6:
docs/
  REQUIREMENTS.md      # Fase 0 → Fase 1 (assinado pelo PM)
  ADR.md               # Fase 0 → todas as fases
  UI-SPEC.md           # Fase 0 → Frontend Agent
  API_CONTRACT.md      # Backend Agent → Frontend Agent
  SECURITY_FINDINGS.md # Security Agent → Fase 5 (ship gate)
  CONTEXT.md           # Orchestrator → /compact summary
  CHANGELOG.md         # Atualizado em cada ship
Agentes são stateless por design. O estado do projeto vive nos arquivos — não na memória do agente. Um agente destruído e recriado deve ser capaz de retomar de onde parou apenas lendo os arquivos de handoff. Se isso não for verdade, os arquivos de handoff estão incompletos.

Checklist "Start Here"

Use esta checklist antes de iniciar cada fase. Pode ser copiada para o CLAUDE.md do projeto ou impressa como card de referência. Nenhuma fase deve iniciar com itens abertos da fase anterior.

Fase 0 — Product Discovery antes de iniciar
  • PRD entregue pelo PM com critérios SMART mensuráveis
  • Itens fora de escopo explicitamente listados no PRD
  • /gsd:discuss-phase executado — sem gaps no entendimento
  • ADR.md criado com pelo menos uma entrada por decisão arquitetural relevante
  • UI-SPEC.md gerado via /gsd:ui-phase
  • REQUIREMENTS.md aprovado e assinado pelo PM
  • Restrições técnicas documentadas (versões, constraints de infra)
Fase 1 — Architecture First antes de escrever código
  • Mapeamento hexagonal desenhado: domain core, ports, adapters identificados
  • Entities e Value Objects definidos — sem dependências externas
  • Interfaces (Ports) escritas como TypeScript interfaces
  • Testes de contrato escritos para cada Port (status: RED)
  • Estrutura de diretórios criada (src/domain/, src/infra/, src/app/)
  • tsconfig.json com strict mode habilitado
  • /compact executado no Orchestrator antes de avançar
  • CONTEXT.md atualizado com resumo das decisões arquiteturais
Fase 2 — Execução Paralela antes de spawnar agentes
  • Contexto do Orchestrator Master está abaixo de 80K tokens
  • Backend Agent recebeu: REQUIREMENTS.md + ADR.md + src/domain/ + testes de contrato
  • Frontend Agent recebeu: UI-SPEC.md (API_CONTRACT.md será provido pelo Backend Agent)
  • Security Agent recebeu: REQUIREMENTS.md + ADR.md + OWASP checklist
  • Protocolo de handoff definido: Backend Agent escreve API_CONTRACT.md antes do Frontend iniciar endpoints
  • Limite de 60K tokens por agente configurado na instrução inicial
Fase 3 — Testing Pyramid antes de avançar para PM review
  • tsc --noEmit --strict: zero erros
  • eslint . --max-warnings 0: zero warnings
  • Vitest unit: coverage > 80% no domínio (lines, functions, branches)
  • Vitest integration: todos os testes de contrato passando (GREEN)
  • Cypress E2E: todas as jornadas críticas passando headless
  • k6 load test: p95 < 200ms, error rate < 0.1%
  • k6 stress test: relatório de capacidade gerado (não necessariamente passando)
  • SECURITY_FINDINGS.md revisado — findings bloqueantes endereçados
Fase 4 — PM Review Gate antes de ship
  • vercel --preview executado — URL de preview disponível
  • PM recebeu: URL + REQUIREMENTS.md + relatório de testes + SECURITY_FINDINGS.md
  • PM validou cada critério SMART individualmente
  • Template de feedback preenchido (mesmo que resultado seja aprovação)
  • Resultado: APROVADO (caso contrário, retorna para Fase 0 com feedback)
Fase 5 — Ship antes de merge
  • /gsd:ship executado
  • gh pr create com template completo (contexto, testes, evidência de PM approval)
  • code-reviewer final pass: SOLID, Clean Code, Hexagonal Arch
  • npm audit --audit-level=high: zero vulnerabilidades críticas ou high sem exceção documentada
  • Alertas de observabilidade configurados (error rate, latência, recursos)
  • Log drain e Speed Insights habilitados no Vercel
  • CHANGELOG.md atualizado
  • Revisor humano aprovou o PR
  • Post-mortem template disponível na wiki (para quando — não se — algo der errado)
Copie para seu CLAUDE.md: Cole esta checklist na seção ## Pre-ship Checklist do CLAUDE.md do projeto. O Claude vai referenciar automaticamente antes de cada operação de ship, garantindo que nenhum item seja esquecido independentemente de quem está na sessão.

Hooks no Stack Ideal

O W6 usa o conjunto mais completo de hooks — incluindo o gate de import boundaries para arquitetura hexagonal, cobertura mínima de testes e verificação de segredos. É a camada determinística que complementa cada fase do workflow.

Filosofia: No Stack Ideal, hooks não são opcionais. Cada fase tem gates mecânicos. O PM não revisa código com testes falhando ou vulnerabilidades — os hooks impedem que isso aconteça.

settings.json completo — W6 Stack Ideal

{
  "hooks": {
    "PostToolUse": [
      {
        "matcher": "Write|Edit",
        "hooks": [
          {"type": "command", "command": "node scripts/quality-gate.mjs \"$CLAUDE_TOOL_INPUT_FILE_PATH\""},
          {"type": "command", "command": "node scripts/check-boundaries.mjs \"$CLAUDE_TOOL_INPUT_FILE_PATH\""}
        ]
      }
    ],
    "PreToolUse": [
      {
        "matcher": "Bash",
        "hooks": [{"type": "command", "command": "node scripts/bash-guard.mjs"}]
      }
    ],
    "Stop": [
      {
        "hooks": [{"type": "command", "command": "node scripts/coverage-check.mjs"}]
      }
    ]
  }
}

coverage-check.mjs — gate de cobertura mínima

#!/usr/bin/env node
// coverage-check.mjs — verifica cobertura mínima ao final de cada resposta
import { execSync } from 'node:child_process';

try {
  execSync(
    'npx vitest run --coverage --coverage.thresholds.lines=80 --coverage.thresholds.functions=80 --reporter=dot',
    { stdio: 'inherit' }
  );
  console.log('[coverage-check] OK: cobertura acima dos thresholds mínimos');
} catch {
  console.error('[coverage-check] AVISO: cobertura abaixo do mínimo (80% lines, 80% functions)');
  console.error('[coverage-check] Verifique: domain/ deve ter 80%+, use cases críticos 100%');
  // Warning, não bloqueia — o PM gate é quem decide
}

Mapeamento hooks x fases do W6

FaseHook ativoGate
Fase 1 — Architecture FirstPostToolUse Write + check-boundariesimport boundaries da arquitetura hexagonal
Fase 2 — Implementação paralelaPostToolUse Write + quality-gatetsc + ESLint + secrets + testes
Fase 3 — Testing PyramidStop + coverage-checkcobertura mínima 80%
Fase 5 — ShipPreToolUse Bash + bash-guardbloqueia force push + comandos destrutivos

Scripts completos (quality-gate.mjs, bash-guard.mjs, check-boundaries.mjs) no Módulo 22 — Fundamentos.