System Diagram

The DSLCore Orchestrator data model, mapped — 23 models, 10 physical relationships

🔍 Open the Interactive Diagram Viewer — pan, mouse-wheel zoom, fit-to-screen, full-screen, per-module tabs, the full ERD, and a focus mode that draws one model and its neighbours at a chosen depth. This is a deliberately shallow control-plane schema: most tables are flat registry/history records keyed by business codes, so the physical foreign-key graph is small (10 edges). The logical flow — how events, schedules, controls and exceptions actually chain together — is richer than the FK graph, so the Overview tab and the diagrams below show that logical flow, not only the physical keys.


Architecture Overview

Five areas mirror the sidebar menu. Solid arrows are physical foreign keys; dashed arrows are the logical flow the control plane follows (matched by business code, not a stored FK).

flowchart LR
    subgraph REG["🧭 Registry & identity"]
        ApplicationInstance --> HealthCheck
        ApplicationInstance -.-> Connector
        CanonicalEntity --> EntityOwnership
        CanonicalEntity --> EntityMapping
    end

    subgraph INT["🔀 Integration"]
        EventDefinition -.-> EventMessage
        EventMessage -.-> RouteDefinition
        RouteDefinition --> FieldMapping
        RouteDefinition --> DeliveryAttempt
        EventMessage --> DeliveryAttempt
        DeliveryAttempt -.-> DeadLetterItem
    end

    subgraph SCH["⏱️ Scheduling"]
        ActionDefinition -.-> JobDefinition
        JobDefinition -.-> Schedule
        Schedule -.-> JobExecution
        RetryPolicy -.-> JobDefinition
        SyncCheckpoint
    end

    subgraph GOV["🛡️ Governance"]
        ControlDefinition --> ControlExecution
        ControlDefinition -.-> GovernanceException
        GovernanceException --> ExceptionAction
    end

    subgraph ADM["📜 Admin"]
        AuditRecord
    end

    EventMessage -.-> RouteDefinition
    Schedule -.-> ControlDefinition
    ControlExecution -.-> GovernanceException
    GovernanceException -.-> AuditRecord

Registry & identity

Who is out there, how we reach them, and the shared vocabulary that lets them refer to the same business things. EntityOwnership and EntityMapping both key off CanonicalEntity; HealthCheck keys off ApplicationInstance.

erDiagram
    ApplicationInstance ||--o{ HealthCheck : "checked by"
    CanonicalEntity ||--o{ EntityOwnership : "authoritative-owner rows"
    CanonicalEntity ||--o{ EntityMapping : "local-key crosswalk"

    ApplicationInstance {
        string application_code UK
        string application_type "DSLCore/External/Legacy/Infrastructure"
        string operational_status
        string connector_code
    }
    Connector {
        string connector_code UK
        string connector_type
        string direction
        string credential_reference "secret:// reference only"
    }
    CanonicalEntity {
        string entity_code UK
        string canonical_key_field
        bool active
    }
    EntityOwnership {
        int canonical_entity_id FK
        string field_name
        string authoritative_application_code
        string ownership_type "Entity/Field"
    }
    EntityMapping {
        int canonical_entity_id FK
        string canonical_key
        string application_code
        string local_key_value
        string sync_status
    }
    HealthCheck {
        int application_instance_id FK
        int response_time_ms
        string status
    }

Integration

An EventMessage is matched to RouteDefinitions (by source app + event type); each route carries FieldMappings and produces DeliveryAttempts; exhausted deliveries become DeadLetterItems. FieldMapping, DeliveryAttempt and DeadLetterItem are the physical children.

erDiagram
    RouteDefinition ||--o{ FieldMapping : "transforms"
    EventMessage ||--o{ DeliveryAttempt : "delivered via"
    RouteDefinition ||--o{ DeliveryAttempt : "down route"
    EventMessage ||--o{ DeadLetterItem : "dead-lettered"
    RouteDefinition ||--o{ DeadLetterItem : "on route"

    EventDefinition {
        string event_type UK
        string producer_application_code
        string materiality
    }
    EventMessage {
        string event_id UK
        string event_type
        string canonical_key
        string status
        bool duplicate
    }
    RouteDefinition {
        string route_code UK
        string trigger_type
        string source_event_type
        string target_application_code
        string operation
        string condition_expression
    }
    FieldMapping {
        int route_definition_id FK
        string source_field
        string target_field
        string transform_type
    }
    DeliveryAttempt {
        int event_message_id FK
        int route_definition_id FK
        int attempt_number
        string status
    }
    DeadLetterItem {
        int event_message_id FK
        int route_definition_id FK
        int retry_count
        string status
    }

Scheduling

Actions are invoked by jobs; jobs run on schedules; schedules produce executions. SyncCheckpoint and RetryPolicy are flat reference tables the rest of the module keys off by code. (These are logical links — job_code, action_code, schedule_code, retry_policy_code are business codes, not stored FKs.)

erDiagram
    ActionDefinition ||..o{ JobDefinition : "runs (by action_code)"
    JobDefinition ||..o{ Schedule : "triggered by (by job_code)"
    Schedule ||..o{ JobExecution : "produces (by schedule_code)"
    RetryPolicy ||..o{ JobDefinition : "governs back-off"

    ActionDefinition {
        string action_code UK
        string application_code
        string http_method
        bool idempotent
    }
    JobDefinition {
        string job_code UK
        string action_code
        string concurrency_mode
        string retry_policy_code
    }
    Schedule {
        string schedule_code UK
        string job_code
        string schedule_type "Cron/Interval/OneTime"
        string misfire_policy
    }
    JobExecution {
        string execution_code UK
        string job_code
        string triggered_by
        string status
    }
    SyncCheckpoint {
        string checkpoint_code UK
        string entity_code
        string checkpoint_type
        string status "Current/Stale/Failed"
    }
    RetryPolicy {
        string retry_policy_code UK
        int max_attempts
        float backoff_multiplier
    }

Governance

Controls run and produce executions; a failed execution raises a governance exception; every step on the exception is logged as an action. ControlExecution and ExceptionAction are the physical children.

erDiagram
    ControlDefinition ||--o{ ControlExecution : "runs"
    ControlDefinition ||..o{ GovernanceException : "raises (by control_code)"
    GovernanceException ||--o{ ExceptionAction : "worked via"

    ControlDefinition {
        string control_code UK
        string control_type "10 assurance types"
        string authoritative_application_code
        string compare_application_code
        string severity
    }
    ControlExecution {
        int control_definition_id FK
        string execution_code UK
        string status "Pass/Fail/Error"
        int exceptions_created
    }
    GovernanceException {
        string exception_code UK
        string name
        string exception_type
        string status "Open..Verified..Closed"
        string severity
    }
    ExceptionAction {
        int governance_exception_id FK
        string action_type
        string actor
        string resulting_status
    }

Regenerating this diagram

The interactive viewer is generated, never hand-edited. It reuses the ggcm/rehab viewer machinery and rebuilds its data block from schema/menu_config.yaml + generated/json/orchestrator_relationship_metadata.json, so the ERD always matches the schema. Re-run after any DSL or menu change:

python scripts/build_diagram_viewer.py orchestrator