Now liveThe Skillselion MCP - thousands of ranked skills, loaded into your agent mid-task. No install.Get it →
actionbook avatar

M13 Domain Error

  • 1.4k installs
  • 1.3k repo stars
  • Updated May 24, 2026
  • actionbook/rust-skills

m13-domain-error is an agent skill for use when designing domain error handling. keywords: domain error, error categorization, recovery strategy, retry, fallback, domain error hierarchy, user-facing vs internal.

About

The m13-domain-error skill is designed for use when designing domain error handling. Keywords: domain error, error categorization, recovery strategy, retry, fallback, domain error hierarchy, user-facing vs internal. Domain Error Strategy > Layer 2: Design Choices Core Question Who needs to handle this error, and how should they recover? Before designing error types: Is this user-facing or internal? Invoke when the user designing domain error handling.

  • Is this user-facing or internal?.
  • Is recovery possible?.
  • What context is needed for debugging?.

M13 Domain Error by the numbers

  • 1,427 all-time installs (skills.sh)
  • +50 installs in the week ending Jul 28, 2026 (Skillselion tracking)
  • Ranked #250 of 1,896 Design & UI/UX skills by installs in the Skillselion catalog
  • Security screen: LOW risk (skills.sh audit)
  • Data as of Jul 28, 2026 (Skillselion catalog sync)
At a glance

m13-domain-error capabilities & compatibility

Capabilities
is this user facing or internal? · is recovery possible? · what context is needed for debugging?
Use cases
frontend
From the docs

What m13-domain-error says it does

Use when designing domain error handling. Keywords: domain error, error categorization, recovery strategy, retry, fallback, domain error hierarchy, user-facing vs internal errors,
SKILL.md
Use when designing domain error handling. Keywords: domain error, error categorization, recovery strategy, retry, fallback, domain error hierarchy, user-facing
SKILL.md
npx skills add https://github.com/actionbook/rust-skills --skill m13-domain-error

Add your badge

Show developers this skill is listed on Skillselion. Paste this into your README.

Listed on Skillselion
Installs1.4k
repo stars1.3k
Security audit3 / 3 scanners passed
Last updatedMay 24, 2026
Repositoryactionbook/rust-skills

How do I use when designing domain error handling. keywords: domain error, error categorization, recovery strategy, retry, fallback, domain error hierarchy, user-facing vs internal?

Use when designing domain error handling. Keywords: domain error, error categorization, recovery strategy, retry, fallback, domain error hierarchy, user-facing vs internal.

Who is it for?

Developers using m13 domain error workflows documented in SKILL.md.

Skip if: Skip when the task falls outside m13-domain-error scope or needs a different stack.

When should I use this skill?

User designing domain error handling.

What you get

Completed m13-domain-error workflow with documented commands, files, and expected deliverables.

  • domain error type hierarchy
  • recovery strategy documentation

Files

SKILL.mdMarkdownGitHub ↗

Domain Error Strategy

Layer 2: Design Choices

Core Question

Who needs to handle this error, and how should they recover?

Before designing error types:

  • Is this user-facing or internal?
  • Is recovery possible?
  • What context is needed for debugging?

---

Error Categorization

Error TypeAudienceRecoveryExample
User-facingEnd usersGuide actionInvalidEmail, NotFound
InternalDevelopersDebug infoDatabaseError, ParseError
SystemOps/SREMonitor/alertConnectionTimeout, RateLimited
TransientAutomationRetryNetworkError, ServiceUnavailable
PermanentHumanInvestigateConfigInvalid, DataCorrupted

---

Thinking Prompt

Before designing error types:

1. Who sees this error?

  • End user → friendly message, actionable
  • Developer → detailed, debuggable
  • Ops → structured, alertable

2. Can we recover?

  • Transient → retry with backoff
  • Degradable → fallback value
  • Permanent → fail fast, alert

3. What context is needed?

  • Call chain → anyhow::Context
  • Request ID → structured logging
  • Input data → error payload

---

Trace Up ↑

To domain constraints (Layer 3):

"How should I handle payment failures?"
    ↑ Ask: What are the business rules for retries?
    ↑ Check: domain-fintech (transaction requirements)
    ↑ Check: SLA (availability requirements)
QuestionTrace ToAsk
Retry policydomain-*What's acceptable latency for retry?
User experiencedomain-*What message should users see?
Compliancedomain-*What must be logged for audit?

---

Trace Down ↓

To implementation (Layer 1):

"Need typed errors"
    ↓ m06-error-handling: thiserror for library
    ↓ m04-zero-cost: Error enum design

"Need error context"
    ↓ m06-error-handling: anyhow::Context
    ↓ Logging: tracing with fields

"Need retry logic"
    ↓ m07-concurrency: async retry patterns
    ↓ Crates: tokio-retry, backoff

---

Quick Reference

Recovery PatternWhenImplementation
RetryTransient failuresexponential backoff
FallbackDegraded modecached/default value
Circuit BreakerCascading failuresfailsafe-rs
TimeoutSlow operationstokio::time::timeout
BulkheadIsolationseparate thread pools

Error Hierarchy

#[derive(thiserror::Error, Debug)]
pub enum AppError {
    // User-facing
    #[error("Invalid input: {0}")]
    Validation(String),

    // Transient (retryable)
    #[error("Service temporarily unavailable")]
    ServiceUnavailable(#[source] reqwest::Error),

    // Internal (log details, show generic)
    #[error("Internal error")]
    Internal(#[source] anyhow::Error),
}

impl AppError {
    pub fn is_retryable(&self) -> bool {
        matches!(self, Self::ServiceUnavailable(_))
    }
}

Retry Pattern

use tokio_retry::{Retry, strategy::ExponentialBackoff};

async fn with_retry<F, T, E>(f: F) -> Result<T, E>
where
    F: Fn() -> impl Future<Output = Result<T, E>>,
    E: std::fmt::Debug,
{
    let strategy = ExponentialBackoff::from_millis(100)
        .max_delay(Duration::from_secs(10))
        .take(5);

    Retry::spawn(strategy, || f()).await
}

---

Common Mistakes

MistakeWhy WrongBetter
Same error for allNo actionabilityCategorize by audience
Retry everythingWasted resourcesOnly transient errors
Infinite retryDoS selfMax attempts + backoff
Expose internal errorsSecurity riskUser-friendly messages
No contextHard to debug.context() everywhere

---

Anti-Patterns

Anti-PatternWhy BadBetter
String errorsNo structurethiserror types
panic! for recoverableBad UXResult with context
Ignore errorsSilent failuresLog or propagate
Box<dyn Error> everywhereLost type infothiserror
Error in happy pathPerformanceEarly validation

---

Related Skills

WhenSee
Error handling basicsm06-error-handling
Retry implementationm07-concurrency
Domain modelingm09-domain
User-facing APIsdomain-*

Related skills

Forks & variants (1)

M13 Domain Error has 1 known copy in the catalog totaling 752 installs. They canonicalize to this original listing.

How it compares

Pick this over generic Rust error crates guidance when you need a full recovery and messaging strategy, not just enum boilerplate.

FAQ

What does m13-domain-error do?

Use when designing domain error handling. Keywords: domain error, error categorization, recovery strategy, retry, fallback, domain error hierarchy, user-facing vs internal.

When should I use m13-domain-error?

User designing domain error handling.

Is m13-domain-error safe to install?

Review the Security Audits panel on this page before installing in production.

This week in AI coding

Five minutes, every Monday - the tools, releases and tactics for developers.

unsubscribe anytime.