pub struct LastErrorFrame {
pub message: String,
pub source: &'static str,
pub written_ms: u64,
}Expand description
The most recent persisted error_during_execution frame at the tail of
a block’s own output file — populated ONLY when the very last
non-blank line IS one (a block that errored once and then kept
producing normal output afterward must NOT be flagged; only “the last
thing that happened to this block was an unrecovered error” counts).
This reads a signal that already exists and is already durable: per
agent_handlers/input.rs’s own comment, this exact frame shape is
deliberately persisted to the block file (not just live-broadcast) so
it survives pane reload — the same source the frontend itself renders
as the pane’s error bubble. Composing a second reader over that
existing store, rather than adding a new independent tracker, follows
this module’s own design constraint (spec §5.1/§3 pt. 8).
See docs/reports/REPORT_MUXSPECT_SPAWN_REFUSAL_DIAGNOSIS_EXTENSION_2026_08_03.md
for the incident this closes the diagnostic gap on: a block whose spawn
was refused before any controller/process ever existed showed up as
featureless “no controller, no processes” — indistinguishable from a
healthy idle block — even though the actual, actionable reason was
already sitting in this exact file.
Fields§
§message: StringThe frame’s error.message verbatim (includes the [AgentMux]
prefix every construction site already writes).
source: &'static strBest-effort tag for which pre-spawn failure path wrote the frame —
see classify_last_error_source. NOT a stable/tested taxonomy
like agents::failure::FailureClass (which only classifies
POST-spawn exit failures); building that properly for pre-spawn
refusals is real, separate follow-up work (report §3.3), not
attempted here.
written_ms: u64Epoch ms the output file was last written — i.e. when this frame
(being the file’s last line) was appended. Deliberately a raw
timestamp, not a precomputed “age,” matching last_computed_ms’s
existing convention elsewhere in this response so --json
consumers get a stable value and the CLI renderer computes age the
same way it already does for every other timestamp.
Trait Implementations§
Auto Trait Implementations§
impl Freeze for LastErrorFrame
impl RefUnwindSafe for LastErrorFrame
impl Send for LastErrorFrame
impl Sync for LastErrorFrame
impl Unpin for LastErrorFrame
impl UnsafeUnpin for LastErrorFrame
impl UnwindSafe for LastErrorFrame
Blanket Implementations§
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<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>. Box<dyn Any> can
then be further downcast into Box<ConcreteType> where ConcreteType implements Trait.§fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
Rc<Trait> (where Trait: Downcast) to Rc<Any>. Rc<Any> can then be
further downcast into Rc<ConcreteType> where ConcreteType implements Trait.§fn as_any(&self) -> &(dyn Any + 'static)
fn as_any(&self) -> &(dyn Any + 'static)
&Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &Any’s vtable from &Trait’s.§fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
&mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &mut Any’s vtable from &mut Trait’s.§impl<T> DowncastSync for T
impl<T> DowncastSync for T
impl<A, B, T> HttpServerConnExec<A, B> for Twhere
B: Body,
§impl<T> Instrument for T
impl<T> Instrument for T
§fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
fn instrument(self, span: Span) -> 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 more