Dependency injection is the composition mechanism, not the semantic model.
DI should answer:
Which implementation satisfies this contract?
It should not decide:
The active sample constructs the necessary components directly so the E2E remains obvious.
As the runtime grows, DI can become the composition root for:
Metadata provider
Planner
Resolver
Policy evaluator
Execution provider
Verifier
Evidence sink
Application
↓
DI composition root
↓
Foundgine semantic/execution services
↓
provider adapters
Do not introduce registration APIs until the underlying contracts are proven.