nornir 0.5.4

Companion to cargo: dependency tracking, release gating, deploy, benchmarks, and documentation assembly. Project-agnostic.
//! Release gates, publish-order walker, deploy.
//!
//! Each gate is a free function returning `Result<()>`. Generated
//! release binaries call them in the order defined in
//! `workspace_holger/release/SPEC.md`.

pub mod cargo;
/// Release dependency-DAG (crate publish-order graph) assembled as a neutral graph
/// model annotated with per-crate registry state — the deep half of the release
/// dep-DAG viz surface.
pub mod depdag;
pub mod doctor;
pub mod edition;
/// Graph-theory + optimization core the doctor reasons over: Tarjan SCC,
/// condensation → publish waves, MFAS cycle-cut ranking, and the invertive
/// remedy planner over the outcome-space Ω. Pure, deterministic, extractor-agnostic.
pub mod graph_math;
pub mod gate;
pub mod pipeline;
/// Pre-cascade validation (catch ALL blockers before any irreversible
/// `cargo publish`): non-members, missing crates.io metadata, dep-API skew (via
/// `--dry-run` verify), detached workspaces, and registry/version consistency —
/// aggregated into one "preflight: N blocking issue(s)" summary with per-issue fixes.
pub mod preflight;
pub mod progress;
/// Registry-state check (item #10): a pluggable [`registry::RegistryBackend`]
/// (crates.io sparse-index default, custom/private base URL, both pure-Rust
/// `ureq`) that asks the registry "what version is actually PUBLISHED?" and
/// classifies each publish target local-vs-published — catching the
/// local-behind-registry DESYNC (`gatling` 0.1.4-local vs 0.1.6-published)
/// that today's verify-only preflight lets slip through and tear the cascade.
pub mod registry;
/// Topological ROOT-CAUSE analysis (item #9): partition a flat failure list from
/// the publish/preflight cascade into the ROOT crate(s) and the downstream
/// symptoms each root explains, so the operator fixes the one un-published
/// dependency instead of chasing N dependents' verify failures.
pub mod root_cause;
/// Same-version SOURCE-DRIFT detection: a crate whose local source differs from
/// the copy already published at the same version (the "edited without a bump"
/// trap) — a hard preflight blocker, and the inverse (unchanged ⇒ skip republish).
pub mod source_drift;
pub mod stage;
pub mod publish;
pub mod promote;
pub mod regression;
/// Semantic blast radius (EPIC item 7): cross-reference a version bump against the
/// warehouse SCIP call-graph to find the EXACT call sites that touch the changed
/// crate's API — "what actually breaks", not merely "who depends on it".
pub mod semantic_blast;
/// `nornir release undo` (task #32): reverse a release run's mutating steps from
/// the `release_changes` ledger (un-bump, restore `[patch]`, delete/reset branch,
/// yank an immutable publish) + the record wrappers the release path drives.
pub mod undo;

/// Loud deprecation banner for the release **ACT** verbs (build / publish / gate /
/// prepare / reverse steps). Per ratified doctrine (PRE-PROMPT §L5a, 2026-07-14 —
/// *release is a build op*) release ORCHESTRATION moved to `dwarves release`; the
/// nornir release ACT verbs are retained as still-working shims that warn on use.
/// The read-only warehouse VIEW / lineage verbs (regression trace, event DAG,
/// changelog, impacted-crate report, undo-ledger) stay in nornir and do NOT warn.
///
/// Factored out here (a pure `&'static str`) so the banner is unit-testable
/// without running a real publish. Must always mention `dwarves release`.
pub fn release_moved_banner() -> &'static str {
    "⚠ DEPRECATED: release orchestration has moved to dwarves (doctrine 2026-07-14 — \
release is a build op). Use: dwarves release <workspace-path> [--execute]. \
This nornir command still runs for now but will be removed."
}