black 23.1.0 uses ast.Str which was removed in Python 3.14, causing
pre-commit CI to crash on any PR that touches Python files.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Break the 507-line monolithic validate_and_render_schema() into focused
modules with pure validation functions, proper error handling, and clean
I/O separation:
- config_providers.py: provider constants, ConfigValidationError, unified
URL parsing (replaces 3 different inline implementations)
- config_validator.py: 11 pure validation functions (no I/O, no print/exit)
- config_generator.py: thin 146-line I/O orchestrator, reads files once
(was twice), uses logging instead of print()
Also cleans up module responsibilities:
- Move stream_access_logs from utils.py to docker_cli.py (Docker operation)
- Deduplicate llm_providers->model_providers migration
- Fix "Model alias 2 -" debug artifact in error message
- Update docker-compose.dev.yaml volume mounts for new files
- Rewrite tests: 53 tests calling pure functions directly (no mock_open
chains), up from 10 brittle mock-dependent tests
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>