What problem does it solve? Hand-painted Flutter surfaces built with CustomPainter and Canvas often suffer from silent defects: painters that repaint every frame, hit-testers that disagree with the painter by a few pixels, allocations inside paint() causing jank, and canvases that are completely opaque to screen readers. This Skill provides a strict architectural contract so custom-drawn surfaces stay performant, testable, and accessible. ## Core Features & Use Cases - View/Painter/Scene architecture: Splits every canvas surface into a View, a dumb CustomPainter, and an immutable Scene value type so shouldRepaint becomes a single cheap value compare. - Shared transform and O(1) hit-testing: One affine transform read by both painter and hit-tester, with integer lattice math or a rasterized region-ID buffer instead of Path.contains in the touch path. - Gesture and semantics discipline: Gesture handlers act as pure translators emitting typed commands to a Riverpod Notifier, while ExcludeSemantics plus sibling Semantics nodes make the canvas speak display values to screen readers. - Use Case: When building a custom chart, grid, or interactive canvas in Flutter, apply this Skill to structure the painter, wire tap/drag hit-testing through a shared transform, drive animation via an AnimationController as the repaint Listenable, and pass the included hygiene scripts before a PR. ## Quick Start Review my CustomPainter implementation and fix any violations of the View/Painter/Scene split, shared transform, and zero-allocation paint rules.