Learning path

Error Handling — Status

What you can do, what is unlocked, and what is still gated. Updated after each calibration. See MISSION.md and RESOURCES.md.

Knowledge graph

graph TD
  A["What counts as an error
a state, and a value reifying it"] A --> B["Bug vs. recoverable error
Duffy's first cut"] B --> B1["Abandonment / fail-fast"] B --> B2["Contracts & blame
pre / post / invariant"] A --> C["Axes of an error model
representation · propagation · handling"] C --> D["Errors as values
sentinel · type · opaque"] C --> E["Exception safety
basic · strong · nothrow"] D --> F["Wrapping, context, cause chains"] C --> G["Error aggregation
collect, ExceptionGroup"] E --> H["Checked vs. unchecked
the versioning debate"] B1 --> I["Supervision & let-it-crash
error kernel, crash-only"] G --> J["Global error collectors
excepthook, panic hook, Sentry"] I --> K["Containment across processes
circuit breaker · bulkhead · timeout"] K --> L["Retry amplification
budgets, backoff, jitter"] classDef mastered fill:#dcfce7,stroke:#16a34a,color:#14532d; classDef partial fill:#fef9c3,stroke:#ca8a04,color:#713f12; classDef inner fill:#dbeafe,stroke:#2563eb,color:#1e3a8a,stroke-width:3px; classDef outer fill:#f5f3ff,stroke:#7c3aed,color:#4c1d95,stroke-dasharray:5 3; classDef locked fill:#fafaf9,stroke:#d6d3d1,color:#a8a29e; class B,B1,B2 mastered; class L partial; class A,C,D,E,F inner; class G,H,I,J,K locked; click B "lessons/01-bugs-are-not-errors.html" "Lesson 1" click B1 "lessons/01-bugs-are-not-errors.html" "Lesson 1" click B2 "lessons/01-bugs-are-not-errors.html" "Lesson 1" click A "lessons/02-three-axes.html" "Lesson 2" click C "lessons/02-three-axes.html" "Lesson 2" click D "lessons/03-sentinel-type-opaque.html" "Lesson 3" click F "lessons/03-sentinel-type-opaque.html" "Lesson 3" click E "lessons/04-exception-safety.html" "Lesson 4"
mastered inner fringe — lesson written, not yet studied outer fringe — unlocked, ready partial gated

Calibration — 2026-08-30

HELD — bug vs. recoverable error

Distinguished a malformed config file from a null pointer passed to the same function, unprompted, on the right axis: "the first is an error from the user that they should be informed how to recover from, the second is a bug in the program." This is Duffy's central thesis, arrived at independently. Missing only the vocabulary and the machinery that hangs off it.

PARTIAL — retry amplification

Named the failure mode correctly. Unclear whether the surrounding vocabulary (retry budget, backoff + jitter, load shedding, circuit breaker) is present. Gated behind the single-process material for now.

PARTIAL — what a type system knows about errors

Answered "the type of error" for what a compiler knows about ? but not raise. Correct but narrow — the sharper answers are presence in the signature and exhaustiveness.

GAP — sentinel vs. opaque errors

No recall. Cheney's trichotomy (sentinel / error type / opaque) is the standard vocabulary here. Lesson 03 written.

GAP — exception safety guarantees

No recall of basic / strong / nothrow. This is the only widely agreed formal vocabulary for "what state is my object in after a throw?" Lesson 04 written.

Session 2 — 2026-08-30

No new calibration. Lessons written for the whole inner fringe: 02 covers what counts as an error and the three axes; 03 covers errors as values and, in passing, closes out wrapping / cause chains — which was previously gated; 04 covers exception safety. Both open GAPs from session 1 (sentinel vs. opaque, exception safety guarantees) now have material. Re-calibrate after these are studied, before opening the distributed half of the map.

Lessons

  1. 01 Bugs Are Not Errors studied
  2. 02 Three Questions Every Error Model Answers ready
  3. 03 Sentinel, Type, Opaque ready
  4. 04 Exception Safety: Basic, Strong, Nothrow ready
  5. 05Checked vs. Unchecked — the versioning debate unlocks after 02 + 04
  6. 06Error Aggregation — ExceptionGroup, errgroup, collect unlocks after 02
  7. 07Supervision & Let-It-Crash unlocks after 04

Teaching preferences