pub struct ReceiptEnvelope {
pub version: String,
pub kind: String,
pub composed_root: String,
pub intent_hash: String,
pub artifact_hash: String,
pub control_hash: String,
pub generated_at: DateTime<Utc>,
pub process_ref: Option<String>,
pub evidence: Value,
}Expand description
Typed receipt envelope. Any Job in pleme-io that wants its result to
chain into a Process’s status.attestation writes one of these.
Fields§
§version: StringMust equal RECEIPT_VERSION. Mismatches reject the receipt.
kind: StringWhat this receipt proves. Known: closed-loop-auth, db-migration,
test-suite, nix-build. Operators may register new kinds —
the envelope is open.
composed_root: StringThree-pillar root: BLAKE3(domain ++ artifact ++ control ++ intent ++ previous).
intent_hash: StringPillar 1: what the Job was trying to do (canonical intent).
artifact_hash: StringPillar 2: what the Job produced (artifact / proof material).
control_hash: StringPillar 3: how the Job verified its work (controls / signatures / auth steps). Empty string when there was no control step.
generated_at: DateTime<Utc>Timestamp the Job set when it wrote the receipt.
process_ref: Option<String>Optional owning-Process reference (namespace/name). When the
reconciler creates the Job it stamps this in via the downward
API; receipts without it still parse for ad-hoc / out-of-cluster
runs.
evidence: ValueOptional structured evidence. Free-form JSON. The reconciler does not parse this — it’s for human / downstream-tool inspection.
Implementations§
Source§impl ReceiptEnvelope
impl ReceiptEnvelope
Sourcepub fn build(
kind: impl Into<String>,
intent_hash: impl Into<String>,
artifact_hash: impl Into<String>,
control_hash: impl Into<String>,
previous_root: Option<&str>,
) -> Self
pub fn build( kind: impl Into<String>, intent_hash: impl Into<String>, artifact_hash: impl Into<String>, control_hash: impl Into<String>, previous_root: Option<&str>, ) -> Self
Build a receipt envelope from typed pillars + kind. generated_at
defaults to Utc::now().
Sourcepub fn parse_json(payload: &str) -> Result<Self, ReceiptError>
pub fn parse_json(payload: &str) -> Result<Self, ReceiptError>
Parse a receipt from a JSON string.
Sourcepub fn parse_yaml(payload: &str) -> Result<Self, ReceiptError>
pub fn parse_yaml(payload: &str) -> Result<Self, ReceiptError>
Parse a receipt from a YAML string. Useful for ConfigMaps that store the payload in YAML form.
Sourcepub fn parse_either(payload: &str) -> Result<Self, ReceiptError>
pub fn parse_either(payload: &str) -> Result<Self, ReceiptError>
Parse via JSON first, then YAML if JSON fails. Lets a single
reader accept either wire form without the operator having to
declare it. Useful when the Job writes JSON and the reconciler
reads back through a kube DynamicObject whose data is YAML.
Sourcepub fn verify_shape(&self) -> Result<(), ReceiptError>
pub fn verify_shape(&self) -> Result<(), ReceiptError>
Verify the schema-level invariants: correct version + non-empty kind + non-empty pillar hashes (length-only, not BLAKE3-recompute).
Sourcepub fn verify_root(&self, expected_previous_root: Option<&str>) -> bool
pub fn verify_root(&self, expected_previous_root: Option<&str>) -> bool
Verify that composed_root is consistent with the pillars.
expected_previous_root is the previous root in the Process’s
attestation chain (or None for first attestation).
Sourcepub fn expect_root(&self, expected: Option<&str>) -> Result<&str, ReceiptError>
pub fn expect_root(&self, expected: Option<&str>) -> Result<&str, ReceiptError>
Strict-equality check against an operator-provided expected root. Returns the receipt’s root unchanged on success.
Sourcepub fn known_kind(&self) -> Option<ReceiptKind>
pub fn known_kind(&self) -> Option<ReceiptKind>
Decode self.kind into the typed ReceiptKind variant when
the wire string matches one of the four substrate-emitted
canonical kebab-case kinds; None when the kind is an
operator-registered open string (the schema is open by design —
every receipt remains a valid receipt, but only typed kinds
participate in closed-set dispatch). The (open String,
closed-typed view) split lets future kind-keyed consumers
(verifier registries, dashboard completion, audit-trail
classifiers) sweep the typed variants without touching the
open-by-design wire shape. Lifted as the canonical decode site
so no consumer re-implements the match self.kind.as_str()
arm-by-arm — the closed-set sweep happens through
[ReceiptKind::from_str] at ONE site.
Sourcepub fn to_attestation(
&self,
generation: u64,
previous_root: Option<&str>,
) -> ProcessAttestation
pub fn to_attestation( &self, generation: u64, previous_root: Option<&str>, ) -> ProcessAttestation
Lower into a ProcessAttestation — the canonical handoff so a
Job’s typed receipt becomes evidence on a Process. generation
previous_rootcome from the owning Process’s prior attestation (or 0 + None for the first cycle).
Trait Implementations§
Source§impl Clone for ReceiptEnvelope
impl Clone for ReceiptEnvelope
Source§fn clone(&self) -> ReceiptEnvelope
fn clone(&self) -> ReceiptEnvelope
1.0.0 (const: unstable) · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreSource§impl Debug for ReceiptEnvelope
impl Debug for ReceiptEnvelope
Source§impl<'de> Deserialize<'de> for ReceiptEnvelope
impl<'de> Deserialize<'de> for ReceiptEnvelope
Source§fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
impl Eq for ReceiptEnvelope
Source§impl JsonSchema for ReceiptEnvelope
impl JsonSchema for ReceiptEnvelope
Source§fn schema_name() -> String
fn schema_name() -> String
Source§fn schema_id() -> Cow<'static, str>
fn schema_id() -> Cow<'static, str>
Source§fn json_schema(generator: &mut SchemaGenerator) -> Schema
fn json_schema(generator: &mut SchemaGenerator) -> Schema
Source§fn is_referenceable() -> bool
fn is_referenceable() -> bool
$ref keyword. Read moreSource§impl PartialEq for ReceiptEnvelope
impl PartialEq for ReceiptEnvelope
Source§impl Serialize for ReceiptEnvelope
impl Serialize for ReceiptEnvelope
impl StructuralPartialEq for ReceiptEnvelope
Auto Trait Implementations§
impl Freeze for ReceiptEnvelope
impl RefUnwindSafe for ReceiptEnvelope
impl Send for ReceiptEnvelope
impl Sync for ReceiptEnvelope
impl Unpin for ReceiptEnvelope
impl UnsafeUnpin for ReceiptEnvelope
impl UnwindSafe for ReceiptEnvelope
Blanket Implementations§
impl<T> AppData for Twhere
T: OptionalSend + OptionalSync + 'static + OptionalSerde,
impl<T> AppDataResponse for Twhere
T: OptionalSend + OptionalSync + 'static + OptionalSerde,
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> DeserializeOwned for Twhere
T: for<'de> Deserialize<'de>,
Source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
Source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
Source§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
key and return true if they are equal.Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
Source§fn in_current_span(self) -> Instrumented<Self> ⓘ
fn in_current_span(self) -> Instrumented<Self> ⓘ
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
Source§fn in_current_span(self) -> Instrumented<Self> ⓘ
fn in_current_span(self) -> Instrumented<Self> ⓘ
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreimpl<T> OptionalSend for T
impl<T> OptionalSync for T
Source§impl<T> Paint for Twhere
T: ?Sized,
impl<T> Paint for Twhere
T: ?Sized,
Source§fn fg(&self, value: Color) -> Painted<&T>
fn fg(&self, value: Color) -> Painted<&T>
Returns a styled value derived from self with the foreground set to
value.
This method should be used rarely. Instead, prefer to use color-specific
builder methods like red() and
green(), which have the same functionality but are
pithier.
§Example
Set foreground color to white using fg():
use yansi::{Paint, Color};
painted.fg(Color::White);Set foreground color to white using white().
use yansi::Paint;
painted.white();Source§fn bright_black(&self) -> Painted<&T>
fn bright_black(&self) -> Painted<&T>
Source§fn bright_red(&self) -> Painted<&T>
fn bright_red(&self) -> Painted<&T>
Source§fn bright_green(&self) -> Painted<&T>
fn bright_green(&self) -> Painted<&T>
Source§fn bright_yellow(&self) -> Painted<&T>
fn bright_yellow(&self) -> Painted<&T>
Source§fn bright_blue(&self) -> Painted<&T>
fn bright_blue(&self) -> Painted<&T>
Source§fn bright_magenta(&self) -> Painted<&T>
fn bright_magenta(&self) -> Painted<&T>
Source§fn bright_cyan(&self) -> Painted<&T>
fn bright_cyan(&self) -> Painted<&T>
Source§fn bright_white(&self) -> Painted<&T>
fn bright_white(&self) -> Painted<&T>
Source§fn bg(&self, value: Color) -> Painted<&T>
fn bg(&self, value: Color) -> Painted<&T>
Returns a styled value derived from self with the background set to
value.
This method should be used rarely. Instead, prefer to use color-specific
builder methods like on_red() and
on_green(), which have the same functionality but
are pithier.
§Example
Set background color to red using fg():
use yansi::{Paint, Color};
painted.bg(Color::Red);Set background color to red using on_red().
use yansi::Paint;
painted.on_red();Source§fn on_primary(&self) -> Painted<&T>
fn on_primary(&self) -> Painted<&T>
Source§fn on_magenta(&self) -> Painted<&T>
fn on_magenta(&self) -> Painted<&T>
Source§fn on_bright_black(&self) -> Painted<&T>
fn on_bright_black(&self) -> Painted<&T>
Source§fn on_bright_red(&self) -> Painted<&T>
fn on_bright_red(&self) -> Painted<&T>
Source§fn on_bright_green(&self) -> Painted<&T>
fn on_bright_green(&self) -> Painted<&T>
Source§fn on_bright_yellow(&self) -> Painted<&T>
fn on_bright_yellow(&self) -> Painted<&T>
Source§fn on_bright_blue(&self) -> Painted<&T>
fn on_bright_blue(&self) -> Painted<&T>
Source§fn on_bright_magenta(&self) -> Painted<&T>
fn on_bright_magenta(&self) -> Painted<&T>
Source§fn on_bright_cyan(&self) -> Painted<&T>
fn on_bright_cyan(&self) -> Painted<&T>
Source§fn on_bright_white(&self) -> Painted<&T>
fn on_bright_white(&self) -> Painted<&T>
Source§fn attr(&self, value: Attribute) -> Painted<&T>
fn attr(&self, value: Attribute) -> Painted<&T>
Enables the styling Attribute value.
This method should be used rarely. Instead, prefer to use
attribute-specific builder methods like bold() and
underline(), which have the same functionality
but are pithier.
§Example
Make text bold using attr():
use yansi::{Paint, Attribute};
painted.attr(Attribute::Bold);Make text bold using using bold().
use yansi::Paint;
painted.bold();Source§fn rapid_blink(&self) -> Painted<&T>
fn rapid_blink(&self) -> Painted<&T>
Source§fn quirk(&self, value: Quirk) -> Painted<&T>
fn quirk(&self, value: Quirk) -> Painted<&T>
Enables the yansi Quirk value.
This method should be used rarely. Instead, prefer to use quirk-specific
builder methods like mask() and
wrap(), which have the same functionality but are
pithier.
§Example
Enable wrapping using .quirk():
use yansi::{Paint, Quirk};
painted.quirk(Quirk::Wrap);Enable wrapping using wrap().
use yansi::Paint;
painted.wrap();Source§fn clear(&self) -> Painted<&T>
👎Deprecated since 1.0.1: renamed to resetting() due to conflicts with Vec::clear().
The clear() method will be removed in a future release.
fn clear(&self) -> Painted<&T>
renamed to resetting() due to conflicts with Vec::clear().
The clear() method will be removed in a future release.
Source§fn whenever(&self, value: Condition) -> Painted<&T>
fn whenever(&self, value: Condition) -> Painted<&T>
Conditionally enable styling based on whether the Condition value
applies. Replaces any previous condition.
See the crate level docs for more details.
§Example
Enable styling painted only when both stdout and stderr are TTYs:
use yansi::{Paint, Condition};
painted.red().on_yellow().whenever(Condition::STDOUTERR_ARE_TTY);