Remove FakeListLLM as a silent fallback in agent graph constructors
(plan_generation.py, context_analysis.py, auto_debug.py). All three now
raise ValueError when llm=None, making missing-provider errors explicit.
Add Settings.mock_providers flag and validate_provider_availability()
method. Update container.get_ai_provider() to check Settings.mock_providers
first, with env-var fallback for backward compatibility.
Add resolve_provider_by_name() helper to the provider registry and export
it from cleveragents.providers. Add structlog trace logging to
ProviderRegistry.get_default_provider_type() to record selection reasoning.
Update all existing behave step files, robot tests, and benchmarks that
relied on the implicit FakeListLLM default to pass an explicit LLM
instance instead.
Add new BDD tests (features/provider_fixes.feature with 17 scenarios),
Robot Framework integration tests (robot/provider_detection_smoke.robot),
and ASV benchmarks (benchmarks/provider_selection_bench.py).
ISSUES CLOSED: #323
Implement the B1 (Project Data Models) domain models from scratch,
aligned with docs/specification.md:
- Resource model: ULID PK, PhysVirt enum (physical|virtual),
SandboxStrategy enum (5 spec values), ResourceCapabilities,
extensible resource_type_name, DAG relationships, frozen model
- NamespacedProject model: identified solely by [[server:]namespace/]name,
LinkedResource for project-resource links, ContextConfig with memory
tiers/retention/temporal scope, domain methods (link/unlink/get)
- parse_namespaced_name(): full namespace parsing with reserved/provider
namespace validation, bare name defaulting to local/
- Extract legacy Project/ProjectSettings/ProjectStats to project_legacy.py
- 81 Behave scenarios (233 steps), all passing
- Lint (ruff), typecheck (pyright) clean
- Full existing test suite (2336 scenarios) unaffected