pub struct Classification {
pub point_type: ConvergencePointType,
pub substrate: SubstrateType,
pub horizon: Horizon,
pub calm: CalmClassification,
pub data_classification: DataClassification,
}Expand description
Lattice position of a Process — six orthogonal axes.
Fields§
§point_type: ConvergencePointType§substrate: SubstrateType§horizon: Horizon§calm: CalmClassification§data_classification: DataClassificationImplementations§
Source§impl Classification
impl Classification
Sourcepub fn gate_compute() -> Self
pub fn gate_compute() -> Self
The workspace-baseline classification — a ConvergencePointType::Gate
point on the SubstrateType::Compute substrate with every other axis
at its Default. The (Gate, Compute) pair names an unremarkable
barrier point in the Compute plane: no domain-specific structural
claim (no fan-out / fan-in / broadcast / observation semantics beyond
the barrier gate) and no domain-specific substrate claim (no
Financial / Network / Storage / Security / Identity /
Observability / Regulatory plane bringing in its own compliance
baselines). The three defaulted axes ride at the intentional
workspace baseline the sibling closed-set primitives already own:
Horizon at HorizonKind::Bounded (terminates naturally, no
asymptotic metric axes required), CalmClassification::Monotone
(no coordination required per CALM), and
DataClassification::Internal (access-controlled but not
externally regulated).
Pre-lift the six-line Classification { point_type: Gate, substrate: Compute, horizon: Default::default(), calm: Default::default(), data_classification: Default::default() } struct-literal recurred
at TEN sites past the ★★ PRIME-DIRECTIVE ≥ 2 duplication threshold
— one production consumer plus nine test-fixture callsites spread
across four crates, each restating the SAME (Gate, Compute)
baseline verbatim:
crate::ephemeral::default_ephemeral_class— the substitute [EphemeralSpec::into::<crate::crd::ProcessSpec>] fills intocrate::crd::ProcessSpec::classificationwhen the operator omits an explicit:classificationslot on(defephemeral …). The one PRODUCTION consumer of the shape — a regression that drifted its point-type or substrate axis silently retargets every unadorned ephemeral to a different plane.crate::crd’s +crate::lib’s +crate::lifetime_clock’s +tatara_reconciler::{claim,render}’s +tatara_pool_reconciler:: controller_pool’sempty_spec/empty_process_spec/ephemeral_process/permanent_processtest-fixture helpers + inlineProcessSpecliterals — nine test-fixture callsites restating the SAME six-line struct-literal at the same shape.
Post-lift every callsite reads Classification::gate_compute();
a future workspace-wide baseline shift (a new Horizon default,
a promotion of Compute to a compound baseline that pre-fills a
canonical CalmClassification, a per-baseline compliance overlay
stamping through the classification, or a rename of either axis
enum) lands at ONE substrate function here and every downstream
consumer inherits the upgrade mechanically. The current pin ties
the three defaulted axes to the sibling closed-set defaults
(HorizonKind::Bounded, CalmClassification::Monotone,
DataClassification::Internal) so a future change to any sibling
default surfaces at this primitive’s tests rather than as silent
drift across ten independent callsites.
Sibling to the _or_default / _or_placeholder primitive family on
crate::prelude::Process on the (return-form × axis) axis — those
primitives own the borrow-form projections off a live Process;
this one owns the construction shape for a fresh
crate::crd::ProcessSpec whose classification axis is
unremarkable. A future peer Classification::observe_observability()
or similar named variant lands as a sibling method here when a
second unremarkable-baseline shape opens.
Theory anchor: THEORY.md §VI.1 (generation over composition — the six-line struct-literal shape recurred at TEN hand-authored sites past the ★★ PRIME-DIRECTIVE ≥ 2 duplication trigger and is lifted onto ONE workspace-wide owner here). THEORY.md §II.1 invariant 5 (composition preserves proofs — a regression that drifted the baseline axis choice at only one consumer, or that broke the sibling-default correspondence, surfaces at this primitive’s tests rather than as silent operator-visible skew between the ephemeral sugar substitute and the ten downstream test-fixtures whose assertions depend on the shape).
Sourcepub fn has_point_type(&self, kind: ConvergencePointType) -> bool
pub fn has_point_type(&self, kind: ConvergencePointType) -> bool
Closed-set-driven presence probe — does this Classification
carry the given ConvergencePointType discriminator on its
Self::point_type slot? The ONE substrate primitive that owns
the (Classification, ConvergencePointType) -> bool
scalar-carrier walk shape.
§Third scalar-carrier peer on the presence-probe axis
Peer of crate::spec::SignalPolicy::has_sighup_strategy and
crate::encapsulates::EncapsulatesSpec::has_mode — all three
probe a scalar closed-set-discriminator field on an inner
crate::crd::ProcessSpec struct via a one-line
self.<field> == kind body. Together they compose the
SCALAR-CARRIER stratum of the workspace-wide closed-set-driven
presence-probe algebra (the workspace-wide algebra spans three
underlying representation kinds — Option-slot, slice, scalar —
see the crate::spec::SignalPolicy::has_sighup_strategy
docstring for the full-shape rundown; this method is the third
scalar-carrier instance).
§Semantics — VARIANT match, not POPULATED slot
has_point_type(kind) returns true iff self.point_type == kind. Distinct from BOTH prior scalar-carrier peers on the
(parent-shape × child-shape) axis:
crate::spec::SignalPolicy::has_sighup_strategylives on a non-Option, DEFAULTED parent (SignalPolicy: Default) with a defaulted scalar child (SighupStrategy: Default = Reconverge) — a default carrier readstruefor the default variant only.crate::encapsulates::EncapsulatesSpec::has_modelives on an OPTION parent (spec.encapsulates: Option<EncapsulatesSpec>) with a defaulted scalar child (EncapsulationMode: Default = Manage) — a bareNoneparent readsfalsefor every variant.has_point_typelives on a REQUIRED, non-Option, NON-DEFAULT parent (Classificationhas noimpl Default) with a NON-DEFAULT scalar child (ConvergencePointTypehas noimpl Default) — every well-formedcrate::crd::ProcessSpeccarries aClassificationwhosepoint_typeslot is deliberately chosen by the operator, so the probe returnstrueon exactly ONE variant per spec andfalseon the other seven, with no default-arm short-circuit shortcut.
This closes the (required-parent × required-scalar-child) corner of the workspace-wide closed-set-driven presence-probe algebra at its first substrate primitive.
§Compounding
A future closed-set-discriminator scalar field on
Classification (a peer has_substrate, has_calm,
has_data_classification — the four remaining
classification-axis closed sets) lands as ONE peer inherent
method with the same one-line self.<field> == kind body and
routes through the same strip_and_classify_prefixed_kind::<K, _> shape in tatara-check. A future
ConvergencePointType variant (a hypothetical Demux /
Mux / Pipeline for finer topology carving) reaches every
downstream through ONE ALL entry on the closed set with the
probe body untouched.
Theory anchor: THEORY.md §II.1 invariant 5 — composition preserves
proofs; the scalar-carrier presence-probe body lives at ONE
substrate site so every downstream (point-type-<kind>
require-tag family in tatara-check, closed-set audit
dispatchers, future variant additions on
ConvergencePointType) binds through the SAME shape rather
than restating the classification.point_type == kind closure
body at each callsite. THEORY.md §VI.1 — generation over
composition; a future ConvergencePointType variant lands at
ONE ALL entry + ONE as_str arm on the closed set and the
probe picks it up mechanically without further per-consumer
edits.
Sourcepub fn has_substrate(&self, kind: SubstrateType) -> bool
pub fn has_substrate(&self, kind: SubstrateType) -> bool
Closed-set-driven presence probe — does this Classification
carry the given SubstrateType discriminator on its
Self::substrate slot? The ONE substrate primitive that
owns the (Classification, SubstrateType) -> bool
scalar-carrier walk shape.
§Fourth scalar-carrier peer on the presence-probe axis
Peer of crate::spec::SignalPolicy::has_sighup_strategy,
crate::encapsulates::EncapsulatesSpec::has_mode, and
Self::has_point_type — all four probe a scalar closed-set-
discriminator field on an inner crate::crd::ProcessSpec
struct via a one-line self.<field> == kind body. Together
they compose the SCALAR-CARRIER stratum of the workspace-wide
closed-set-driven presence-probe algebra (the workspace-wide
algebra spans three underlying representation kinds — Option-
slot, slice, scalar — see the
crate::spec::SignalPolicy::has_sighup_strategy docstring
for the full-shape rundown; this method is the fourth scalar-
carrier instance).
§Semantics — VARIANT match, not POPULATED slot
has_substrate(kind) returns true iff self.substrate == kind. FIRST co-tenant on the (required-parent × required-
scalar-child) corner of the algebra with Self::has_point_type
— both probe REQUIRED, non-Option, NON-DEFAULT slots on the
same Classification parent whose two required axes carry
no Default impl, so exactly ONE of the eight SubstrateType
variants and exactly ONE of the eight ConvergencePointType
variants answer true per well-formed crate::crd::ProcessSpec,
with no default-arm short-circuit shortcut. Distinct from the
two prior scalar-carrier peers on the (parent-shape × child-
shape) axis: has_sighup_strategy lives on a non-Option,
DEFAULTED parent (crate::spec::SignalPolicy carries
#[derive(Default)]) with a defaulted scalar child
(crate::signal::SighupStrategy defaults to
crate::signal::SighupStrategy::Reconverge); has_mode
lives on an OPTION parent (spec.encapsulates: Option<EncapsulatesSpec>) with a defaulted scalar child
(crate::encapsulates::EncapsulationMode defaults to
crate::encapsulates::EncapsulationMode::Manage).
This POPULATES the (required-parent × required-scalar-child)
corner of the workspace-wide closed-set-driven presence-probe
algebra at its SECOND substrate primitive after
Self::has_point_type opened the corner, pinning the corner
as a proven-repeatable primitive shape rather than a single-
example curiosity.
§Compounding
A future closed-set-discriminator scalar field on
Classification (a peer has_calm on CalmClassification,
has_data_classification on DataClassification — the two
remaining defaulted-scalar-child classification-axis closed
sets) lands as ONE peer inherent method with the same one-line
self.<field> == kind body and routes through the same
strip_and_classify_prefixed_kind::<K, _> shape in
tatara-check. A future SubstrateType variant (a
hypothetical Consensus for governance substrates, Physical
for hardware substrates, Cache for ephemeral memoization
substrates) reaches every downstream through ONE ALL entry
on the closed set with the probe body untouched.
Theory anchor: THEORY.md §II.1 invariant 5 — composition preserves
proofs; the scalar-carrier presence-probe body lives at ONE
substrate site so every downstream (substrate-<kind>
require-tag family in tatara-check, closed-set audit
dispatchers, future variant additions on SubstrateType)
binds through the SAME shape rather than restating the
classification.substrate == kind closure body at each
callsite. THEORY.md §VI.1 — generation over composition; a
future SubstrateType variant lands at ONE ALL entry +
ONE as_str arm on the closed set and the probe picks it up
mechanically without further per-consumer edits.
Sourcepub fn has_calm(&self, kind: CalmClassification) -> bool
pub fn has_calm(&self, kind: CalmClassification) -> bool
Closed-set-driven presence probe — does this Classification
carry the given CalmClassification discriminator on its
Self::calm slot? The ONE substrate primitive that owns the
(Classification, CalmClassification) -> bool scalar-carrier
walk shape.
§Fifth scalar-carrier peer on the presence-probe axis
Peer of crate::spec::SignalPolicy::has_sighup_strategy,
crate::encapsulates::EncapsulatesSpec::has_mode,
Self::has_point_type, and Self::has_substrate — all
five probe a scalar closed-set-discriminator field on an inner
crate::crd::ProcessSpec struct via a one-line
self.<field> == kind body. Together they compose the
SCALAR-CARRIER stratum of the workspace-wide closed-set-driven
presence-probe algebra (the workspace-wide algebra spans three
underlying representation kinds — Option-slot, slice, scalar
— see the crate::spec::SignalPolicy::has_sighup_strategy
docstring for the full-shape rundown; this method is the
fifth scalar-carrier instance).
§Semantics — VARIANT match, not POPULATED slot
has_calm(kind) returns true iff self.calm == kind. FIRST
occupant on a FRESH corner of the (parent-shape × child-shape)
axis: a REQUIRED, non-Option, NON-DEFAULT parent
(Classification has no impl Default because its two
required axes point_type/substrate carry no default)
combined with a DEFAULTED scalar child
(CalmClassification defaults to
CalmClassification::Monotone via #[default]). Distinct
from every prior scalar-carrier peer on the (parent-shape ×
child-shape) axis:
crate::spec::SignalPolicy::has_sighup_strategylives on a non-Option, DEFAULTED parent (crate::spec::SignalPolicycarries#[derive(Default)]) with a defaulted scalar child (crate::signal::SighupStrategydefaults tocrate::signal::SighupStrategy::Reconverge) — a bareSignalPolicyreadstrueon the default variant only.crate::encapsulates::EncapsulatesSpec::has_modelives on an OPTION parent (spec.encapsulates: Option<EncapsulatesSpec>) with a defaulted scalar child (crate::encapsulates::EncapsulationModedefaults tocrate::encapsulates::EncapsulationMode::Manage) — a bareNoneparent readsfalsefor every variant.Self::has_point_type+Self::has_substrateboth live on the REQUIRED, non-Option, NON-DEFAULTClassificationparent with a NON-DEFAULT scalar child — every well-formedcrate::crd::ProcessSpeccarries aClassificationwhose corresponding slot was deliberately chosen by the operator, so exactly ONE of the eight variants answerstrueper spec.has_calmlives on the REQUIRED, non-Option, NON-DEFAULTClassificationparent with a DEFAULTED scalar child (CalmClassification::Monotoneis theDefaultvia#[default]) — a bareClassificationfilled via..Default::default()on the defaulted axes readstruefor the default variant (CalmClassification::Monotone) andfalsefor every other. Exactly ONE of the two variants answerstrueper spec, and the default-arm short-circuit is present (the operator can DECLINE to name the CALM axis and the spec still answerstrueon the default variant).
This OPENS the (required-parent × defaulted-scalar-child) corner of the workspace-wide closed-set-driven presence-probe algebra at its first substrate primitive — a corner distinct from all four prior scalar-carrier peers (which sit on the three prior corners: defaulted-parent × defaulted-child, Option-parent × defaulted-child, required-parent × required-child).
§Compounding
A future closed-set-discriminator scalar field on
Classification whose child carries #[derive(Default)]
(a peer has_data_classification on DataClassification,
whose default is DataClassification::Internal via
#[default] — the remaining classification-axis closed set
on a defaulted-scalar-child slot) lands as ONE peer inherent
method with the same one-line self.<field> == kind body and
routes through the same strip_and_classify_prefixed_kind::<K, _> shape in tatara-check. A future CalmClassification
variant (a hypothetical ConditionallyMonotone for ops that
are monotone under a witness, like CRDT joins under a fixed
schema) reaches every downstream through ONE ALL entry on
the closed set with the probe body untouched.
Theory anchor: THEORY.md §II.1 invariant 5 — composition
preserves proofs; the scalar-carrier presence-probe body
lives at ONE substrate site so every downstream
(calm-<kind> require-tag family in tatara-check,
closed-set audit dispatchers, future variant additions on
CalmClassification) binds through the SAME shape rather
than restating the classification.calm == kind closure body
at each callsite. THEORY.md §VI.1 — generation over
composition; a future CalmClassification variant lands at
ONE ALL entry + ONE as_str arm on the closed set and the
probe picks it up mechanically without further per-consumer
edits.
Sourcepub fn has_data_classification(&self, kind: DataClassification) -> bool
pub fn has_data_classification(&self, kind: DataClassification) -> bool
Closed-set-driven presence probe — does this Classification
carry the given DataClassification discriminator on its
Self::data_classification slot? The ONE substrate primitive
that owns the (Classification, DataClassification) -> bool
scalar-carrier walk shape.
§Sixth scalar-carrier peer on the presence-probe axis
Peer of crate::spec::SignalPolicy::has_sighup_strategy,
crate::encapsulates::EncapsulatesSpec::has_mode,
Self::has_point_type, Self::has_substrate, and
Self::has_calm — all six probe a scalar closed-set-
discriminator field on an inner crate::crd::ProcessSpec
struct via a one-line self.<field> == kind body. Together
they compose the SCALAR-CARRIER stratum of the workspace-wide
closed-set-driven presence-probe algebra (the workspace-wide
algebra spans three underlying representation kinds — Option-
slot, slice, scalar — see the
crate::spec::SignalPolicy::has_sighup_strategy docstring
for the full-shape rundown; this method is the sixth scalar-
carrier instance).
§Semantics — VARIANT match, not POPULATED slot
has_data_classification(kind) returns true iff
self.data_classification == kind. SECOND co-tenant on the
(required-parent × defaulted-scalar-child) corner of the
algebra alongside Self::has_calm — both probe REQUIRED,
non-Option, NON-DEFAULT Classification parent slots with
a DEFAULTED scalar child (DataClassification defaults to
DataClassification::Internal via #[default], sibling to
CalmClassification::Monotone’s #[default]), so exactly
ONE of the six DataClassification variants answers true
per spec AND the default-arm short-circuit is present (a
Classification filled via ..Default::default() on the
data_classification axis reads true on the default
variant DataClassification::Internal and false on every
other).
This POPULATES the (required-parent × defaulted-scalar-child)
corner of the workspace-wide closed-set-driven presence-probe
algebra at its SECOND substrate primitive after
Self::has_calm opened the corner, pinning the corner as a
proven-repeatable primitive shape rather than a single-example
curiosity. The corner-property contract (“bare
Classification reads true on the default variant”)
now walks TWO independent defaulted-scalar-child slots on the
SAME Classification parent — a regression that promoted
a different DataClassification variant to #[default]
(or wired the arm to a fixed variant answer) fails HERE at
ONE narrow substrate site before drifting through every
unadorned Process’s baseline data-classification answer.
§Compounding
This method exhausts the four scalar closed-set-discriminator
axes on Classification (Self::has_point_type,
Self::has_substrate, Self::has_calm, and
Self::has_data_classification) — the six-axis classification
lattice publishes ALL FOUR of its scalar-carrier presence
probes at ONE substrate site each. The remaining two axes
(horizon — a nested struct threading HorizonKind through
horizon.kind; the sixth axis is variant-dependent on the
HorizonKind::Asymptotic arm) live on nested-struct-scalar
slots rather than the direct-scalar corner the four current
peers span — the Self::has_horizon_kind peer opens that
fresh (required-parent × nested-struct-scalar-child) corner
with the same has(kind) shape composed through one struct
hop. A future DataClassification variant (a
hypothetical seventh variant beyond Public / Internal / Confidential / Pii / Phi / Pci — say a TradeSecret bucket
for competitive-sensitive data, or an Anonymized bucket for
pseudonymized-PII whose regulatory posture differs) reaches
every downstream through ONE ALL entry on the closed set +
ONE as_str arm + ONE sensitivity_rank arm + one arm per
predicate with the probe body untouched.
Theory anchor: THEORY.md §II.1 invariant 5 — composition
preserves proofs; the scalar-carrier presence-probe body
lives at ONE substrate site so every downstream
(data-classification-<kind> require-tag family in
tatara-check, closed-set audit dispatchers, future variant
additions on DataClassification) binds through the SAME
shape rather than restating the
classification.data_classification == kind closure body at
each callsite. THEORY.md §VI.1 — generation over composition;
a future DataClassification variant lands at ONE ALL
entry + ONE as_str arm on the closed set and the probe
picks it up mechanically without further per-consumer edits.
Sourcepub fn has_horizon_kind(&self, kind: HorizonKind) -> bool
pub fn has_horizon_kind(&self, kind: HorizonKind) -> bool
Closed-set-driven presence probe — does this Classification
carry the given HorizonKind discriminator on its
Self::horizon.kind slot? The ONE substrate primitive that
owns the (Classification, HorizonKind) -> bool nested-struct-
scalar-carrier walk shape.
§Seventh peer on the presence-probe axis — first on a fresh corner
Peer of crate::spec::SignalPolicy::has_sighup_strategy,
crate::encapsulates::EncapsulatesSpec::has_mode,
Self::has_point_type, Self::has_substrate,
Self::has_calm, and Self::has_data_classification on the
workspace-wide closed-set-driven presence-probe algebra — the
four scalar-carrier peers on Classification all read a
closed-set discriminator DIRECTLY off a scalar Classification
slot (point_type, substrate, calm, data_classification).
has_horizon_kind instead threads through a NESTED-STRUCT
intermediary (Horizon, the defaulted nested struct owning
the horizon axis on the six-axis classification lattice) to
reach a scalar HorizonKind discriminator on
horizon.kind. This OPENS the (required-parent × nested-
struct-scalar-child) corner of the algebra at its FIRST
substrate primitive — a fresh corner distinct from all four
corner-property-exhaustive scalar-carrier peers on
Classification.
§Semantics — VARIANT match on the nested scalar, not POPULATED nested struct
has_horizon_kind(kind) returns true iff
self.horizon.kind == kind. The nested Horizon struct
carries Default via #[derive(Default)] and its kind
field defaults to HorizonKind::Bounded via #[default], so
a Classification filled via ..Default::default() on the
horizon axis reads true on the default kind
HorizonKind::Bounded and false on
HorizonKind::Asymptotic. The default-arm short-circuit is
therefore present at this corner too — but through the extra
struct hop the peer scalar-carrier peers on the defaulted-
child corner (has_calm, has_data_classification) walk
directly. A regression that dropped #[default] on
HorizonKind, or that replaced Horizon::default() in
Classification::gate_compute with an explicit non-Bounded
kind, surfaces at this primitive’s tests before drifting
through every unadorned Process’s baseline horizon answer.
§Compounding
This method OPENS the (required-parent × nested-struct-scalar-
child) corner of the workspace-wide closed-set-driven
presence-probe algebra, distinct from the four corner-property-
exhaustive scalar-carrier peers on Classification
(Self::has_point_type, Self::has_substrate,
Self::has_calm, Self::has_data_classification) whose
bodies read a closed-set discriminator directly off a scalar
slot. A future co-tenant on this fresh corner (a peer probe on
another nested-struct’s scalar discriminator, e.g. a
hypothetical has_optimization_direction reaching
spec.classification.horizon.direction.unwrap_or_default(), or
a nested-struct-scalar discriminator on a different ProcessSpec
field’s inner struct) lands as ONE peer inherent method with
the same two-hop self.<outer>.<inner> == kind body and routes
through the same strip_and_classify_prefixed_kind::<K, _>
shape in tatara-check. A future HorizonKind variant (a
hypothetical Periodic sentinel for “terminates on each
window boundary then re-arms”, pre-flagged on the closed set’s
ALL docstring) reaches every downstream through ONE ALL
entry + one as_str arm + one terminates arm + one
requires_metric_axes arm on the closed set with the probe
body untouched.
Theory anchor: THEORY.md §II.1 invariant 5 — composition
preserves proofs; the nested-struct-scalar-carrier presence-
probe body lives at ONE substrate site so every downstream
(horizon-<kind> require-tag family in tatara-check, future
audit dispatchers walking HorizonKind::ALL, future variant
additions on HorizonKind) binds through the SAME
has(kind) shape rather than restating the
classification.horizon.kind == kind closure body at each
callsite. THEORY.md §VI.1 — generation over composition; a
future HorizonKind variant lands at ONE ALL entry + ONE
as_str arm on the closed set and the probe picks it up
mechanically without further per-consumer edits.
Sourcepub fn has_optimization_direction(&self, kind: OptimizationDirection) -> bool
pub fn has_optimization_direction(&self, kind: OptimizationDirection) -> bool
Closed-set-driven presence probe — does this Classification
carry the given OptimizationDirection discriminator on its
Self::horizon.direction slot (with the substrate
Option::unwrap_or_default treating None as the closed set’s
#[default] Minimize)? The ONE substrate primitive that owns
the (Classification, OptimizationDirection) -> bool nested-
struct-Option-scalar-carrier walk shape.
§Second occupant on the nested-struct-scalar-child corner —
the Option-hop co-tenant
Peer of Self::has_horizon_kind on the (required-parent ×
nested-struct-scalar-child) corner opened by that method — same
two-hop composition through the nested defaulted Horizon
intermediary, but the inner scalar slot is direction: Option<OptimizationDirection> (an Option-hop past the same
nested Horizon) rather than a bare scalar. The corner
therefore admits BOTH direct nested-scalar shapes (Horizon
carries kind: HorizonKind directly, Self::has_horizon_kind
walks it) AND Option-nested-scalar shapes (Horizon carries
direction: Option<OptimizationDirection>, this method walks
it through Option::unwrap_or_default), pinning the corner as
a proven-repeatable primitive shape rather than a single-
example curiosity. Every prior scalar-carrier peer on
Classification (has_point_type, has_substrate,
has_calm, has_data_classification) reads a closed-set
discriminator DIRECTLY off a scalar Classification slot; this
method (like Self::has_horizon_kind) threads through the
nested Horizon intermediary, and additionally traverses the
Option-slot with unwrap_or_default so the operator’s
:requires (optimization-direction-Minimize) on an unadorned
baseline still answers true on the closed set’s default arm.
§Semantics — VARIANT match on the Option-defaulted nested
scalar, not POPULATED Option
has_optimization_direction(kind) returns true iff
self.horizon.direction.unwrap_or_default() == kind.
OptimizationDirection carries #[default] Minimize via
the derived Default impl, so a Process filled through
Horizon::bounded (which leaves direction: None) or
through Horizon::default() (same shape, direction: None)
answers true on OptimizationDirection::Minimize and
false on OptimizationDirection::Maximize. This mirrors
the default-arm short-circuit contract every other closed-set-
defaulted-child probe on Classification publishes
(has_calm, has_data_classification, has_horizon_kind) —
the Option-hop is soft-mapped to the closed set’s default
arm rather than surfaced as a distinct presence axis. A
regression that flipped OptimizationDirection’s
#[default] off Minimize (which would silently invert every
unadorned Asymptotic Process’s rate-window evaluator
polarity — see the OptimizationDirection::Minimize variant
docstring) fails at this probe’s default-arm tests before
drifting through every downstream consumer.
§Semantics rationale — Option-hop as default vs presence
The direction: Option<OptimizationDirection> slot on
Horizon is documented as “Asymptotic only” — a Bounded
horizon has no meaningful direction so the operator leaves
it None. Yet the closed set carries #[default] Minimize,
so a bare Bounded Process’s optimization direction reads
as Minimize at every consumer downstream via
Option::unwrap_or_default. That default IS the substrate’s
operator-facing answer for “what direction would this Process
optimize toward if it became Asymptotic without further
annotation?”, and a :requires (optimization-direction- Minimize) audit at the checks.lisp surface correctly matches
every unadorned Process — matching the corner-property contract
every other defaulted-child probe publishes. An operator who
wants a strict presence axis (is direction *actually* set?)
gets that answer through a distinct future primitive
(has_optimization_direction_set) that would read the
is_some bit alone — orthogonal to this variant-equality
probe. This method commits to the variant-equality
interpretation so the corner-property contract stays uniform
with the four scalar-carrier peers.
§Compounding
This method POPULATES the (required-parent × nested-struct-
scalar-child) corner at its SECOND substrate primitive after
Self::has_horizon_kind opened it — pinning the corner as
a proven-repeatable primitive shape rather than a single-
example curiosity, and DEMONSTRATING that the corner admits
both direct-scalar and Option-scalar traversals through the
same nested-struct intermediary via the closed set’s default.
A future co-tenant on this corner (a peer probe on another
nested-struct’s scalar or Option-scalar discriminator, e.g.
a hypothetical has_backend_port_family reaching
spec.routing.as_ref().and_then(|r| r.backend.tls_issuer.as_ref()).is_some()
or a nested-struct-scalar discriminator on
spec.encapsulates.<some-inner>.kind) lands as ONE peer
inherent method with the same two-hop self.<outer>.<inner>
walk (with or without an Option-hop threading through the
closed set’s Default) and routes through the same
strip_and_classify_prefixed_kind::<K, _> shape in
tatara-check. A future OptimizationDirection variant
(a hypothetical Stabilize sentinel for “drive toward a
target value”, pre-flagged on the closed set’s ALL
docstring) reaches every downstream through ONE ALL entry
- one
as_strarm + oneprefers_lowerarm + oneis_improvementarm on the closed set with the probe body untouched.
Theory anchor: THEORY.md §II.1 invariant 5 — composition
preserves proofs; the nested-struct-Option-scalar-carrier
presence-probe body lives at ONE substrate site so every
downstream (optimization-direction-<kind> require-tag family
in tatara-check, future audit dispatchers walking
OptimizationDirection::ALL, future variant additions on
OptimizationDirection) binds through the SAME
has(kind) shape rather than restating the
classification.horizon.direction.unwrap_or_default() == kind
closure body at each callsite. THEORY.md §VI.1 — generation
over composition; a future OptimizationDirection variant
lands at ONE ALL entry + ONE as_str arm on the closed set
and the probe picks it up mechanically without further
per-consumer edits.
Trait Implementations§
Source§impl Clone for Classification
impl Clone for Classification
Source§fn clone(&self) -> Classification
fn clone(&self) -> Classification
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 Classification
impl Debug for Classification
Source§impl<'de> Deserialize<'de> for Classification
impl<'de> Deserialize<'de> for Classification
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>,
Source§impl JsonSchema for Classification
impl JsonSchema for Classification
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 Classification
impl PartialEq for Classification
Source§impl Serialize for Classification
impl Serialize for Classification
impl StructuralPartialEq for Classification
Auto Trait Implementations§
impl Freeze for Classification
impl RefUnwindSafe for Classification
impl Send for Classification
impl Sync for Classification
impl Unpin for Classification
impl UnsafeUnpin for Classification
impl UnwindSafe for Classification
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<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);