Skip to main content

Stray

Struct Stray 

Source
pub struct Stray {
    pub path: String,
    pub kind: StrayKind,
    pub verdict: StrayVerdict,
    pub age_seconds: Option<u64>,
    pub session_id: String,
    pub published_at: String,
    pub target: String,
    pub removable: bool,
    pub removed: bool,
}
Expand description

One stray file, its verdict, and the evidence that produced it.

Every field that decided something is carried, because the rule this command is shaped around requires the value that decided a verdict to be visible before the verdict acts: a surface that printed “orphan” without the age, the episode and the file that already holds it would be asking to be trusted rather than read.

use majordomus_cli::capability::builtin::recover::{Stray, StrayKind, StrayVerdict};
use serde_json::json;

let s: Stray = serde_json::from_value(json!({
    "path": ".ai/repo/sessions/.tmp.a1b2c3",
    "kind": "publish_temp",
    "verdict": "orphan",
    "age_seconds": 90_000,
    "session_id": "s-0007",
    "published_at": ".ai/repo/sessions/2026-09-11--s-0007.md",
    "removable": true,
    "removed": false,
})).unwrap();
assert_eq!(s.verdict, StrayVerdict::Orphan);
assert_eq!(s.kind, StrayKind::PublishTemp);
// removable and removed are different facts: a check run reports the first and never
// the second, which is what makes `--check` readable as a plan rather than a report.
assert!(s.removable && !s.removed);

// and an unmeasurable one carries no age at all, rather than a zero that would read as
// "brand new" to anything that compared it with a threshold
let u: Stray = serde_json::from_value(json!({
    "path": ".mj-stage.xyz", "kind": "staging_dir", "verdict": "unmeasurable",
    "removable": false, "removed": false,
})).unwrap();
assert!(u.age_seconds.is_none());

Fields§

§path: String

The path, repository-relative. Never the absolute one: a finding that names a disk is a finding nobody else can act on (project.no-machine-paths).

§kind: StrayKind

Which of the three shapes this is.

§verdict: StrayVerdict

What reading it decided.

§age_seconds: Option<u64>

How old it is, in seconds. Absent when the platform could not say, which is the Unmeasurable verdict and never a zero.

§session_id: String

The episode this publish temp carries, when it carries one.

§published_at: String

The record that already holds that episode, when one does. Its presence is what turns an Incomplete publish temp into an Orphan.

§target: String

The file a rename temp was going to become. Its presence is what turns an Incomplete rename temp into an Orphan.

§removable: bool

Whether this call would remove it. Decided by the verdict and by remove_stray’s own pattern guard, never by the caller.

§removed: bool

Whether this call did remove it. Always false on a check.

Trait Implementations§

Source§

impl Clone for Stray

Source§

fn clone(&self) -> Stray

Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for Stray

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl<'de> Deserialize<'de> for Stray

Source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
Source§

impl Eq for Stray

Source§

impl JsonSchema for Stray

Source§

fn schema_name() -> Cow<'static, str>

The name of the generated JSON Schema. Read more
Source§

fn schema_id() -> Cow<'static, str>

Returns a string that uniquely identifies the schema produced by this type. Read more
Source§

fn json_schema(generator: &mut SchemaGenerator) -> Schema

Generates a JSON Schema for this type. Read more
Source§

fn inline_schema() -> bool

Whether JSON Schemas generated for this type should be included directly in parent schemas, rather than being re-used where possible using the $ref keyword. Read more
Source§

impl Ordered for Stray

Strays are shown in path order, which is the only order that is a property of the store rather than of the walk that found it: read_dir yields what the filesystem feels like yielding, and two runs over one store must answer identically.

Source§

fn order_key(&self) -> OrderKey<'_>

The four parts this item is ordered by. Borrowed from the item: building a key allocates nothing, so sorting a large collection costs the comparisons and no more.
Source§

impl PartialEq for Stray

Source§

fn eq(&self, other: &Stray) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 (const: unstable) · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
Source§

impl Serialize for Stray

Source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where __S: Serializer,

Serialize this value into the given Serde serializer. Read more
Source§

impl StructuralPartialEq for Stray

Auto Trait Implementations§

§

impl Freeze for Stray

§

impl RefUnwindSafe for Stray

§

impl Send for Stray

§

impl Sync for Stray

§

impl Unpin for Stray

§

impl UnsafeUnpin for Stray

§

impl UnwindSafe for Stray

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
where ST: ?Sized, DT: ?Sized,

§

impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> DeserializeOwned for T
where T: for<'de> Deserialize<'de>,

Source§

impl<T> DynClone for T
where T: Clone,

Source§

fn __clone_box(&self, _: Private) -> *mut ()

§

impl<Q, K> Equivalent<K> for Q
where Q: Eq + ?Sized, K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

§

impl<T> Read<Exclusive, BecauseExclusive> for T
where T: ?Sized,

Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a [WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a [WithDispatch] wrapper. Read more