Error Taxonomy
Every failure in Palimpsest is classified into exactly one category. No silent retries. No swallowed errors. Failures are stored artifacts — they are part of the crawl record, not noise to discard.
PalimpsestError
The top-level error enum. Every error in the system ultimately maps to one of these seven variants.
Network
#![allow(unused)]
fn main() {
PalimpsestError::Network(String)
}
Connection failures, DNS resolution errors, TCP timeouts, TLS handshake failures. The fetch could not reach the server.
Examples: DNS NXDOMAIN, connection refused, connect timeout, TLS certificate expired.
Protocol
#![allow(unused)]
fn main() {
PalimpsestError::Protocol(String)
}
HTTP protocol violations. The server responded, but the response is malformed or violates HTTP semantics.
Examples: Invalid status line, malformed headers, truncated chunked encoding, invalid Content-Length.
Rendering
#![allow(unused)]
fn main() {
PalimpsestError::Rendering(String)
}
Browser/DOM errors. Chrome launched but could not render the page correctly.
Examples: JavaScript execution error, page load timeout, CDP connection lost, DOM snapshot failure.
Policy
#![allow(unused)]
fn main() {
PalimpsestError::Policy(String)
}
The system refused to process a URL based on configured policy.
Examples: robots.txt disallow, scope violation (URL outside configured domain), rate limit enforcement, max depth exceeded.
DeterminismViolation
#![allow(unused)]
fn main() {
PalimpsestError::DeterminismViolation {
context: String,
expected: String,
actual: String,
}
}
The nuclear option. This means a Law was broken. Two runs with the same seed produced different results. This should never happen in production — if it does, it’s a bug in the kernel.
Examples: Frontier produced different ordering for same seed, content hash mismatch for identical input, replay diverged from original.
Storage
#![allow(unused)]
fn main() {
PalimpsestError::Storage(String)
}
Blob store failures: write errors, read errors, integrity check failures, backend unavailability.
Examples: Disk full, permission denied, blob corrupted (hash mismatch on read), S3 connection error.
Replay
#![allow(unused)]
fn main() {
PalimpsestError::Replay(String)
}
Missing artifacts, incomplete capture groups, reconstruction failures. The stored data is insufficient to replay.
Examples: Missing blob for content hash, no envelope record in WARC, incomplete resource graph.
Other Error Types
| Error | Crate | Variants |
|---|---|---|
StorageError | palimpsest-storage | Backend, NotFound, IntegrityError |
EnvelopeError | palimpsest-envelope | MissingSeed, MissingTimestamp, MissingTargetUrl, MissingDnsSnapshot |
CaptureGroupError | palimpsest-artifact | MissingUrl, MissingTimestamp, MissingCrawlContext, MissingEnvelope, MissingRequest, MissingResponse |
FrontierPersistError | palimpsest-frontier | Wraps serialization/IO errors |
IndexError | palimpsest-index | Wraps SQLite errors |
WarcWriteError | palimpsest-artifact | Wraps IO/format errors |
VectorStoreError | palimpsest-embed | Wraps SQLite errors |