//! **funnel-core** — the pure workflow-DAG core of the nornir funnel.
//!
//! Extracted from `nornir/src/funnel/` in the #22 facets-migration wave so both
//! nornir and `ordning-funnel` can share the same idea→plan→node DAG primitives
//! without dragging in nornir's warehouse/iceberg/model stack. This crate is
//! deliberately **pure**: `serde`-serializable data + topological readiness + the
//! kanban-card projection, and nothing that touches storage, RPC, or a model.
//!
//! The impure funnel halves (the iceberg-backed `Store`, the codegen/planner
//! loops, the demo) stay in nornir and re-export these types via
//! `crate::funnel::*`, so every existing `crate::funnel::{…}` path in nornir keeps
//! resolving unchanged.
pub mod card;
pub mod event;
pub mod history;
pub mod ids;
pub mod mode;
pub mod plan_dag;
pub mod state;
pub mod topo;
pub mod wiring;
pub use card::{
board, board_to_json, card_from_history, card_from_node, cards_from_funnel, cards_from_history,
mine_hashtags, parse_query, parse_query_as, query_cards, query_cards_as, query_me, Board, Card,
CardType, Column, Lane, Query, Sort,
};
pub use event::{CommitRef, Event, ItemKind, NodeStatus, PlanStatus, RunOutcome, TriageDecision};
pub use history::{history, history_to_json, HistoryItem, HistoryStatus};
pub use ids::{IdeaId, NodeId, PlanId, RunId};
pub use mode::FunnelMode;
pub use plan_dag::{
Bottleneck, DagGrowth, DagStatus, EdgeBirth, EdgeKind, NodeBirth, NodeChange, PlanDag,
PlanDagEdge, PlanDagNode, PlanDiff,
};
pub use state::{Assignment, Funnel, Idea, Plan, PlanNode, Run};
pub use topo::{
simulate_flow, simulate_flow_with, topo_ready, topo_ready_for_plan, FlowSim, FlowTransition,
NextStep,
};
pub use wiring::{
draw_wire, reject_wire, BlastRadius, ComponentDag, ComponentEdge, ComponentEdgeKind,
ComponentGraph, ComponentId, ComponentNode, DanglingWire, MappedNode, ProposedWire,
UnmappedNode, UnmappedReason, Wire, WireOrigin, WireStatus, Wiring, WiringReport,
};