pub enum EngineError {
Show 22 variants
Storage,
Projection,
Vector,
Embedder,
EmbedderNotConfigured,
KindNotVectorIndexed,
EmbedderDimensionMismatch {
expected: u32,
actual: u32,
},
Scheduler,
OpStore,
WriteValidation,
SchemaValidation,
Overloaded,
Closing,
Extractor,
Consolidator,
InvalidFilter {
reason: String,
},
InvalidArgument {
msg: String,
},
VectorEquivalenceMismatch {
reason: String,
},
IllegalTransition {
from_state: LifecycleState,
to_state: LifecycleState,
legal: Vec<LifecycleState>,
},
NotLifecycleAddressable {
id_space: IdSpaceKind,
},
ErasureIncomplete {
stage: String,
detail: String,
},
ProjectionDestructive {
name: String,
delta: String,
},
}Variants§
Storage
Projection
Vector
Embedder
EmbedderNotConfigured
KindNotVectorIndexed
EmbedderDimensionMismatch
Scheduler
OpStore
WriteValidation
SchemaValidation
Overloaded
Closing
Extractor
G11 (Slice 15) — BYO-LLM extractor subprocess error (protocol mismatch, spawn failure, or harness-returned error code).
Consolidator
0.8.12 Slice 15 (OPP-2, ADR-0.8.12) — BYO-LLM consolidation provider
error (protocol mismatch, spawn/handshake failure, task not advertised in
supported_tasks, or a malformed/out-of-cluster verdict). Rides the SAME
provider_session transport as Extractor; this is the task-specific leaf.
InvalidFilter
G4 (Slice 35) — filter predicate construction error: non-allowlisted
path or invalid filter argument. NOT a panic — returned as a typed error
from Predicate::json_path_eq / Predicate::json_path_compare.
InvalidArgument
Slice 20 (G5/G6) — an argument is out of the accepted range (e.g.
depth > 3 for graph traversal). The msg field carries a
human-readable explanation; it is intentionally non-exhaustive so the
binding layer can forward it as a ValueError / TypeError.
VectorEquivalenceMismatch
0.8.18 Slice 5 (#5 vector-equivalence probe KEYSTONE) — the open-time
self-check re-embedded the 45 committed probes with the live backend and
found a divergence beyond the frozen D4 floor (a Phase-1 mean-centered
embedding_bin sign flip, OR a Phase-2 un-centered L2 distance over
VECTOR_EQUIVALENCE_L2_EPSILON). Engine::open succeeded into a degraded
state (dense_disabled = true); this query-time error is raised at the
single choke point Engine::search_inner_with_stats BEFORE any embedding
/ vector SQL / graph seeding / CE rerank, refusing EVERY vector-dependent
arm (search, search_expand, explain/rerank, graph-arm). The explicit
text-only/FTS-only path (Engine::search_text_only) stays serviceable.
Sibling of the open-time EngineOpenError::EmbedderIdentityMismatch; per
ADR-0.8.18 codex R2 U1-1 the refusal surfaces as an EngineError (queries
never surface EngineOpenError). reason carries a human-readable summary.
IllegalTransition
OPP-12 Phase-1 (0.8.19 Slice 10) — a lifecycle transition/purge move
that the engine-enforced legal-transition table (design §2) forbids.
Raised for an illegal transition target (purged/pending are never
transition targets; self-loops; a from→to pair not in the table) AND for
a purge precondition failure (purge is legal only from deleted).
from_state/to_state use the FULL, parity-safe field names (S7 — from
is a Python reserved word); legal enumerates the target states reachable
from from_state in the full state machine.
NotLifecycleAddressable
OPP-12 Phase-1 (0.8.19 Slice 10) — a lifecycle verb (transition/purge)
was addressed with a non-Logical id space (a Content/h: doc-seeded or
Passage/p: synthetic id). Only the Logical (l:) space is
lifecycle-addressable (design §3); this is a typed refusal, never a panic
or a silent no-op. id_space carries the offending IdSpaceKind.
Fields
id_space: IdSpaceKindErasureIncomplete
0.8.20 Slice 5b (R-20-E5, design 0.8.20-slice0-erasure-design.md §4
item 4) — an erasure verb (purge / excise_source /
excise_collection_record) deleted its rows but could NOT complete the
erasure at rest, so it refuses to report success.
The motivating case is the write-ahead log. PRAGMA secure_delete=ON
zeroes pages freed inside the database file, but the erased content also
sits in the WAL as committed frames from the ORIGINAL insert: an erasure
DELETE appends new frames, it never rewrites old ones. Only a
wal_checkpoint(TRUNCATE) removes them, and a concurrent reader pinning a
WAL snapshot makes that checkpoint return busy. After a bounded retry
the verb raises THIS error rather than returning Ok over erased bytes
that are still grep-able on disk.
Contract: an erasure verb must never report success on an incomplete
erasure. The row deletions are committed and durable when this is
raised; what failed is the at-rest scrub. The remedy is to retry the verb
(or recover --truncate-wal) once the blocking reader has finished.
stage names the uncompleted step (e.g. "wal_checkpoint",
"telemetry_redaction"); detail is a human-readable summary.
ProjectionDestructive
0.8.20 Slice 15d (R-20-PR) — configure_projections refused an
incompatible/DESTRUCTIVE change to an existing projection name that was
NOT accompanied by an explicit drop. Omission from the spec never drops
(C3, api-surface.md:27); a role REMOVAL or a tokenizer/embedder change
on a live projection would silently discard an expensive-to-rebuild
resource, so it is refused with the destructive delta surfaced. The
caller re-issues with drop: [name] to consciously rebuild.
Trait Implementations§
Source§impl Clone for EngineError
impl Clone for EngineError
Source§fn clone(&self) -> EngineError
fn clone(&self) -> EngineError
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 EngineError
impl Debug for EngineError
Source§impl Display for EngineError
impl Display for EngineError
impl Eq for EngineError
Source§impl Error for EngineError
impl Error for EngineError
1.30.0 · Source§fn source(&self) -> Option<&(dyn Error + 'static)>
fn source(&self) -> Option<&(dyn Error + 'static)>
1.0.0 · Source§fn description(&self) -> &str
fn description(&self) -> &str
use the Display impl or to_string()