Inventário técnico

Débitos técnicos

Tudo o que hoje custa tempo, dinheiro ou risco no AZ Collections 3.0 — o que é cada problema, por que ele dói, onde afeta e como se resolve.

  • Projeto AZ Collections 3.0
  • Levantado em 21/08/2026
  • Itens 11
  • Base leitura do código dos 5 repositórios

O que é débito técnico

Débito técnico é o custo futuro de uma decisão tomada hoje para ir mais rápido. Nem sempre é erro: às vezes é a escolha certa — entregar antes, decidir depois. O problema não é contrair a dívida, é perder a conta dela.

A metáfora é a de um empréstimo, e ela é literal em dois aspectos. Primeiro, existe juros: cada dia com o atalho no lugar, todo trabalho que passa por perto fica um pouco mais caro. Um serviço com 2.000 linhas não atrasa uma tarefa só — atrasa todas as que o tocarem, para sempre, até alguém quebrá-lo. Segundo, existe vencimento: alguns débitos são cobrados de uma vez, sem aviso. Um servidor apertado não cobra nada enquanto o movimento é pequeno — e cobra tudo junto no dia em que deixa de ser.

Por isso este documento não é uma lista de reclamações, e sim um balanço. Cada item traz o que é, o dano concreto que causa, onde ele aparece e o caminho de saída. O que se decide depois é ordem de pagamento — e essa decisão é de negócio, não de engenharia.

O que este documento não é

Não é uma crítica a quem escreveu o código. A maior parte dos itens abaixo é resultado de decisões corretas para o momento em que foram tomadas — um sistema em reconstrução acumula dívida por definição. O valor de escrever tudo é justamente parar de pagar juros sem saber.

O balanço

11 Itens mapeados

Todos com evidência medida no código, não estimada.

1 Crítico

Atinge o usuário final no pior momento — o da virada.

4 Altos

Cobram juros todo dia, em velocidade de entrega. Outros 5 são médios.

3 Antes da virada

O que precisa sair da frente para publicar com segurança.

Os 11 itens, na ordem em que aparecem neste documento.
# Débito Área Severidade Antes da virada?
01Três arquiteturas convivendo no coreBackendAltoNão
02Serviços-monstro de até 2.056 linhasBackendAltoNão
03Suíte de testes que não sabe reprovarBackendMédioNão
04Dashboard consultando o banco de produçãoDashboardAltoNão
05Dashboard defasada do 3.0DashboardMédioNão
06Produção subdimensionada para o que vai receberInfraestruturaCríticoSim
07Chat 3.0 nunca publicado, e a topologia mal descritaInfraestruturaAltoSim
08Nenhum serviço tem redundânciaInfraestruturaMédioNão
09Nenhuma visibilidade de erros no aplicativoAplicativoMédioSim
10Funcionalidades desligadas sem data de voltaAplicativoBaixoNão
11Quatro versões de Prisma em quatro serviçosConsistênciaMédioNão

Backend principal

3 itens
01

Três arquiteturas convivendo no mesmo servidor

Alto api.collectionsaz.com · src/
O que é

O servidor principal tem 92.341 linhas de código organizadas de três formas diferentes ao mesmo tempo, sem fronteira declarada entre elas:

as três organizações, lado a lado em src/1. Camadas (o legado) src/controllers/ 57 arquivos src/services/ 78 arquivos src/db/repositories/ 46 arquivos 2. DDD por contexto (o 3.0) src/v3/ identity · collection · feed · finance interests · notifications · search · social 3. Módulo isolado (nem um nem outro) src/modules/shipping/ e ainda: src/mechanisms/ src/share/ src/workers/

A regra oficial do projeto é clara — funcionalidade nova nasce em src/v3/ no padrão DDD, código legado só recebe correção no lugar. O problema não é a regra: é que nada no código a torna visível. Quem chega não distingue as três zonas, e as ferramentas não impedem que uma invada a outra.

O problema

Toda tarefa começa com a mesma pergunta perdida: onde isso deveria morar? E como a resposta depende de quem está fazendo, o mesmo tipo de regra acaba escrito em dois lugares — uma vez no serviço antigo, outra no caso de uso novo. Quando divergem, divergem em silêncio: as duas versões continuam funcionando, dando respostas diferentes.

O custo não aparece numa tarefa específica. Ele aparece como lentidão constante em todas, e como uma classe de bug difícil de rastrear — o comportamento muda conforme o caminho que a requisição tomou.

Onde afeta

Em toda funcionalidade nova que toca o servidor principal, e com força maior nas áreas onde 2.0 e 3.0 se encostam: loja, checkout, pedidos e perfil. Também afeta a entrada de qualquer pessoa nova no projeto, que precisa aprender três convenções antes de escrever a primeira linha.

A solução

Não é reescrever o servidor. Reescrita grande de sistema em produção costuma custar o dobro do previsto e entregar o mesmo comportamento — com bugs novos. O caminho é tornar a fronteira explícita e deixar o legado encolher sozinho:

  1. Escrever a regra como documento curto de decisão (ADR) dentro do repositório, com exemplos dos dois lados.
  2. Marcar o legado como zona congelada — um README em cada pasta antiga dizendo o que pode e o que não pode acontecer ali.
  3. Ligar uma verificação automática que impeça src/v3/ de importar do legado. É o que transforma a regra em garantia.
  4. Absorver src/modules/shipping/ num dos dois lados, eliminando o terceiro padrão.
  5. A partir daí, cada funcionalidade nova nasce certa, e o legado só diminui.
Considerações

Cobre a fronteira inteira: o documento de decisão, a marcação das zonas, a verificação automática e a absorção do módulo solto. Não resolve o legado que já existe — isso é o item 02 —, mas estanca o crescimento da dívida, que é o mais urgente dos dois.

02

Serviços-monstro: até 2.056 linhas num arquivo só

Alto api.collectionsaz.com · src/services, src/db/repositories
O que é

Cinco arquivos concentram as regras mais importantes do negócio — venda, troca, checkout e conta — e cada um cresceu muito além do que se lê de uma vez:

os maiores arquivos do servidor principal2.056 src/services/store-service.ts loja, anúncios, etiquetas 1.461 src/db/repositories/item-repository.ts 1.383 src/services/trade-service.ts trocas 1.226 src/services/checkout-service.ts pagamento 1.020 src/services/user-service.ts conta 879 src/services/auth-service.ts
O problema

Arquivo desse tamanho não cabe na cabeça de ninguém de uma vez. Na prática isso produz três efeitos, todos caros:

  • Mudança arriscada. Alterar uma linha do checkout exige entender 1.226 para ter certeza de que nada mais dependia dela. Como ninguém faz isso toda vez, a certeza vira torcida.
  • Teste difícil. Para testar um comportamento pequeno é preciso montar todo o resto do serviço. É por isso que a cobertura fica baixa justamente onde o dinheiro passa.
  • Conflito constante. Duas pessoas mexendo em coisas não relacionadas colidem no mesmo arquivo.
Onde afeta

Diretamente no coração comercial: venda, troca, pagamento e envio. São exatamente as áreas em que um bug custa dinheiro de verdade — e as que mais recebem alteração, porque são as que o negócio mais mexe.

A solução

Quebrar por caso de uso, um de cada vez, e só quando houver motivo para tocar no arquivo. Refatoração em bloco de código que ninguém pediu para mudar é risco sem retorno.

  1. Antes de mexer, escrever testes que descrevem o comportamento atual — inclusive o esquisito. Eles são a rede: se algum quebrar depois, a extração mudou o que não devia.
  2. Extrair um caso de uso por vez (“comprar etiqueta”, “calcular frete”), com o serviço antigo passando a apenas chamar o novo.
  3. Quando o serviço antigo virar só uma lista de chamadas, apagá-lo.

Essa é a parte do trabalho em que a IA mais ajuda: mapear todos os pontos de uso e gerar os testes de caracterização é lento para uma pessoa e rápido com assistência.

Considerações

O maior item da lista, e também o mais diluível: não precisa virar projeto próprio. Cada vez que uma tarefa encostar num desses arquivos, ela paga a extração daquele pedaço. Assim o custo se dissolve nas entregas e o risco de cada passo fica pequeno.

03

Uma suíte de testes que não sabe reprovar

Médio api.collectionsaz.com · configuração do Jest
O que é

O servidor principal tem 93 arquivos de teste, mas rodar a suíte sempre termina em erro — mesmo com todos os testes passando. A causa é uma exigência de cobertura mínima configurada acima do que o projeto tem hoje: o Jest considera isso uma falha e encerra sinalizando erro.

Na prática, quem roda os testes aprendeu a ignorar o resultado final e ler a linha Tests: no meio da saída.

O problema

Um teste só vale enquanto alguém confia nele. Como o resultado é sempre “erro”, ele deixou de ser um sinal — e um teste que realmente quebrasse passaria despercebido no meio do erro de sempre.

É também o motivo de não existir portão automático nas mudanças: não dá para pedir que a esteira barre código quebrado quando a suíte reprova sempre.

Onde afeta

Em toda alteração do servidor principal. É o débito que encarece todos os outros: sem rede de testes confiável, quebrar os serviços-monstro do item 02 fica bem mais arriscado do que precisaria ser.

A solução
  1. Separar as duas coisas: um comando roda os testes e responde só sobre eles; outro, separado, mede cobertura.
  2. Ajustar a exigência de cobertura para o número real de hoje, travando o que existe.
  3. Subir esse número aos poucos, conforme as extrações do item 02 forem trazendo testes novos.
  4. Com o resultado voltando a ser confiável, ligar o portão na esteira.
Considerações

Mudança de configuração, não de código — o melhor retorno de toda a lista. Destrava a confiança na suíte inteira e, com ela, a segurança para atacar o item 02.

Dashboard administrativa

2 itens
04

A dashboard consulta o banco de produção direto

Alto az-dash.collectionsaz.com · az-dash-api
O que é

A dashboard aponta para o mesmo banco que atende o aplicativo, e não faz consultas leves: são relatórios com contagens e agregações escritos à mão.

consultas da dashboard sobre o banco de produção20 consultas SQL escritas à mão ($queryRawUnsafe) 14 contagens (.count) 4 listagens sem limite de linhas 0 escritas em SQL cru
O problema

Relatório e venda disputam a mesma máquina. Quando alguém do time abre um painel pesado, o banco divide memória e disco entre a consulta administrativa e o checkout de um cliente — e o cliente é quem espera.

O sintoma é traiçoeiro porque aparece longe da causa: o aplicativo fica lento em um horário específico e ninguém liga o fato a alguém consultando um relatório.

Onde afeta

Na experiência de todo mundo que usa o aplicativo enquanto o time consulta a dashboard. O risco cresce com a base: quanto mais dados, mais cara cada agregação, e hoje não há teto — uma consulta pesada pode segurar o banco sem limite de tempo.

A solução

Em escada, do mais barato ao mais caro — e possivelmente parando no segundo degrau:

  1. Medir antes de construir. Ligar a medição de consultas do PostgreSQL e descobrir quais realmente doem. Lentidão de painel quase sempre é índice faltando, não falta de servidor.
  2. Índices e um teto de tempo. Um limite por consulta no usuário da dashboard impede que qualquer relatório trave a produção. Duas linhas de configuração.
  3. Resumos pré-calculados para os números que toleram alguns minutos de atraso — e quase todo número de painel tolera. Tira o peso sem máquina nova.
  4. Só então, uma réplica de leitura. Cópia do banco que se atualiza sozinha e recebe as consultas pesadas.
Sobre a réplica, se chegar a esse ponto

A dashboard também escreve — em 13 áreas, incluindo o próprio login. Réplica só de leitura, sozinha, quebraria o painel. A saída limpa é a extensão de réplicas do Prisma: uma única conexão no código, com leituras indo para a cópia e escritas para o banco principal, sem alterar nenhuma chamada existente.

Vale ainda preferir a réplica física à seletiva: ela acompanha sozinha as mudanças de estrutura do banco, enquanto a seletiva exigiria repetir cada alteração à mão. E como a dashboard usa quase todas as tabelas, escolher um subconjunto não traria ganho.

Considerações

Os dois primeiros degraus são os baratos, e podem encerrar o assunto sozinhos. Vale percorrê-los antes de decidir os últimos: construir réplica sem medir é resolver um problema que talvez não exista.

05

A dashboard não enxerga o mundo 3.0

Médio az-dash.collectionsaz.com · prisma/schema.prisma
O que é

A dashboard conhece pouco mais da metade das tabelas do sistema, e ainda administra uma que o 3.0 aposentou:

cobertura da dashboard sobre o bancoservidor principal 81 tabelas dashboard 47 tabelas (58%) ───────────────── não administradas 34 tabelas ainda modela negotiation → substituída pelo chat 3.0 não conhece AZ Play · propostas · coleções do 3.0
O problema

Tudo o que a versão 3.0 criou não tem tela de administração. Se um vídeo do AZ Play precisar ser removido, uma proposta de troca precisar ser conferida ou uma moderação precisar de revisão, não há por onde — só consultando o banco à mão.

E administrar pelo banco é o pior dos mundos: sem registro de quem fez, sem validação e com risco de escrever no lugar errado.

Onde afeta

No atendimento e na moderação, exatamente depois da virada — quando o volume de conteúdo 3.0 passa a ser o volume principal. O débito é pequeno hoje e cresce sozinho no dia em que a 3.0 entrar no ar.

A solução
  1. Regenerar a descrição do banco a partir do servidor principal, trazendo as 34 tabelas ausentes.
  2. Remover o que ficou órfão, como a tabela de negociação substituída pelo chat.
  3. Listar, com o time de atendimento, quais das novas realmente precisam de tela — provavelmente poucas: AZ Play, propostas e a fila de moderação.
  4. Construir só essas.
Considerações

Pôr a descrição do banco em dia é a parte barata, e já elimina o risco de administrar uma tabela morta. As telas novas vêm depois — e só as que o atendimento apontar como necessárias.

Infraestrutura e produção

3 itens · concentra os bloqueantes
06

A produção está subdimensionada para o que vai receber

Crítico servidor de produção · 2 vCPU · 8 GB · 80 GB
O que é

Um único servidor de 2 núcleos e 8 GB hospeda hoje três serviços — e o plano de virada prevê colocar mais dois na mesma máquina:

o que roda e o que está previsto, com o teto de memória de cada umhoje servidor principal 1 GB (+ 512 MB do envio de e-mails) dashboard ~512 MB chat legado 512 MB ─────── ~2,5 GB previsto pela virada + serviço de mídia 2 GB + chat 3.0 512 MB ─────── total ~5 GB de teto, em 8 GB de máquina processos 5, para 2 núcleos
O problema

A memória até cabe, apertada. O que não cabe é o processamento: o serviço de mídia analisa cada imagem e vídeo com dois modelos de inteligência artificial que rodam na própria máquina. Um único vídeo passa por dez análises em sequência.

Enquanto isso acontece, os dois núcleos ficam ocupados — e quem perde processamento é o servidor principal, no meio de um checkout. O sintoma aparece como lentidão na compra, a quilômetros da causa real.

Cluster não resolve — piora

Ligar mais instâncias de cada serviço não multiplica processadores: cria mais processos disputando os mesmos 2 núcleos, cada um com sua própria cópia da memória. No serviço de mídia, cada instância carregaria os dois modelos outra vez. A conta passaria de 8 GB antes de contar sistema e banco.

Onde afeta

No aplicativo inteiro, no pior momento possível: no dia da virada, quando o volume muda e todo mundo está olhando. E impede, na prática, ligar a moderação automática de conteúdo — que é uma proteção de marca, não um enfeite.

A solução

Separar em duas máquinas, deixando o servidor principal sozinho:

  1. Contratar um servidor para mídia, chat e dashboard. Com moderação ligada, 4 núcleos e 16 GB é o mínimo confortável; sem ela, 2 e 8 bastam.
  2. Instalar o executor de deploy nesse servidor com uma identificação própria — a mudança nas esteiras é de uma linha em cada.
  3. Mover a dashboard primeiro: já existe, é interna e serve de ensaio para validar deploy, certificado e troca de endereço com risco baixo.
  4. Depois chat e mídia, que ganham endereço próprio na internet.
  5. Virar com a moderação desligada e ligá-la em seguida, medindo.
A favor do prazo

Banco de dados e fila de mensagens de produção já ficam fora dessa máquina. Os serviços não guardam estado local, então mudá-los de servidor é reinstalar e apontar o endereço — não migrar dados.

Considerações

Boa parte do trabalho já estava prevista no plano de virada, que também precisaria criar endereço, certificado e banco para a mídia — só que no servidor errado. O acréscimo real sobre o que já estava planejado é a mudança da dashboard.

07

O chat 3.0 nunca subiu — e a topologia estava mal descrita

Alto chat.collectionsaz.com · branch master vs dev3.0
O que é

O chat que atende os usuários hoje é um serviço próprio, mas roda debaixo do endereço do servidor principal: um processo separado na porta 8282, ao qual o servidor web encaminha o caminho /socket.io/. De fora parece um sistema só.

o que roda hoje vs. o que está prontoem produção branch master, último código de 21/05/2026 pronto branch dev3.0, 41 commits à frente endereço chat.collectionsaz.com não existe no DNS (o serviço responde pelo endereço do servidor principal)
O problema

O chat reconstruído — com negociação, propostas e troca — está pronto há meses e nunca foi publicado. Todo o valor dele está parado.

Pior que isso: a documentação de virada afirmava que o chat “já tem servidor, endereço e certificado no ar”. É verdade sobre o servidor principal, que hospeda o chat antigo — e falso sobre o serviço novo, que não tem endereço nenhum. Planejamento feito sobre essa frase subestima o trabalho.

Onde afeta

Na negociação entre comprador e vendedor, que é o coração do marketplace, e no planejamento da virada, que contava com uma etapa já pronta que não estava.

A solução

Há uma vantagem escondida aqui: como o chat antigo atende por outro endereço, os dois podem conviver.

  1. Criar o endereço próprio do chat e subir a versão 3.0 no servidor novo, com o legado ainda no ar.
  2. Testar à vontade, sem afetar ninguém.
  3. Migrar as conversas antigas para o formato novo — o roteiro já existe no repositório.
  4. Virar pelo aplicativo, que já aponta para o endereço novo por padrão.
  5. Manter o legado enquanto houver versão antiga do app nas mãos dos usuários — quem não atualizar continua com chat funcionando.
  6. Corrigir a descrição da topologia na aba de virada.
Considerações

Subir e apontar é a parte rápida; a migração das conversas antigas é a que pede atenção. E nada disso tem interrupção de serviço, graças à convivência entre os dois chats.

08

Nenhum serviço tem redundância

Médio todos os serviços · ecosystem.config
O que é

Todos os serviços rodam como um único processo, sem cópia de reserva. Se ele cai, reinicia, ou estoura o limite de memória configurado, o serviço fica fora do ar até subir de novo — alguns segundos em que ninguém é atendido.

O problema

Não é só o risco de queda: é que toda publicação de versão é uma pequena indisponibilidade. Com processo duplicado, dá para atualizar um de cada vez e ninguém percebe. Com processo único, toda entrega interrompe o atendimento.

Onde afeta

No servidor principal, onde a interrupção atinge todo mundo ao mesmo tempo. E na frequência de publicação: quando cada entrega custa uma pequena queda, o time naturalmente entrega menos vezes — o que torna cada entrega maior e mais arriscada.

A solução

Depende do item 06 estar resolvido. Com 2 núcleos e cinco processos já disputando, duplicar hoje pioraria as coisas. Depois de separar as máquinas, o servidor principal fica sozinho e pode rodar em duas cópias, com atualização alternada.

Considerações

A mudança de configuração é de poucas linhas — quase todo o trabalho é teste. Só faz sentido depois da separação de servidores do item 06.

Aplicativo

2 itens
09

Se o aplicativo quebrar em produção, ninguém fica sabendo

Médio azcollections-mobile
O que é

As ferramentas de monitoramento estão instaladas no aplicativo, mas não estão ligadas no código. Nenhum erro é reportado. A única forma de descobrir que algo quebrou é o usuário reclamar — ou avaliar mal na loja.

O problema

No servidor dá para ler os registros e investigar. No aplicativo, não: ele roda no aparelho do usuário, em versões de sistema e modelos que ninguém tem à mão. Sem reporte automático, um defeito que atinge um aparelho específico pode durar semanas invisível.

A conta fica pior logo após a virada, que é justamente quando o volume de erro novo é maior e a janela para reagir é menor.

Onde afeta

Na capacidade de reagir depois da publicação. Não impede a virada — define quanto tempo se leva para descobrir que ela deu errado.

A solução
  1. Ligar o reporte de erros que já está instalado, associando cada erro à versão do aplicativo.
  2. Marcar as telas críticas — login, checkout, chat — para saber onde o erro aconteceu.
  3. Configurar aviso automático quando a taxa de erro subir depois de uma publicação.
Considerações

A biblioteca já está no projeto; o trabalho é ligar, marcar as telas críticas e conferir que o erro chega. Deve ficar pronto antes da virada — é o que permite enxergar o que acontecer depois dela.

10

Funcionalidades desligadas sem data para voltar

Baixo azcollections-mobile · marketplace/detail
O que é

Duas partes da página do produto estão comentadas no código, com o motivo registrado:

  • Avaliações — a lista de depoimentos saiu da ficha do produto. A nota do vendedor continua visível, só a lista saiu.
  • Selo de autenticidade — removido porque prometia uma verificação que não existe: hoje quem declara o estado e a autenticidade da peça é o próprio vendedor.

Os dois são desvios conscientes do design aprovado, e estão documentados. Não é código esquecido — é decisão registrada.

O problema

Código comentado envelhece mal. Ele continua sendo lido, continua confundindo quem chega, e vai ficando incompatível com o resto — até que religar deixe de ser descomentar e passe a ser reescrever.

O caso do selo de autenticidade é o mais interessante: a decisão de removê-lo foi acertada, porque a promessa era falsa. O débito não é o código comentado — é a funcionalidade que falta por trás dele.

Onde afeta

Pouco no dia a dia. Afeta a confiança do comprador — avaliações e selo de procedência são o que sustenta a decisão de comprar de um desconhecido — e a fidelidade ao design aprovado.

A solução
  1. Decidir, com o produto, se cada uma volta. São decisões de negócio, não técnicas.
  2. As avaliações são de vendedor, não de produto: se voltarem, o lugar natural é o perfil público dele.
  3. O selo de autenticidade só deve voltar acompanhado de alguma verificação real — senão o débito volta junto.
  4. O que não voltar, apagar: a decisão fica registrada na documentação, e o código para de confundir.
Considerações

Dominado pela decisão, não pela execução: religar é descomentar, remover é apagar. O que trava é definir se cada uma volta — e o selo de autenticidade só deveria voltar acompanhado de uma verificação real.

Consistência e documentação

1 item
11

Quatro serviços, quatro versões de Prisma

Médio core · mídia · chat · dashboard
O que é

Os quatro serviços acessam banco com a mesma ferramenta, em quatro versões diferentes — três delas com anos de diferença entre si:

versão do Prisma por serviçoservidor principal 5.14 serviço de mídia 5.22 chat 6.8 dashboard 7.4
O problema

O conhecimento não transfere. A forma de escrever uma migração, o comportamento das transações e as mensagens de erro mudam entre versões maiores — então cada serviço tem suas próprias manhas, e o que se aprendeu num não vale no outro.

E o custo cresce sozinho: quanto mais tempo passa, maior o salto de versão acumulado e mais caro fica atualizar. É o exemplo mais literal de juros da lista.

Onde afeta

Em quem trabalha em mais de um serviço — o que, num time pequeno, é todo mundo. E aparece com força na virada, quando várias migrações precisam rodar em ordem, em serviços diferentes, sob janela de manutenção.

A solução
  1. Escolher a versão alvo — a mais nova já em uso, a da dashboard.
  2. Subir um serviço por vez, começando pelo de mídia, que é o menor e o mais isolado.
  3. O servidor principal por último, porque é o que tem mais superfície e mais risco.
  4. Fazer isso fora da janela de virada. Atualizar ferramenta de banco na véspera de uma migração grande é somar dois riscos sem necessidade.
Considerações

Tarefa mecânica, com guia de migração público — o tipo em que a assistência de IA rende bem. O que importa é quando: fora da janela de virada, nunca na véspera.

Em que ordem pagar

A lista não precisa ser paga de uma vez — e não deve. A ordem abaixo separa o que bloqueia a virada do que pode ser diluído nas entregas normais.

Três blocos, em ordem de urgência.
Bloco Itens Por quê
Antes da virada 06 · 07 · 09 Sem estes, a virada acontece com o servidor apertado, o chat novo parado e sem ninguém enxergando o que quebrar do outro lado.
Logo depois 03 · 04 · 08 Nenhum impede publicar, mas todos ficam mais caros com a base maior. O item 03 vem primeiro: é configuração, e devolve a confiança nos testes.
Diluído nas entregas 01 · 02 · 05 · 10 · 11 Não viram projeto próprio. Cada tarefa que encostar num serviço-monstro paga a extração daquele pedaço; a fronteira de arquitetura entra na próxima funcionalidade do servidor.
Se só houver espaço para um

O item 03. É o mais barato da lista e o único que torna todos os outros mais seguros: sem uma suíte de testes em que se confie, quebrar os serviços-monstro do item 02 é trabalhar sem rede.