//! Typed pipeline state machine (story 520).
//!
//! Replaces the stringly-typed CRDT views with strict Rust enums so that
//! impossible states (e.g. `Stage::Merge` with zero commits, a "done" story
//! with no merge metadata) are unrepresentable at compile time.
//!
//! The CRDT stays loose at the persistence layer — that's what makes it merge
//! correctly across nodes. Every consumer above the CRDT operates on these
//! strict typed enums, bridged by the projection layer (`TryFrom` / `From`).
//!
//! This is a foundation module: the types, transitions, projection layer, and
//! event bus are fully defined and tested here. Consumers will be migrated to
//! the typed API incrementally in follow-up stories.
//!
//! ## Module layout
//! - [`types`]      — newtypes, `Stage`, `ExecutionState`, `PipelineItem`, errors, label helpers
//! - [`transition`] — `PipelineEvent`, `ExecutionEvent`, `transition`, `execution_transition`
//! - [`events`]     — `EventBus`, `TransitionFired`, `TransitionSubscriber`
//! - [`projection`] — CRDT → typed projection layer (`read_typed`, `read_all_typed`)
//! - [`subscribers`] — concrete subscriber stubs

// Scaffolding types (AgentName, NodePubkey, ExecutionState, ExecutionEvent,
// execution_transition, apply_transition_str, to_crdt_fields, is_upcoming,
// MissingField/InvalidField) exist for stages 2–5 of story 934 and the
// per-node execution-state work; they are only exercised by tests today.
// Revisit and drop the allow once those stages land.
#![allow(dead_code)]

mod apply;
mod events;
mod projection;
mod subscribers;
mod transition;
mod types;

#[cfg(test)]
mod tests;

// ── Public re-exports ───────────────────────────────────────────────────────

#[allow(unused_imports)]
pub use types::{
    AgentClaim, AgentName, ArchiveReason, BranchName, ExecutionState, GitSha, MergeFailureKind,
    NodePubkey, Pipeline, PipelineItem, PlanState, Stage, Status, StoryId, TransitionError,
    stage_dir_name, stage_label,
};

#[allow(unused_imports)]
pub use transition::{
    ExecutionEvent, PipelineEvent, event_label, execution_transition, transition,
};

#[allow(unused_imports)]
pub use events::{EventBus, TransitionFired, TransitionSubscriber, subscribe_transitions};

#[allow(unused_imports)]
pub use projection::ProjectionError;
pub use projection::{read_all_typed, read_typed};

#[allow(unused_imports)]
pub use apply::{
    ApplyError, apply_transition, apply_transition_str, transition_to_frozen,
    transition_to_unfrozen,
};

pub(crate) use subscribers::reconcile_audit_log;
pub use subscribers::{spawn_audit_log_subscriber, spawn_status_broadcast_subscriber};

#[allow(unused_imports)]
pub use subscribers::{
    AuditLogSubscriber, AutoAssignSubscriber, FileRendererSubscriber, MatrixBotSubscriber,
    PipelineItemsSubscriber, WebUiBroadcastSubscriber, format_audit_entry,
};
