Skip to content

Remove the leftovers of the old plan (unused packages, Mailpit, template extras) #34

Description

@MendesMat

Contexto

O plano anterior a 2026-10-05 deixou no código pacotes e peças sem uso: uma biblioteca de mocks, a caixa de e-mail de teste, versões de pacotes de e-mail e de cache, e extras do modelo do Aspire e do Visual Studio. Eles estão listados em docs/decisoes-de-arquitetura.md, na tabela "O que ainda reflete o plano antigo". Esta issue os remove e corrige a documentação que os descreve como presentes. É a etapa 3 do plano de simplificação e o ensaio dos três comandos.

Escopo

Nenhum comportamento da API muda. Nenhum pacote é adicionado.

  • NSubstitute (decisão 27): sai de ControlService.Application.Tests.csproj e de Directory.Packages.props.
  • Mailpit (decisão 31): saem de AppHost.cs o recurso, o WithReference, o WaitFor e o comentário; sai o pacote CommunityToolkit.Aspire.Hosting.MailPit do .csproj do AppHost e do Directory.Packages.props; o comentário do .csproj do AppHost é corrigido.
  • Versões sem uso (decisão 30): MailKit, Microsoft.Extensions.Caching.Hybrid e FluentValidation.DependencyInjectionExtensions saem de Directory.Packages.props. O comentário "Ready for the next slices" é reescrito, porque o grupo passa a ter só pacotes em uso.
  • Service discovery e resiliência de HTTP (decisão 31): saem de ServiceDefaults/Extensions.cs as linhas 22 a 27; saem os pacotes Microsoft.Extensions.ServiceDiscovery e Microsoft.Extensions.Http.Resilience do .csproj e do Directory.Packages.props; o comentário do .csproj é corrigido.
  • Pacote preview do Visual Studio (decisão 33): sai Microsoft.VisualStudio.Azure.Containers.Tools.Targets de ControlService.API.csproj e de Directory.Packages.props, com as propriedades DockerDefaultTargetOS e DockerfileContext e o perfil "Container (Dockerfile)" de launchSettings.json.
  • Mudança em .github/ autorizada: tirar "NSubstitute" do grupo testing de dependabot.yml. Nada mais nesse arquivo.
  • Documentação, no mesmo pull request:
    • README.md: as linhas "Local environment" e "Tests" da tabela, a descrição do ServiceDefaults na árvore e a frase "Start PostgreSQL, Mailpit and the API".
    • backend/ControlService/README.md: a frase do Aspire, a linha do Mailpit nas duas tabelas e "pare os dois" (passa a ser um contêiner).
    • docs/agents/guides/local-environment.md: a frase do Aspire e a linha do Mailpit nas três tabelas.
    • docs/decisoes-de-arquitetura.md:
      • remover as cinco linhas da tabela "O que ainda reflete o plano antigo" (fica a do CI, da Check formatting in CI #35);
      • remover os parágrafos "Sobras do plano antigo" das decisões 31 e 33;
      • na decisão 30, trocar o parágrafo "Sobras do plano antigo" por uma nota: uma versão só é declarada quando um projeto a usa; FluentValidation.DependencyInjectionExtensions foi removido por falta de uso e pode voltar se houver justificativa (por exemplo, registrar os validadores automaticamente);
      • na decisão 6, acrescentar uma nota: um helper de uma linha para registrar handlers validados foi avaliado em 2026-10-07 e adiado, porque só existe um handler validado; reavaliar no levantamento da primeira issue que registrar o segundo (Permission profiles and screen catalog endpoints #10 ou Users endpoints with a temporary password #11).

Fora do escopo

Dependências

Riscos

  • Um pacote removido trazia outro de carona que o código usa — o build falha com tipo ou método não encontrado. Corrigir a causa, sem devolver o pacote; se não houver saída, parar e avisar.
  • A API não subir pelo AppHost sem a descoberta de serviços — T04 falha. A connection string do banco chega por WithReference(database), que não depende dela.
  • Outra ferramenta ler DockerDefaultTargetOS ou DockerfileContext — T05 falha.
  • O contêiner controlservice-mailpit continua ligado na máquina do dono — aparece no Docker Desktop; não afeta o sistema.

Decisões do levantamento

Tomadas pelo dono em 2026-10-07.

  • Helper de registro de handlers validados: não criar agora — há um uso só; fica anotado na decisão 6 e na Permission profiles and screen catalog endpoints #10 para ser reavaliado.
  • Comentários T12/D3: issue própria — pedem revisão de leitura em 42 arquivos, e não a prova por build desta issue.
  • Remover também os restos do pacote do Visual Studio (duas propriedades e o perfil de execução) — sem o pacote, ficam quebrados.
  • Remover FluentValidation.DependencyInjectionExtensions — versão sem uso, como o MailKit; a decisão 30 registra que pode voltar com justificativa.
  • Tirar "NSubstitute" do dependabot.yml — única mudança em .github/.
  • Manter a instrumentação de HttpClient do OpenTelemetry — pertence à decisão 32 e não está na tabela de sobras.
  • O contêiner antigo do Mailpit é apagado pelo dono, com o comando do relatório final.
  • Os testes desta issue são verificações por comando — não há comportamento novo para um teste xUnit.

Testes

Comandos rodados da raiz do repositório, salvo indicação.

ID Teste Camada Regra Resultado esperado
T01 Deve não restar menção aos pacotes removidos no back-end e no Dependabot Verificação Decisões 27, 30, 31, 33 git grep -niE "nsubstitute|mailpit|mailkit|caching\.hybrid|servicediscovery|http\.resilience|containers\.tools|DependencyInjectionExtensions|DockerDefaultTargetOS|DockerfileContext|Container \(Dockerfile\)" -- backend .github não imprime nenhuma linha
T02 Deve toda versão declarada em Directory.Packages.props ser usada por algum projeto Verificação Decisão 30 Para cada PackageVersion, existe um PackageReference com o mesmo nome em um .csproj ou Directory.Build.props; a lista de versões sem uso sai vazia
T03 Deve a solução formatar, compilar e passar em todos os testes existentes Verificação Decisão 29 ./check.ps1 (em backend/ControlService): 0 avisos, 0 erros, os mesmos 243 casos de teste verdes, nenhum criado ou removido
T04 Deve o sistema subir pelo AppHost só com o banco e a API Verificação Decisão 31 dotnet run --project src/ControlService.AppHost: os recursos são postgres, controlservice e api, sem mailpit; curl.exe -k https://localhost:7243/health responde 200 com Healthy
T05 Deve a imagem da API ser montada sem o pacote do Visual Studio Verificação Decisão 33 docker build --file src/ControlService.API/Dockerfile --tag controlservice-api:dev . (em backend/ControlService) termina com código 0
T06 Deve a documentação não descrever mais as sobras como presentes Verificação — git grep -niE "mailpit|nsubstitute" -- README.md backend/ControlService/README.md docs/agents AGENTS.md não imprime nenhuma linha; em docs/decisoes-de-arquitetura.md, "NSubstitute" e "HybridCache" aparecem só na tabela do que foi avaliado e não adotado, e "Mailpit" não aparece

Sem teste próprio: a API funcionar sem service discovery e resiliência — coberta por T03 (os testes de integração sobem a API inteira) e T04.

Critérios de aceite

  • As verificações T01 a T06 passam, com o comando e a saída no relatório final.
  • check.ps1 termina sem avisos, com todos os testes do projeto verdes.
  • Nenhum arquivo de Auth, Users ou PermissionProfiles aparece no diff.
  • Em .github/, o diff tem só a palavra "NSubstitute" removida de dependabot.yml.
  • A tabela "O que ainda reflete o plano antigo" fica só com a linha do CI.
  • As decisões 6 e 30 têm as notas sobre o helper adiado e o pacote que pode voltar.
  • docs/ atualizado no mesmo pull request: README.md, backend/ControlService/README.md, docs/agents/guides/local-environment.md, docs/decisoes-de-arquitetura.md.
  • O relatório final traz o comando para o dono apagar o contêiner controlservice-mailpit.

Recomendações futuras

  • Avaliar a remoção de AddHttpClientInstrumentation() e do pacote OpenTelemetry.Instrumentation.Http: só agem quando a API chama outro serviço por HTTP. Exige rever a decisão 32.
  • Helper de registro de handlers validados: decidir na Permission profiles and screen catalog endpoints #10, com dois ou mais casos reais.
  • O modelo de issue não prevê issues só de remoção, em que os testes são verificações por comando. Se isso se repetir, vale uma linha na skill /levantar-issue.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions