Ramonda

RMD059 — An async lifecycle rejected

@state posts: unknown[] = [];

@mounted async load() {
  this.posts = await fetchPosts();   // ✗ if this throws, nothing tells anyone
}

An error boundary does not catch this, and that is deliberate. The rejection arrives at an arbitrary later moment — the page is already on screen and interactive, and there is no render left to fail. Replacing what the reader is using with a fallback at that point is the worse outcome.

What follows is why the report exists. The page renders exactly as though the method had succeeded: posts is still [], the empty state shows, and the only trace is an unhandled rejection in a console nobody is watching.

Handle it where it happens, and put the failure somewhere the render can see:

@state error = "";

@mounted async load() {
  try { this.posts = await fetchPosts(); }
  catch (e) { this.error = String(e); }
}

If the failure really should take the page down, re-throw it from render() — that is a render, and a boundary can see it.

ramonda-check reports the same method before it ships, as unguarded-async-lifecycle.

Next