Module dependency graph — auto-layer🔗
Generated from the code by
tach. Do not hand-edit the fenced block below — regenerate it (see footer). This is the Reference layer (Living Documentation): it cannot lie about imports because it is derived from them.
The graph shows the 12 top-level packages of polit_media_radar and their real import dependencies. An arrow A --> B means package A imports from package B. (logging_config is a single .py file, not a package, so it is not a node.)
graph TD
polit_media_radar.alerts --> polit_media_radar.config
polit_media_radar.alerts --> polit_media_radar.security
polit_media_radar.cli --> polit_media_radar.alerts
polit_media_radar.cli --> polit_media_radar.config
polit_media_radar.cli --> polit_media_radar.domain
polit_media_radar.cli --> polit_media_radar.infrastructure
polit_media_radar.cli --> polit_media_radar.ingestion
polit_media_radar.cli --> polit_media_radar.persistence
polit_media_radar.cli --> polit_media_radar.reports
polit_media_radar.cli --> polit_media_radar.scheduler
polit_media_radar.cli --> polit_media_radar.security
polit_media_radar.cli --> polit_media_radar.services
polit_media_radar.cli --> polit_media_radar.sources
polit_media_radar.infrastructure --> polit_media_radar.domain
polit_media_radar.infrastructure --> polit_media_radar.ingestion
polit_media_radar.infrastructure --> polit_media_radar.persistence
polit_media_radar.infrastructure --> polit_media_radar.security
polit_media_radar.infrastructure --> polit_media_radar.sources
polit_media_radar.ingestion --> polit_media_radar.alerts
polit_media_radar.ingestion --> polit_media_radar.domain
polit_media_radar.ingestion --> polit_media_radar.persistence
polit_media_radar.ingestion --> polit_media_radar.security
polit_media_radar.ingestion --> polit_media_radar.sources
polit_media_radar.persistence --> polit_media_radar.config
polit_media_radar.persistence --> polit_media_radar.domain
polit_media_radar.persistence --> polit_media_radar.security
polit_media_radar.persistence --> polit_media_radar.sources
polit_media_radar.reports --> polit_media_radar.alerts
polit_media_radar.reports --> polit_media_radar.config
polit_media_radar.reports --> polit_media_radar.domain
polit_media_radar.reports --> polit_media_radar.persistence
polit_media_radar.reports --> polit_media_radar.security
polit_media_radar.reports --> polit_media_radar.services
polit_media_radar.reports --> polit_media_radar.sources
polit_media_radar.scheduler --> polit_media_radar.alerts
polit_media_radar.scheduler --> polit_media_radar.cli
polit_media_radar.scheduler --> polit_media_radar.config
polit_media_radar.scheduler --> polit_media_radar.domain
polit_media_radar.scheduler --> polit_media_radar.security
polit_media_radar.scheduler --> polit_media_radar.sources
polit_media_radar.services --> polit_media_radar.domain
polit_media_radar.services --> polit_media_radar.persistence
polit_media_radar.services --> polit_media_radar.reports
polit_media_radar.sources --> polit_media_radar.alerts
polit_media_radar.sources --> polit_media_radar.config
polit_media_radar.sources --> polit_media_radar.domain
polit_media_radar.sources --> polit_media_radar.security
polit_media_radar.config
polit_media_radar.domain
polit_media_radar.security
Reading the graph. domain, security, config are leaf/utility layers (no outgoing arrows — nothing under polit_media_radar they depend on). cli is the composition root (depends on nearly everything). Note the cli ↔ scheduler cycle: scheduler imports cli and cli imports scheduler — a real (not introduced) coupling, surfaced honestly rather than hidden.
Regenerate: from repo root, tach sync && tach show --mermaid -o docs/architecture/diagrams/modules.md then re-wrap with this header. Config: tach.toml (repo root). Drift gate: tach show --mermaid - compared against the fenced block.