-
Notifications
You must be signed in to change notification settings - Fork 1
Platform Guide
Per-platform tips, gotchas, and best practices for every agent.
Accepts: Logcat output, Firebase Crashlytics export, ANR trace (traces.txt), LeakCanary report.
Always fill USER_ACTION. "User tapped Back while the photo was uploading" is worth 10 lines of code for lifecycle crash diagnosis.
Supported crash types:
-
NullPointerException,IllegalStateException,IndexOutOfBoundsException - Fragment lifecycle crashes (
requireContext()after detach, view afteronDestroyView) - ViewModel observer bugs (duplicate observers, observer after view destroyed)
- Coroutine crashes (unhandled exceptions, wrong dispatcher,
GlobalScopescope leaks) - RecyclerView position errors, DiffUtil conflicts
-
OutOfMemoryError, LeakCanary reference chains - ANR — paste the complete
traces.txt, not a single-thread excerpt
Output: 9 sections — Crash Summary, Root Cause, Why This Happens, Risk Level, Recommended Fix, Updated Code, Edge Cases, Testing Checklist, Prevention Tips.
Paste the full class, not a snippet — imports and field declarations change the analysis significantly.
Set FILE_PATH accurately. A file in .../viewmodel/ is reviewed as a ViewModel. A file in .../data/repository/ is reviewed as a Repository. Layer-boundary violations are inferred from the path.
Set COMPOSE_VERSION: none for View/XML-based UI to suppress Compose-specific checks.
Reviews: Clean Architecture layer boundaries, GlobalScope usage, LiveData vs StateFlow, !! force-unwrap, Compose recomposition, coroutine exception handling, testability score.
Be specific. "A list of orders" → generic output. "A LazyColumn of order cards showing order ID, status badge (color-coded), total amount, and date — with pull-to-refresh, empty state, and error state" → production-quality output.
List every action. Pull-to-refresh, swipe-to-delete, FAB — if you don't list it, it won't appear.
Name your existing repositories. If you write DEPENDENCIES: OrderRepository, the agent injects it instead of generating a stub.
Output: Three Kotlin files — UiState.kt, ViewModel.kt, Screen.kt — plus NavHost snippet and Gradle dependencies.
Use this instead of the Code Reviewer when: The screen is slow to scroll, there's visual flickering, the Compose compiler metrics show unstable types, or you're seeing unexplained recompositions.
Reviews: SimpleDateFormat in items { }, missing key on LazyColumn, remember key correctness, derivedStateOf selection, state hoisting, LaunchedEffect key, slot API design.
The crash report must be symbolicated. Unsymbolicated reports show hex addresses like 0x000000010042a100 that cannot be analyzed. Symbolicate first:
- Xcode Organizer: open the crash, click "Symbolicate"
-
Terminal:
symbolicatecrash crash.crash MyApp.app.dSYM > symbolicated.crash
Supported crashes: EXC_BAD_ACCESS (SIGSEGV/SIGBUS), force-unwrap nil (unexpectedly found nil), SIGABRT (assertion, fatalError()), watchdog termination (0x8badf00d), Main Thread Checker violations, SwiftUI state crashes, Objective-C doesNotRecognizeSelector.
Output: Same 9-section format as the Android Crash Analyzer.
Set SWIFT_VERSION: 6.0 to enable strict concurrency checking — Sendable violations, actor isolation errors become compile-time checks.
Set SWIFTUI: true to activate SwiftUI-specific checks (@StateObject vs @ObservedObject, expensive body computations, .task vs .onAppear).
Reviews: [weak self] vs [unowned self] in escaping closures, @Published mutation off Main thread, force-unwrap (!) removal, async/await migration candidates, protocol-based testability, retain cycles.
Choose PATTERN: cubit for 90% of features. Use PATTERN: bloc only when you need event history, event transformations (throttle/debounce), or event replay for undo/redo.
Specify RESPONSE_FIELDS precisely. The more exact the JSON field names and types, the more accurate the generated fromJson mappings.
What gets generated: Domain entities, repository interface + implementation, Dio data source with DioException handling, Either<Failure, T> error propagation, Cubit/BLoC with sealed state classes, page with BlocBuilder, bloc_test stubs, get_it DI registration, pubspec.yaml additions.
Be specific in DESCRIPTION. Vague: "A product card". Better: "A card with a cached network image at the top (16:9 ratio), product name in titleMedium, price in primary color, and a star rating row (1–5 stars). Tapping the card opens the product detail. No external packages."
Guarantees: Null-safe Dart 3.x, const constructors where possible, Theme.of(context) for all colors/styles, Semantics for accessibility, AnimationController disposed in dispose().
Set ARCH: new for React Native 0.74+ with New Architecture (JSI/Fabric) enabled. Set ARCH: old for Bridge-based apps.
Include PROFILER_DATA (paste from React DevTools Profiler or Flipper) to rank findings by actual measured render time instead of heuristic estimates.
Finds: Inline functions/objects in JSX, missing useCallback/useMemo/React.memo, FlatList missing keyExtractor/getItemLayout, animations on JS thread (useNativeDriver: false), bridge calls in render paths.
Always specify RENDER_PIPELINE. URP, HDRP, and Built-in use completely different include paths and HLSL APIs. A URP shader will not compile in a Built-in project and vice versa.
Set TARGET_PLATFORM: mobile to enforce mobile GPU budget:
- ≤2 texture samples per fragment
-
halfprecision throughout (16-bit vs 32-bit) - No dynamic branching (
ifon interpolated values)
Output: A complete Shader "Custom/..." file — Properties block, SubShader, vertex + fragment stages, and a Material Setup guide for the Inspector.
Describe the Blueprint in plain English steps. The agent cannot read node graph images or screenshots. List what each event does, step by step.
Tick is the #1 issue. Any logic in Event Tick that runs every frame for many actors is expensive. The agent flags this and provides timer-based and event-driven alternatives with concrete timing values.
C++ output: The agent generates a complete .h + .cpp pair using UE5 API conventions (TObjectPtr, UPROPERTY, UFUNCTION, FTimerHandle, AddDynamic).
Use SECURITY_FOCUS: all for a complete OWASP scan. Use a specific focus to narrow: secrets, storage, network, deeplinks, webview, permissions, or crypto.
Run on: API client files, auth/session managers, any file that touches SharedPreferences, UserDefaults, WebView, deep link handlers, or cryptographic operations.
Rotate any secret found immediately. If it was in version control history at any point, assume it is already compromised. Run gitleaks detect --source . --report-format json to scan the full git history.
Specify the exact platform variant: Android-Compose, Android-XML, iOS-SwiftUI, iOS-UIKit, Flutter, or React-Native. The corrected code differs significantly between frameworks — a Compose fix looks nothing like a SwiftUI fix.
Always test on a physical device with real assistive technology after applying fixes:
- Android: TalkBack (Settings → Accessibility → TalkBack)
- iOS: VoiceOver (Settings → Accessibility → VoiceOver)
- Emulator/simulator behavior differs from real device behavior
List special requirements. Slack notifications, specific JDK versions, screenshot tests, upload to multiple Firebase groups — if you don't list it in REQUIREMENTS, it won't appear in the output.
Output includes a Secrets Reference table — every ${{ secrets.X }} in the generated YAML is listed with where to get it and where to set it.
For production releases, the pipeline creates a GitHub Release automatically when you push a version tag: git tag v1.2.0 && git push origin v1.2.0
Getting Started
Reference
Community
Repository github.com/salmanashraf/mobile-dev-skills
Version: v1.0.0 · MIT License