-
Notifications
You must be signed in to change notification settings - Fork 0
feat: auto-wire backend services at startup (production service initialization) #550
Copy link
Copy link
Closed
Labels
prio:highImportant, should be prioritizedImportant, should be prioritizedscope:large3+ days of work3+ days of workspec:architectureDESIGN_SPEC Section 15 - Technical ArchitectureDESIGN_SPEC Section 15 - Technical Architecturetype:featureNew feature implementationNew feature implementation
Description
Summary
The Docker container runs uvicorn synthorg.api.app:create_app --factory which calls create_app() with no arguments. Only persistence is auto-wired from SYNTHORG_DB_PATH. All other services are None, causing 503 errors on most endpoints.
Current State
server.py documents this: "Backend services not passed -- intended for development/demo use. For production, call create_app() directly with all services."
The app logs this at startup:
[warning] create_app called without persistence, message_bus, cost_tracker,
task_engine, and/or settings_service -- controllers accessing missing services
will return 503.
Services Audit
All implementations exist and can be auto-created from config + persistence:
| Service | Module | Can auto-wire? | Dependencies |
|---|---|---|---|
| persistence | persistence/ |
Already done | SYNTHORG_DB_PATH env var |
| message_bus | communication/bus_memory.py |
Yes | MessageBusConfig from RootConfig |
| cost_tracker | budget/tracker.py |
Yes | Optional: BudgetConfig + dept resolver |
| task_engine | engine/task_engine.py |
Yes | persistence (available), optional: message_bus |
| settings_service | settings/service.py |
Yes | repository + registry + config (needs persistence) |
| settings_dispatcher | settings/dispatcher.py |
Yes | message_bus + subscriber list |
| provider_registry | providers/registry.py |
Yes | from_config(root_config.providers) |
| coordinator | engine/coordination/service.py |
Needs inspection | Likely: provider_registry + task_engine |
| agent_registry | hr/registry.py |
Needs inspection | Likely: persistence |
| meeting_orchestrator | communication/meeting/orchestrator.py |
Needs inspection | message_bus + provider |
| meeting_scheduler | communication/meeting/scheduler.py |
Needs inspection | orchestrator + config |
| performance_tracker | hr/performance/tracker.py |
Needs inspection | persistence |
Affected Dashboard Pages
Without these services, the dashboard shows errors on:
| Endpoint | Missing service | Page |
|---|---|---|
GET /api/v1/budget/config |
config_resolver (settings_service) | Budget Panel |
GET /api/v1/tasks |
task_engine | Task Board |
GET /api/v1/analytics/overview |
cost_tracker | Dashboard |
GET /api/v1/budget/records |
cost_tracker | Budget Panel |
GET /api/v1/company |
config_resolver (settings_service) | Dashboard, Org Chart |
GET /api/v1/settings/* |
settings_service | Settings Page |
Proposed Approach
Add auto-wiring in create_app() following the existing persistence pattern:
# After persistence is wired:
if message_bus is None:
message_bus = InMemoryMessageBus(config=effective_config.communication.message_bus)
if cost_tracker is None:
cost_tracker = CostTracker(budget_config=effective_config.budget)
if task_engine is None and persistence is not None:
task_engine = TaskEngine(persistence=persistence, message_bus=message_bus)
# After _init_persistence in on_startup:
if settings_service is None and persistence is not None:
settings_service = SettingsService(
repository=SettingsRepository(persistence),
registry=build_settings_registry(),
config=effective_config,
)Services with more complex dependencies (coordinator, meeting_orchestrator, etc.) can be wired incrementally.
Dependency Order
persistence (already done)
-> message_bus (no deps beyond config)
-> cost_tracker (no deps beyond config)
-> settings_service (needs persistence + registry)
-> settings_dispatcher (needs message_bus + subscribers)
-> config_resolver (needs settings_service)
-> task_engine (needs persistence, optional message_bus)
-> provider_registry (needs config)
-> agent_registry (needs persistence)
-> coordinator (needs provider_registry + task_engine)
-> meeting_orchestrator (needs message_bus + provider)
-> meeting_scheduler (needs orchestrator + config)
-> performance_tracker (needs persistence)
Acceptance Criteria
-
create_app()with no arguments auto-creates all services that have existing implementations - Dashboard loads without 503 errors (budget, tasks, analytics, company, settings pages)
- Services are created in correct dependency order
- Startup warning removed (or changed to only warn about genuinely missing services)
- Tests verify auto-wiring works
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
prio:highImportant, should be prioritizedImportant, should be prioritizedscope:large3+ days of work3+ days of workspec:architectureDESIGN_SPEC Section 15 - Technical ArchitectureDESIGN_SPEC Section 15 - Technical Architecturetype:featureNew feature implementationNew feature implementation