A broad QA tool for UI/UX consistency, codebase testing, and security auditing.
Install
mkdir -p .claude/skills/tester-saadhjawwadh && curl -L -o skill.zip "https://agentskills.codes/api/skills/download/18943" && unzip -o skill.zip -d .claude/skills/tester-saadhjawwadh && rm skill.zipInstalls to .claude/skills/tester-saadhjawwadh
Activation
This is the description your AI agent reads to decide when to run this skill — the better it matches your request, the more reliably it fires.
A comprehensive testing skill that covers UI/UX consistency, codebase QA, security auditing, and verification of settings and backups.Key capabilities
- →Verify Material Design 3 compliance
- →Check haptics and micro-animations
- →Ensure overflow protection for text
- →Execute full local test suites
- →Audit data integrity and backups
- →Perform security audits
How it works
The skill executes QA verifications, unit/widget tests, security audits, and layout validations. It includes specific checks for UI/UX, codebase quality, data integrity, and security, along with release-mode verification learnings.
Inputs & outputs
When to use Tester
- →Validating Material Design compliance
- →Running full test suites
- →Performing security audits
About this skill
Tester Skill
Use this skill to execute QA verifications, unit/widget tests, security audits, and layout validations.
1. UI/UX & Material 3 Expressive Verification
- Design System Reference: Verify layouts adhere to design.md (5-tier surface tokens
surfaceContainerLow$\rightarrow$surfaceContainerHighest, $48 \times 48\text{ dp}$ tap targets, spring physics). - Button Hierarchy Integrity: Verify primary actions use
FilledButton/IconButton.filled, secondary actions useFilledButton.tonal/OutlinedButton, dual actions use Split Buttons, and FAB groups expand via the FAB Menu pattern. - M3 Motion & Spring Physics: Check that micro-animations and container morphs use spring-based physics (
Curves.elasticOut,Curves.fastOutSlowIn) and maintain smooth 120 FPS render performance. - Typography & Emphasized Text: Confirm that headings and editorial titles leverage M3 Emphasized text style slots (
Google Sans Textweight 600) and numeric ledgers utilize tabularInterfont formatting. - Overflow Protection: Verify all dynamically generated text is wrapped appropriately (
Flexible/Expanded) to preventRenderFlex overflowissues. - Visual Validation: Capture screenshots of the mobile emulator (
emulator-5554) to verify layouts:adb exec-out screencap -p > "screenshots/<filename>.png" - Interactive Carousel Presentation: When presenting end-of-test verification to the user, collate captured screenshots into an interactive Markdown carousel artifact (
verification_carousel.md) using ````carousel and<!-- slide -->syntax so the user can easily scrub through UI progressions, state changes, and edge-case verifications.
2. Codebase QA & Mocking
- Test Suite execution: Always run the full local test suite:
flutter test - Path Provider Mocking: Unit or widget tests utilizing filesystem paths must mock the path provider channel inside
setUp:TestDefaultBinaryMessengerBinding.instance.defaultBinaryMessenger .setMockMethodCallHandler( const MethodChannel('plugins.flutter.io/path_provider'), (MethodCall methodCall) async => '.', ); - Context safety: Ensure all asynchronous callback gates check
context.mountedor statemountedbefore executing context operations. - Async Provider Constructor Races:
SettingsProviderloadsSharedPreferencesasynchronously in its constructor (loadSettings()). In unit tests where a new instance is instantiated (newSettings = SettingsProvider()), insertawait Future.delayed(const Duration(milliseconds: 100))before invoking methods likerestoreFromBackupMapto preventloadSettings()from finishing later and overwriting mock test state. - Widget Test Localization Delegates: Any widget test rendering screens that reference
AppLocalizations.of(context)(e.g.SettingsScreen) must includelocalizationsDelegates: AppLocalizations.localizationsDelegatesandsupportedLocales: AppLocalizations.supportedLocalesinsideMaterialAppin the test widget tree to preventnulllocalization exceptions. - SMS Sandbox & PII Sanitization Tests: Verify regex sanitization does not strip long non-numeric English words by including $>10$ character words (
Supermarket,Restaurant) in test fixtures. Verify sandbox simulations use recognized sender tokens (BANK_SMS,BANK,CARD) to match parser whitelist rules. - SMS Permission Manifest Parity Tests: Verify
SmsService.hasPermission()checks strictly declared permissions (Permission.sms) and gracefully returns fallback booleans when executed outside Android UI isolates. - Tombstone Ingestion Guardrail Tests: Verify
TransactionRepository.createSmsTransactionrejects inserting transactions whosesmsIdis present indeleted_transaction_sms_idswhenbypassTombstones: false, and deletes the tombstone record allowing insertion whenbypassTombstones: true. - Sync Cancellation Tests: Verify
SmsService.cancelSync()sets_cancelRequestedand halts batch ingestion cleanly without unhandled exceptions or incomplete database writes. - Hardware AI Gating Tests: Test widget trees under both
settings.isDeviceAiSupported = trueandsettings.isDeviceAiSupported = falseto confirm AI buttons and menu items hide cleanly on non-NPU devices and emulators. - Scrollable Widget Test Hit Safety: In tests involving
SingleChildScrollView,ListView, orCustomScrollView(such asOnboardingScreenorSettingsScreen), always callawait tester.ensureVisible(finder)prior totester.tap(finder)to prevent offscreen hitTest misses.
3. Data Integrity & Backups Audit
- Backup Completeness: Ensure
BackupService.generateBackupJsonusesSettingsProvider.toBackupMap()to export settings. Never hardcode individual SharedPreferences keys, which go stale as new options are added. - Restore Operations: Ensure
SettingsProvider.restoreFromBackupMapcalls setter methods (e.g.,await setShowFinancialManager(value)) instead of assigning directly to private fields. Direct assignments skip saving to SharedPreferences, causing settings to revert on app restart. - Multi-Version Database Upgrades: Verify
onUpgradedatabase migrations preserve existing user data from ALL historical versions (e.g., v1 -> v19 intest/upgrade_backward_compatibility_test.dart). Ensure all migration SQL statements use standard single quotes ('') for string literals and default values (DEFAULT '',NULLIF(col, '')) to avoid SQLite identifier syntax errors.
4. Security Auditing
- SQLCipher: Confirm that database connections are always opened securely with the key from KeyStore.
- App Lock Screen: Verify that background state detection locks the app after the idle timeout.
- Picker & Native Dialog Lock Bypasses: Verify that screens using platform file/image pickers, share sheets (
SharePlus.instance.share), or gallery permission dialogs (Gal.requestAccess) implementAppLockScreen.ignoreNextResumeLock()so that returning from native OS dialogs or sheet interfaces does not trigger the app lock screen and unmount the active widget state. - Secure Key Storage: Never store database encryption keys or backups in unencrypted
SharedPreferences. Migrate legacy backups toFlutterSecureStorageon launch and remove them from plaintext storage immediately to prevent leakage. - Android Notifications Resource Resolution: The
FlutterLocalNotificationsPluginlooks for initialization icons in the app'sdrawablefolder (e.g.R.drawable.launcher_icon). If the resource is only defined inmipmapdirectories, it will fail on startup with aPlatformException(invalid_icon). Place a copy of the target icon inside thedrawablefolder to ensure successful native initialization. - Tablet & Large Screen Manifest Compatibility: Ensure
android.hardware.telephony,camera, andmicrophonefeatures inAndroidManifest.xmlhaveandroid:required="false"and<supports-screens>is configured. Otherwise, Wi-Fi tablets (e.g. Samsung Galaxy Tab S10+) will be automatically excluded from Play Store distribution.
5. Release-Mode & On-Device Verification (v2.0 learnings)
- Debug hides release-only startup races. A WorkManager task opening the SQLCipher DB in a background isolate during cold start deadlocked the app on the splash — release builds only. ALWAYS install the release APK on the emulator and cold-start it before shipping. Give background tasks an
initialDelay, and wrapmain()'s initFuture.waitin a.timeout()so the first frame can never hang. - Diagnosing a stuck launch:
adb logcat -s flutter(engine + Dart prints),adb shell dumpsys window | grep mCurrentFocus,adb shell pidof <package>. Two "Impeller" engine lines = a background FlutterEngine (WorkManager) is also running. - Background isolate channels: MethodChannels registered in
MainActivity.configureFlutterEnginedo NOT exist in WorkManager isolates —MissingPluginExceptionfrom there is expected; code must catch it and prefs-only paths must still complete. - Drive the UI, don't assume: a FAB
tooltipswallowed the long-press that opened the template sheet — only caught by actually long-pressing on the emulator. Screenshot each new surface and LOOK at it. - Test-data parity:
createTestDatabasepins the CURRENT schema version (v19) — bump it together with_initDB'sversion:and add theonUpgradebranch, or tests diverge from production schema. - Flutter↔Kotlin prefs types: Dart
prefs.setIntstores a Long — Kotlin must readgetLong(...), notgetInt(...), or widget code silently falls back to defaults. - SegmentedButton UI Tap Coordinates in Mobile Emulator: When driving UI taps on
SegmentedButtoncontrols viaadb shell input tap <x> <y>, ensure vertical Y coordinates target the actual segment pill row (e.g.y=970on $1080 \times 2400$ display below the top hero card), avoiding upper header/scope pill areas (e.g.y=395). Inspect dumped UI bounds (uiautomator dump) or captured screenshots to verify segment state toggling. - Release-Mode Cold Launch Verification: Always verify that
WhatsNewSheetfires with the bumped version number, that_buildFinancesFABdynamically updates to "New Split Bill" upon switching tabs, and that no R8/ProGuard class-stripping occurs. - Emulator Session Persistence: Keep the emulator (
emulator-5554) running in the background during active testing and iterations. Do not close or restart the emulator between test steps. Only shut down the emulator after the release is published or upon explicit user request.
6. R8 Optimization & ProGuard Verification
- R8 Full Mode Enforced: Verify
android.enableR8.fullMode=trueis set inandroid/gradle.properties. Avoid broad wildcar
Content truncated.
How it compares
This skill provides a complete and structured testing approach, covering UI/UX, codebase, data, and security, which is more thorough than isolated manual checks.
Compared to similar skills
Tester side by side with the closest alternatives in the catalog.
| Skill | Installs | Updated | Safety | Difficulty |
|---|---|---|---|---|
| Tester (this skill) | 0 | 3mo | Review | Intermediate |
| mobile-games | 11 | 9mo | No flags | Intermediate |
| flutter | 13 | 6mo | No flags | Intermediate |
| get-it-expert | 1 | 8mo | No flags | Intermediate |
Try saying
Example prompts that trigger this skill in your AI assistant.
You might also like
mobile-games
davila7
Mobile game development principles. Touch input, battery, performance, app stores.
flutter
alinaqi
Flutter development with Riverpod state management, Freezed, go_router, and mocktail testing
get-it-expert
flutter-it
Expert guidance on get_it service locator and dependency injection for Flutter/Dart. Covers registration (singleton, factory, lazy, async), scopes with shadowing, async initialization with init() pattern, retrieval, testing with scope-based mocking, and production patterns. Use when working with get_it, dependency injection, service registration, scopes, or async initialization.
mobile-components
dadbodgeoff
Mobile-first UI components including bottom navigation, bottom sheets, pull-to-refresh, and swipe actions. Touch-optimized with proper gesture handling.
genui
gskinnerTeam
Core GenUI framework for dynamic AI-driven UIs. Use when: working with Conversation, SurfaceController, Transport, Surface, SurfaceHost, Catalog, CatalogItem, CatalogItemContext, DataModel, DataContext, DataPath, A2uiSchemas, ClientFunction, PromptBuilder, A2UiClientCapabilities, data binding, A2UI
flutter-bloc-state-management
HoangNguyen0403
Implement BLoC/Cubit state management correctly in Flutter. Use when writing, modifying, reviewing, or testing any BLoC, Cubit, state, or event file.