Start here. This is the direct spoken answer to practice first.
Why this question matters
The two projects are often created together, but they execute in different places and solve different problems. Mixing their responsibilities makes local composition opaque and can couple ordinary services to a development-only host.
The AppHost describes the distributed application from outside its services. It declares projects, executables, containers, databases, caches, endpoints, references, startup dependencies, and parameters, then builds and runs that application model. ServiceDefaults is referenced by service projects and runs inside those processes. It usually provides extension methods that register common OpenTelemetry instrumentation, health endpoints, service discovery, and standard HTTP resilience. I keep topology and resource relationships in AppHost, while ServiceDefaults contains small, production-safe conventions that each participating service deliberately enables. A service should not reference AppHost, and ServiceDefaults should not become a shared business-logic library.