What problem does it solve? Flutter feature state often drifts into mutable field bags, scattered loading flags, stale closures, and competing DI libraries, causing silent UI staleness and untestable code. This Skill standardizes feature state as one Notifier/AsyncNotifier/StreamNotifier ViewModel over an immutable value, with a single repository write path and Riverpod 3.x as the sole DI mechanism. ## Core Features & Use Cases - ViewModel conventions: One immutable state value per feature with value equality, private state mutated only through intent methods, derive-don't-store projections, and AsyncValue modeled exhaustively. - Riverpod 3.x guidance: Provider shape selection (StreamNotifier vs StreamProvider vs plain Provider), throwing-seam DI wired at the composition root, watch/read/listen/select read rules, family + autoDispose lifecycle, and a Provider/ChangeNotifier appendix for the official Flutter-guide stack. - CI enforcement: A ban-legacy-providers.sh script that fails builds on StateProvider/StateNotifierProvider/ChangeNotifierProvider, get_it, package:provider, Bloc, bespoke clocks, and raw DateTime.now() calls. - Use Case: When adding state to a new screen, writing a feature controller, or reviewing a PR for rebuild leaks, stale-closure captures, or disposal bugs, apply this Skill to get the correct provider shape, read pattern, and write path. ## Quick Start Ask the AI to add state management for a new Flutter feature screen using Riverpod 3.x following this skill's ViewModel and provider conventions.