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"
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
Lessons
- 01 Bugs Are Not Errors studied
- 02 Three Questions Every Error Model Answers ready
- 03 Sentinel, Type, Opaque ready
- 04 Exception Safety: Basic, Strong, Nothrow ready
- 05Checked vs. Unchecked — the versioning debate unlocks after 02 + 04
- 06Error Aggregation — ExceptionGroup, errgroup, collect unlocks after 02
- 07Supervision & Let-It-Crash unlocks after 04
Teaching preferences
- Map, not intuition. Wants the taxonomy and the terms. Prescriptions only where attributable to real literature; where the field is contested, name the camps rather than adjudicate.
- Languages: Python, Rust, Go. Not TypeScript.
- Cite the source inline. Every named term should carry its origin, so it can be quoted in a design argument later.
- Flag synthesis. Where no good source exists (e.g. global error collectors as a category), say so explicitly rather than presenting synthesis as canon.