Skip to content

feat: auto-wire backend services at startup (production service initialization) #550

@Aureliolo

Description

@Aureliolo

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    prio:highImportant, should be prioritizedscope:large3+ days of workspec:architectureDESIGN_SPEC Section 15 - Technical Architecturetype:featureNew feature implementation

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions