//! Graph extraction — building the constellation's dependency + symbol graph
//! `G = (V, E)` from whatever evidence exists.
//!
//! nornir models the constellation as a directed graph `G = (V, E)` (EPIC
//! MATHEMATICAL FOUNDATIONS): `V` = crates/objects, `E` = "must-come-first"
//! dependency edges. There is **one graph model** but **several extractors**
//! that feed it:
//!
//! - the **source extractor** — [`crate::warehouse::dep_graph`] (`Cargo.toml`
//! manifests → [`WorkspaceGraph`](crate::warehouse::dep_graph::WorkspaceGraph))
//! and [`crate::knowledge::symbols`] (a syn pass → symbol/call rows);
//! - the **binary extractor** — [`extract::binary`] (compiled ELF artefacts →
//! the same `WorkspaceGraph` + symbol/call rows) for the airgap / vendored
//! `.so` case where no source is checked out (EPIC item 8, on-theme for
//! **Skidbladnir**).
//!
//! Both feed the SAME node/edge types so modgunn (security/CVE), blodomlopp
//! (the circulatory viz), and the release doctor's blast-radius reason over
//! dependencies uniformly — a node/edge only carries an extra
//! [`extract::Provenance`] tag recording whether it came from source or binary.