{"nodes": [{"id": "backend_config_loader_py", "label": "config_loader.py", "file_type": "code", "source_file": "backend/config_loader.py", "source_location": "L1"}, {"id": "config_loader_configerror", "label": "ConfigError", "file_type": "code", "source_file": "backend/config_loader.py", "source_location": "L9"}, {"id": "exception", "label": "Exception", "file_type": "code", "source_file": "", "source_location": ""}, {"id": "config_loader_deep_merge", "label": "_deep_merge()", "file_type": "code", "source_file": "backend/config_loader.py", "source_location": "L13"}, {"id": "config_loader_map_secrets", "label": "_map_secrets()", "file_type": "code", "source_file": "backend/config_loader.py", "source_location": "L21"}, {"id": "config_loader_to_bool", "label": "_to_bool()", "file_type": "code", "source_file": "backend/config_loader.py", "source_location": "L39"}, {"id": "config_loader_apply_env_overrides", "label": "_apply_env_overrides()", "file_type": "code", "source_file": "backend/config_loader.py", "source_location": "L45"}, {"id": "config_loader_load_config", "label": "load_config()", "file_type": "code", "source_file": "backend/config_loader.py", "source_location": "L120"}, {"id": "config_loader_get_config", "label": "get_config()", "file_type": "code", "source_file": "backend/config_loader.py", "source_location": "L241"}, {"id": "config_loader_validate_config", "label": "validate_config()", "file_type": "code", "source_file": "backend/config_loader.py", "source_location": "L247"}, {"id": "config_loader_rationale_10", "label": "Raised when configuration is invalid or missing.", "file_type": "rationale", "source_file": "backend/config_loader.py", "source_location": "L10"}, {"id": "config_loader_rationale_14", "label": "Recursively merge dictionaries.", "file_type": "rationale", "source_file": "backend/config_loader.py", "source_location": "L14"}, {"id": "config_loader_rationale_22", "label": "Map secrets from secrets.yaml (flattened) to the nested config structure.", "file_type": "rationale", "source_file": "backend/config_loader.py", "source_location": "L22"}, {"id": "config_loader_rationale_40", "label": "Convert string to boolean.", "file_type": "rationale", "source_file": "backend/config_loader.py", "source_location": "L40"}, {"id": "config_loader_rationale_46", "label": "Apply environment variable overrides (D-06 load order).", "file_type": "rationale", "source_file": "backend/config_loader.py", "source_location": "L46"}, {"id": "config_loader_rationale_121", "label": "Load config from YAML files with env var overrides (D-06 load order).", "file_type": "rationale", "source_file": "backend/config_loader.py", "source_location": "L121"}, {"id": "config_loader_rationale_248", "label": "Validate config has all required values.", "file_type": "rationale", "source_file": "backend/config_loader.py", "source_location": "L248"}], "edges": [{"source": "backend_config_loader_py", "target": "os", "relation": "imports", "confidence": "EXTRACTED", "source_file": "backend/config_loader.py", "source_location": "L1", "weight": 1.0}, {"source": "backend_config_loader_py", "target": "logging", "relation": "imports", "confidence": "EXTRACTED", "source_file": "backend/config_loader.py", "source_location": "L2", "weight": 1.0}, {"source": "backend_config_loader_py", "target": "yaml", "relation": "imports", "confidence": "EXTRACTED", "source_file": "backend/config_loader.py", "source_location": "L3", "weight": 1.0}, {"source": "backend_config_loader_py", "target": "config_loader_configerror", "relation": "contains", "confidence": "EXTRACTED", "source_file": "backend/config_loader.py", "source_location": "L9", "weight": 1.0}, {"source": "config_loader_configerror", "target": "exception", "relation": "inherits", "confidence": "EXTRACTED", "source_file": "backend/config_loader.py", "source_location": "L9", "weight": 1.0}, {"source": "backend_config_loader_py", "target": "config_loader_deep_merge", "relation": "contains", "confidence": "EXTRACTED", "source_file": "backend/config_loader.py", "source_location": "L13", "weight": 1.0}, {"source": "backend_config_loader_py", "target": "config_loader_map_secrets", "relation": "contains", "confidence": "EXTRACTED", "source_file": "backend/config_loader.py", "source_location": "L21", "weight": 1.0}, {"source": "backend_config_loader_py", "target": "config_loader_to_bool", "relation": "contains", "confidence": "EXTRACTED", "source_file": "backend/config_loader.py", "source_location": "L39", "weight": 1.0}, {"source": "backend_config_loader_py", "target": "config_loader_apply_env_overrides", "relation": "contains", "confidence": "EXTRACTED", "source_file": "backend/config_loader.py", "source_location": "L45", "weight": 1.0}, {"source": "backend_config_loader_py", "target": "config_loader_load_config", "relation": "contains", "confidence": "EXTRACTED", "source_file": "backend/config_loader.py", "source_location": "L120", "weight": 1.0}, {"source": "backend_config_loader_py", "target": "config_loader_get_config", "relation": "contains", "confidence": "EXTRACTED", "source_file": "backend/config_loader.py", "source_location": "L241", "weight": 1.0}, {"source": "backend_config_loader_py", "target": "config_loader_validate_config", "relation": "contains", "confidence": "EXTRACTED", "source_file": "backend/config_loader.py", "source_location": "L247", "weight": 1.0}, {"source": "config_loader_load_config", "target": "config_loader_deep_merge", "relation": "calls", "confidence": "EXTRACTED", "source_file": "backend/config_loader.py", "source_location": "L186", "weight": 1.0}, {"source": "config_loader_load_config", "target": "config_loader_map_secrets", "relation": "calls", "confidence": "EXTRACTED", "source_file": "backend/config_loader.py", "source_location": "L199", "weight": 1.0}, {"source": "config_loader_load_config", "target": "config_loader_apply_env_overrides", "relation": "calls", "confidence": "EXTRACTED", "source_file": "backend/config_loader.py", "source_location": "L236", "weight": 1.0}, {"source": "config_loader_get_config", "target": "config_loader_load_config", "relation": "calls", "confidence": "EXTRACTED", "source_file": "backend/config_loader.py", "source_location": "L244", "weight": 1.0}, {"source": "config_loader_validate_config", "target": "config_loader_configerror", "relation": "calls", "confidence": "EXTRACTED", "source_file": "backend/config_loader.py", "source_location": "L263", "weight": 1.0}, {"source": "config_loader_rationale_10", "target": "config_loader_configerror", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "backend/config_loader.py", "source_location": "L10", "weight": 1.0}, {"source": "config_loader_rationale_14", "target": "config_loader_deep_merge", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "backend/config_loader.py", "source_location": "L14", "weight": 1.0}, {"source": "config_loader_rationale_22", "target": "config_loader_map_secrets", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "backend/config_loader.py", "source_location": "L22", "weight": 1.0}, {"source": "config_loader_rationale_40", "target": "config_loader_to_bool", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "backend/config_loader.py", "source_location": "L40", "weight": 1.0}, {"source": "config_loader_rationale_46", "target": "config_loader_apply_env_overrides", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "backend/config_loader.py", "source_location": "L46", "weight": 1.0}, {"source": "config_loader_rationale_121", "target": "config_loader_load_config", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "backend/config_loader.py", "source_location": "L121", "weight": 1.0}, {"source": "config_loader_rationale_248", "target": "config_loader_validate_config", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "backend/config_loader.py", "source_location": "L248", "weight": 1.0}], "raw_calls": [{"caller_nid": "config_loader_deep_merge", "callee": "items", "source_file": "backend/config_loader.py", "source_location": "L15"}, {"caller_nid": "config_loader_deep_merge", "callee": "isinstance", "source_file": "backend/config_loader.py", "source_location": "L16"}, {"caller_nid": "config_loader_deep_merge", "callee": "isinstance", "source_file": "backend/config_loader.py", "source_location": "L16"}, {"caller_nid": "config_loader_map_secrets", "callee": "items", "source_file": "backend/config_loader.py", "source_location": "L30"}, {"caller_nid": "config_loader_to_bool", "callee": "isinstance", "source_file": "backend/config_loader.py", "source_location": "L41"}, {"caller_nid": "config_loader_to_bool", "callee": "lower", "source_file": "backend/config_loader.py", "source_location": "L43"}, {"caller_nid": "config_loader_to_bool", "callee": "str", "source_file": "backend/config_loader.py", "source_location": "L43"}, {"caller_nid": "config_loader_apply_env_overrides", "callee": "items", "source_file": "backend/config_loader.py", "source_location": "L101"}, {"caller_nid": "config_loader_apply_env_overrides", "callee": "getenv", "source_file": "backend/config_loader.py", "source_location": "L102"}, {"caller_nid": "config_loader_apply_env_overrides", "callee": "converter", "source_file": "backend/config_loader.py", "source_location": "L105"}, {"caller_nid": "config_loader_apply_env_overrides", "callee": "info", "source_file": "backend/config_loader.py", "source_location": "L116"}, {"caller_nid": "config_loader_apply_env_overrides", "callee": "join", "source_file": "backend/config_loader.py", "source_location": "L116"}, {"caller_nid": "config_loader_apply_env_overrides", "callee": "warning", "source_file": "backend/config_loader.py", "source_location": "L118"}, {"caller_nid": "config_loader_load_config", "callee": "dirname", "source_file": "backend/config_loader.py", "source_location": "L125"}, {"caller_nid": "config_loader_load_config", "callee": "abspath", "source_file": "backend/config_loader.py", "source_location": "L125"}, {"caller_nid": "config_loader_load_config", "callee": "dirname", "source_file": "backend/config_loader.py", "source_location": "L127"}, {"caller_nid": "config_loader_load_config", "callee": "join", "source_file": "backend/config_loader.py", "source_location": "L128"}, {"caller_nid": "config_loader_load_config", "callee": "join", "source_file": "backend/config_loader.py", "source_location": "L181"}, {"caller_nid": "config_loader_load_config", "callee": "exists", "source_file": "backend/config_loader.py", "source_location": "L182"}, {"caller_nid": "config_loader_load_config", "callee": "open", "source_file": "backend/config_loader.py", "source_location": "L184"}, {"caller_nid": "config_loader_load_config", "callee": "safe_load", "source_file": "backend/config_loader.py", "source_location": "L185"}, {"caller_nid": "config_loader_load_config", "callee": "info", "source_file": "backend/config_loader.py", "source_location": "L187"}, {"caller_nid": "config_loader_load_config", "callee": "warning", "source_file": "backend/config_loader.py", "source_location": "L189"}, {"caller_nid": "config_loader_load_config", "callee": "warning", "source_file": "backend/config_loader.py", "source_location": "L191"}, {"caller_nid": "config_loader_load_config", "callee": "join", "source_file": "backend/config_loader.py", "source_location": "L194"}, {"caller_nid": "config_loader_load_config", "callee": "exists", "source_file": "backend/config_loader.py", "source_location": "L195"}, {"caller_nid": "config_loader_load_config", "callee": "open", "source_file": "backend/config_loader.py", "source_location": "L197"}, {"caller_nid": "config_loader_load_config", "callee": "safe_load", "source_file": "backend/config_loader.py", "source_location": "L198"}, {"caller_nid": "config_loader_load_config", "callee": "info", "source_file": "backend/config_loader.py", "source_location": "L200"}, {"caller_nid": "config_loader_load_config", "callee": "warning", "source_file": "backend/config_loader.py", "source_location": "L202"}, {"caller_nid": "config_loader_load_config", "callee": "join", "source_file": "backend/config_loader.py", "source_location": "L205"}, {"caller_nid": "config_loader_load_config", "callee": "exists", "source_file": "backend/config_loader.py", "source_location": "L206"}, {"caller_nid": "config_loader_load_config", "callee": "open", "source_file": "backend/config_loader.py", "source_location": "L208"}, {"caller_nid": "config_loader_load_config", "callee": "safe_load", "source_file": "backend/config_loader.py", "source_location": "L209"}, {"caller_nid": "config_loader_load_config", "callee": "get", "source_file": "backend/config_loader.py", "source_location": "L211"}, {"caller_nid": "config_loader_load_config", "callee": "get", "source_file": "backend/config_loader.py", "source_location": "L217"}, {"caller_nid": "config_loader_load_config", "callee": "get", "source_file": "backend/config_loader.py", "source_location": "L224"}, {"caller_nid": "config_loader_load_config", "callee": "items", "source_file": "backend/config_loader.py", "source_location": "L225"}, {"caller_nid": "config_loader_load_config", "callee": "get", "source_file": "backend/config_loader.py", "source_location": "L229"}, {"caller_nid": "config_loader_load_config", "callee": "get", "source_file": "backend/config_loader.py", "source_location": "L229"}, {"caller_nid": "config_loader_load_config", "callee": "info", "source_file": "backend/config_loader.py", "source_location": "L231"}, {"caller_nid": "config_loader_load_config", "callee": "warning", "source_file": "backend/config_loader.py", "source_location": "L233"}, {"caller_nid": "config_loader_validate_config", "callee": "get", "source_file": "backend/config_loader.py", "source_location": "L258"}, {"caller_nid": "config_loader_validate_config", "callee": "append", "source_file": "backend/config_loader.py", "source_location": "L260"}, {"caller_nid": "config_loader_validate_config", "callee": "join", "source_file": "backend/config_loader.py", "source_location": "L260"}, {"caller_nid": "config_loader_validate_config", "callee": "join", "source_file": "backend/config_loader.py", "source_location": "L263"}, {"caller_nid": "config_loader_validate_config", "callee": "upper", "source_file": "backend/config_loader.py", "source_location": "L271"}, {"caller_nid": "config_loader_validate_config", "callee": "info", "source_file": "backend/config_loader.py", "source_location": "L274"}]}