//! Design decisions as first-class version-control objects.
//!
//! # Shape
//!
//! A [`Decision`] is what an Architecture Decision Record wants to be: not a
//! markdown file by convention, but a content-addressed object in the same
//! DAG as the code it governs. Agents may draft and propose decisions — the
//! rationale text is often AI-synthesized from an interview with the author —
//! but a decision proposed is only *unsettled*.
//!
//! An [`Attestation`] settles it: a short written account in the human's own
//! words. The two texts are never conflated — the decision's rationale may be
//! synthesized, the attestation is verbatim, and they are separate objects
//! with separate provenance. That separation is the storage-layer half of an
//! AI-interviewer workflow: the machine asks and drafts, the person answers
//! and signs.
//!
//! # The two compiler-enforced invariants
//!
//! 1. **Only a human can attest.** [`Attestation::new`] takes `&HumanIdentity`; no
//! constructor, `From`, or `TryFrom` accepts an agent.
//! 2. **Settled is reachable only through attestation.** [`DecisionRecord<Settled>`] has
//! no constructor; the single producing path is [`DecisionRecord::attest`].
//!
//! Both are proven by `compile_fail` doctests, so `cargo test` re-checks the
//! negative space.
pub mod attestation;
pub mod decision;
pub mod ledger;
pub mod settle;
pub use attestation::{Attestation, Statement};
pub use decision::{Decision, DecisionError, DecisionScope, RationaleFamily, decision_id};
pub use ledger::{DecisionLedger, DecisionStatus, MemoryLedger};
pub use settle::{DecisionRecord, SettleState, Settled, Unsettled};