Summary
The milestones board shows a blank flash while loading and a whole-page crash when a subtree throws. Add skeleton placeholders and scoped error boundaries so failures are contained and loading is graceful.
Why this matters
Blank flashes and full-page crashes are jarring and lose user context. Skeletons + boundaries keep the app resilient and calm.
Requirements
- Add skeleton placeholders matching the milestones board layout during load.
- Wrap independent milestones board subtrees in error boundaries with a retry.
- A crash in one subtree doesn't take down the rest of the page.
- Announce loading to assistive tech; no layout shift.
Technical guidance
- Match skeleton dimensions to real content to avoid shift.
- Log the boundary error for observability.
Edge cases — each must have a test
Acceptance criteria
Out of scope
- Global crash reporting UI
- Server components migration
Rewards
Part of the GrantFox OSS / Official Campaign (FWC26) — this task may be rewarded. PR quality is assessed by AI: depth, correctness under edge cases, meaningful tests, and clean design are what earn the reward. Shallow changes (typos, formatting, trivial docs) do not qualify.
Summary
The milestones board shows a blank flash while loading and a whole-page crash when a subtree throws. Add skeleton placeholders and scoped error boundaries so failures are contained and loading is graceful.
Why this matters
Blank flashes and full-page crashes are jarring and lose user context. Skeletons + boundaries keep the app resilient and calm.
Requirements
Technical guidance
Edge cases — each must have a test
Acceptance criteria
npm run lint,npm test, andnpm run buildall pass locallyCloses #<issue>Out of scope
Rewards
Part of the GrantFox OSS / Official Campaign (FWC26) — this task may be rewarded. PR quality is assessed by AI: depth, correctness under edge cases, meaningful tests, and clean design are what earn the reward. Shallow changes (typos, formatting, trivial docs) do not qualify.