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.
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.
W6 completo: 6 fases, 3 agentes paralelos, 5 níveis de teste, 2 gates de PM.
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 Verceldiscuss-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 performanceADR.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 requestUI-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 MonoREQUIREMENTS.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()
); 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 expiradoQuando 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
/compactao 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.
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": trueNí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'],
},
};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érioComo 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 afetadoFase 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 mergeFinal 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 diretamentenpm 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çãoAlertas 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 VitalsPost-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 afetadaContext 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 shipChecklist "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.
- 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)
- 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
- 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
- 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
- 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)
- /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)
## 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.
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
| Fase | Hook ativo | Gate |
|---|---|---|
| Fase 1 — Architecture First | PostToolUse Write + check-boundaries | import boundaries da arquitetura hexagonal |
| Fase 2 — Implementação paralela | PostToolUse Write + quality-gate | tsc + ESLint + secrets + testes |
| Fase 3 — Testing Pyramid | Stop + coverage-check | cobertura mínima 80% |
| Fase 5 — Ship | PreToolUse Bash + bash-guard | bloqueia force push + comandos destrutivos |
Scripts completos (quality-gate.mjs, bash-guard.mjs, check-boundaries.mjs) no Módulo 22 — Fundamentos.