pub fn compose_root(
artifact: &str,
control: Option<&str>,
intent: &str,
previous: Option<&str>,
) -> StringExpand description
Compose the three-pillar BLAKE3 → hex composed_root from the four
pillars. control and previous are Option<&str> because the
receipt-envelope + attestation surfaces both treat an absent
slot as “no control step” / “no chain predecessor”, encoded on
the wire as either an empty string (the receipt-envelope
control_hash: "" posture) or an absent slot (the attestation
previous_root: None posture). The composer normalizes both onto
the same “empty-bytes chunk between the \n separators” wire
shape — matching every pre-lift consumer byte-for-byte.
A byte-identity pin at [tests::compose_root_matches_pre_lift_ hand_authored_chain] fixes the composition against the
hand-authored chain both pre-lift consumers walked, so a
regression at the composer’s body (a reordered pillar, a swapped
separator, a missing hex::encode) surfaces at ONE substrate
pin rather than as silent invalidation of every downstream
composed_root read.