You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Remove the leftovers of the old plan (unused packages, Mailpit, template extras) #34
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);
Docker Desktop ligado, para os testes de integração, T04 e T05.
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.
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.
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.
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.
ControlService.Application.Tests.csproje deDirectory.Packages.props.AppHost.cso recurso, oWithReference, oWaitFore o comentário; sai o pacoteCommunityToolkit.Aspire.Hosting.MailPitdo.csprojdo AppHost e doDirectory.Packages.props; o comentário do.csprojdo AppHost é corrigido.MailKit,Microsoft.Extensions.Caching.HybrideFluentValidation.DependencyInjectionExtensionssaem deDirectory.Packages.props. O comentário "Ready for the next slices" é reescrito, porque o grupo passa a ter só pacotes em uso.ServiceDefaults/Extensions.csas linhas 22 a 27; saem os pacotesMicrosoft.Extensions.ServiceDiscoveryeMicrosoft.Extensions.Http.Resiliencedo.csproje doDirectory.Packages.props; o comentário do.csprojé corrigido.Microsoft.VisualStudio.Azure.Containers.Tools.TargetsdeControlService.API.csproje deDirectory.Packages.props, com as propriedadesDockerDefaultTargetOSeDockerfileContexte o perfil "Container (Dockerfile)" delaunchSettings.json..github/autorizada: tirar"NSubstitute"do grupotestingdedependabot.yml. Nada mais nesse arquivo.README.md: as linhas "Local environment" e "Tests" da tabela, a descrição doServiceDefaultsna á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:FluentValidation.DependencyInjectionExtensionsfoi removido por falta de uso e pode voltar se houver justificativa (por exemplo, registrar os validadores automaticamente);Fora do escopo
T12,D3) em arquivos.cs— issue própria, na etapa 3.controlservice-mailpitda máquina — o dono roda o comando do relatório final.Dependências
main(feito).Riscos
WithReference(database), que não depende dela.DockerDefaultTargetOSouDockerfileContext— T05 falha.controlservice-mailpitcontinua 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.
T12/D3: issue própria — pedem revisão de leitura em 42 arquivos, e não a prova por build desta issue.FluentValidation.DependencyInjectionExtensions— versão sem uso, como o MailKit; a decisão 30 registra que pode voltar com justificativa."NSubstitute"dodependabot.yml— única mudança em.github/.HttpClientdo OpenTelemetry — pertence à decisão 32 e não está na tabela de sobras.Testes
Comandos rodados da raiz do repositório, salvo indicação.
git grep -niE "nsubstitute|mailpit|mailkit|caching\.hybrid|servicediscovery|http\.resilience|containers\.tools|DependencyInjectionExtensions|DockerDefaultTargetOS|DockerfileContext|Container \(Dockerfile\)" -- backend .githubnão imprime nenhuma linhaDirectory.Packages.propsser usada por algum projetoPackageVersion, existe umPackageReferencecom o mesmo nome em um.csprojouDirectory.Build.props; a lista de versões sem uso sai vazia./check.ps1(embackend/ControlService): 0 avisos, 0 erros, os mesmos 243 casos de teste verdes, nenhum criado ou removidodotnet run --project src/ControlService.AppHost: os recursos sãopostgres,controlserviceeapi, semmailpit;curl.exe -k https://localhost:7243/healthresponde 200 comHealthydocker build --file src/ControlService.API/Dockerfile --tag controlservice-api:dev .(embackend/ControlService) termina com código 0git grep -niE "mailpit|nsubstitute" -- README.md backend/ControlService/README.md docs/agents AGENTS.mdnão imprime nenhuma linha; emdocs/decisoes-de-arquitetura.md, "NSubstitute" e "HybridCache" aparecem só na tabela do que foi avaliado e não adotado, e "Mailpit" não apareceSem 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
check.ps1termina sem avisos, com todos os testes do projeto verdes.Auth,UsersouPermissionProfilesaparece no diff..github/, o diff tem só a palavra"NSubstitute"removida dedependabot.yml.docs/atualizado no mesmo pull request:README.md,backend/ControlService/README.md,docs/agents/guides/local-environment.md,docs/decisoes-de-arquitetura.md.controlservice-mailpit.Recomendações futuras
AddHttpClientInstrumentation()e do pacoteOpenTelemetry.Instrumentation.Http: só agem quando a API chama outro serviço por HTTP. Exige rever a decisão 32./levantar-issue.