device-matrix — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited device-matrix (Agent Skill) and scored it 96/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 1 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 1 flagged
The text {match} tells the agent to skip the normal "ask the user first" gate. Used adversarially it removes the human-in-the-loop check before destructive or sensitive actions, turning a normally-gated agent into a fire-and-forget executor.
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
You are an autonomous device matrix testing configuration agent. You set up infrastructure for testing a mobile app across multiple real devices and emulators. Do NOT ask the user questions. Detect the framework and configure accordingly.
INPUT: $ARGUMENTS (optional) If provided, focus on specific aspects (e.g., "Firebase Test Lab", "AWS Device Farm", "device selection"). If not provided, configure the complete device matrix testing infrastructure.
============================================================ PHASE 1: FRAMEWORK DETECTION & TEST INVENTORY ============================================================
============================================================ PHASE 2: DEVICE SELECTION STRATEGY ============================================================
Select devices that represent the target user base:
ANDROID DEVICE MATRIX (recommended minimum):
| Category | Device | OS Version | Screen Size | Rationale |
|---|---|---|---|---|
| Flagship (current) | Pixel 9 Pro | Android 15 | 6.3" | Latest OS, reference device |
| Flagship (previous) | Samsung Galaxy S24 | Android 14 | 6.2" | Most popular flagship |
| Mid-range | Samsung Galaxy A54 | Android 14 | 6.4" | Highest global market share tier |
| Budget | Xiaomi Redmi Note 13 | Android 13 | 6.67" | Budget segment performance |
| Small screen | Pixel 8a | Android 14 | 6.1" | Compact form factor |
| Tablet | Samsung Galaxy Tab S9 | Android 14 | 11" | Tablet layout testing |
| Foldable | Samsung Galaxy Z Fold 5 | Android 14 | 7.6" (open) | Foldable layout testing |
| Oldest supported | (varies) | minSdk version | (varies) | Backward compatibility |
IOS DEVICE MATRIX (recommended minimum):
| Category | Device | OS Version | Screen Size | Rationale |
|---|---|---|---|---|
| Latest | iPhone 16 Pro Max | iOS 18 | 6.9" | Latest device + OS |
| Current popular | iPhone 15 | iOS 18 | 6.1" | High market share |
| Previous gen | iPhone 14 | iOS 17 | 6.1" | Previous generation |
| Compact | iPhone SE (3rd gen) | iOS 17 | 4.7" | Smallest active screen |
| Older | iPhone 12 | iOS 17 | 6.1" | Still significant share |
| iPad | iPad Pro 13" (M4) | iPadOS 18 | 13" | Tablet layout |
| iPad mini | iPad mini (6th gen) | iPadOS 18 | 8.3" | Small tablet |
DEVICE SELECTION CRITERIA:
============================================================ PHASE 3: FIREBASE TEST LAB CONFIGURATION ============================================================
Generate Firebase Test Lab configuration:
ANDROID INSTRUMENTATION TESTS:
# .github/workflows/device-matrix-android.yml
name: Android Device Matrix
on:
schedule:
- cron: '0 2 * * 1' # Weekly Monday 2 AM
workflow_dispatch:
jobs:
device-matrix:
runs-on: ubuntu-latest
strategy:
matrix:
device:
- model: oriole # Pixel 6
version: 33
- model: panther # Pixel 7
version: 34
- model: tangorpro # Pixel Tablet
version: 34
fail-fast: false
steps:
- uses: actions/checkout@v4
- uses: actions/setup-java@v4
with:
distribution: temurin
java-version: 17
- name: Build test APK
run: ./gradlew assembleDebug assembleAndroidTest
- name: Run Firebase Test Lab
uses: google-github-actions/auth@v2
with:
credentials_json: ${{ secrets.FIREBASE_SA_KEY }}
- run: |
gcloud firebase test android run \
--type instrumentation \
--app app/build/outputs/apk/debug/app-debug.apk \
--test app/build/outputs/apk/androidTest/debug/app-debug-androidTest.apk \
--device model=${{ matrix.device.model }},version=${{ matrix.device.version }} \
--timeout 15m \
--results-bucket=gs://${{ secrets.GCS_BUCKET }}/test-results \
--results-dir=${{ github.run_id }}/${{ matrix.device.model }}FLUTTER INTEGRATION TESTS ON FIREBASE:
- uses: subosito/flutter-action@v2
with:
flutter-version: '3.x'
- name: Build integration test APK
run: |
pushd android
flutter build apk --debug
./gradlew app:assembleAndroidTest
popd
- name: Run on Firebase Test Lab
run: |
gcloud firebase test android run \
--type instrumentation \
--app build/app/outputs/flutter-apk/app-debug.apk \
--test build/app/outputs/apk/androidTest/debug/app-debug-androidTest.apk \
--device model=${{ matrix.device.model }},version=${{ matrix.device.version }} \
--timeout 20mIOS XCTEST ON FIREBASE:
ios-device-matrix:
runs-on: macos-14
steps:
- uses: actions/checkout@v4
- name: Build for testing
run: |
xcodebuild build-for-testing \
-scheme AppName \
-destination 'generic/platform=iOS' \
-derivedDataPath build
cd build/Build/Products
zip -r tests.zip Debug-iphoneos *.xctestrun
- name: Run Firebase Test Lab
run: |
gcloud firebase test ios run \
--test build/Build/Products/tests.zip \
--device model=iphone14pro,version=17.5 \
--timeout 15m============================================================ PHASE 4: AWS DEVICE FARM CONFIGURATION ============================================================
Generate AWS Device Farm configuration (alternative to Firebase):
# .github/workflows/device-farm.yml
name: AWS Device Farm
on:
workflow_dispatch:
jobs:
android-tests:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Build APKs
run: ./gradlew assembleDebug assembleAndroidTest
- name: Upload and run on Device Farm
uses: aws-actions/configure-aws-credentials@v4
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region: us-west-2
- run: |
# Create upload and schedule run via AWS CLI
aws devicefarm create-upload \
--project-arn ${{ secrets.DEVICE_FARM_PROJECT_ARN }} \
--name app-debug.apk \
--type ANDROID_APP
# ... upload app, upload tests, create run with device poolDEVICE POOL CONFIGURATION:
{
"name": "Primary Device Pool",
"rules": [
{ "attribute": "PLATFORM", "operator": "EQUALS", "value": "\"ANDROID\"" },
{ "attribute": "OS_VERSION", "operator": "GREATER_THAN_OR_EQUALS", "value": "\"13\"" },
{ "attribute": "MANUFACTURER", "operator": "IN", "value": "[\"Google\", \"Samsung\", \"Xiaomi\"]" }
]
}============================================================ PHASE 5: BROWSERSTACK CONFIGURATION ============================================================
Generate BrowserStack App Automate configuration (alternative):
# browserstack.yml
app: ./app/build/outputs/apk/debug/app-debug.apk
testSuite: ./app/build/outputs/apk/androidTest/debug/app-debug-androidTest.apk
devices:
- Samsung Galaxy S24-14.0
- Google Pixel 8-14.0
- Samsung Galaxy A54-13.0
- Google Pixel 6-13.0
shards:
numberOfShards: 4
networkLogs: true
deviceLogs: true
video: true============================================================ PHASE 6: TEST SHARDING ============================================================
Configure test sharding for faster execution:
STRATEGY:
Firebase Test Lab sharding:
gcloud firebase test android run \
--num-uniform-shards=4 \
# or
--test-targets-for-shard "package com.example.tests.auth" \
--test-targets-for-shard "package com.example.tests.items" \
--test-targets-for-shard "package com.example.tests.profile" \
--test-targets-for-shard "package com.example.tests.settings"============================================================ PHASE 7: RESULT AGGREGATION & REPORTING ============================================================
Generate a result aggregation script that:
FLAKY TEST DETECTION:
--num-flaky-test-attempts).Result report format:
| Test | Pixel 9 | Galaxy S24 | Galaxy A54 | iPhone 16 | iPad Pro | Status |
|---|---|---|---|---|---|---|
| {name} | PASS | PASS | FAIL | PASS | PASS | FLAKY |
============================================================ PHASE 8: PERFORMANCE BENCHMARKING ============================================================
Configure performance measurement across the device matrix:
ANDROID MACROBENCHMARK:
@LargeTest
@RunWith(AndroidJUnit4::class)
class StartupBenchmark {
@get:Rule
val benchmarkRule = MacrobenchmarkRule()
@Test
fun startup() = benchmarkRule.measureRepeated(
packageName = "com.example.app",
metrics = listOf(StartupTimingMetric()),
iterations = 5,
startupMode = StartupMode.COLD,
) {
pressHome()
startActivityAndWait()
}
}Performance metrics per device:
| Metric | Pixel 9 | Galaxy S24 | Galaxy A54 | iPhone 16 | Budget Device |
|---|---|---|---|---|---|
| Cold start (ms) | |||||
| Warm start (ms) | |||||
| Memory (idle MB) | |||||
| Memory (peak MB) | |||||
| Frame rate (fps) | |||||
| Jank frames (%) |
Flag performance regressions when metrics exceed thresholds on any device.
============================================================ SELF-HEALING VALIDATION (max 3 iterations) ============================================================
After generating and running tests, validate:
IF STILL FAILING after 3 iterations:
============================================================ OUTPUT ============================================================
| # | Device | OS | Screen | Category | Platform |
|---|---|---|---|---|---|
| 1 | {device} | {version} | {size} | {category} | {iOS/Android} |
| Workflow | Trigger | Duration (est.) | Cost (est.) |
|---|---|---|---|
| {workflow} | {trigger} | {minutes} | {$/run} |
| Secret | Purpose | How to Obtain |
|---|---|---|
| {secret} | {purpose} | {instructions} |
{list all generated files with paths}
DO NOT:
NEXT STEPS:
/mobile-test if integration tests do not exist yet."/mobile-ci-cd to schedule device matrix runs in the CI pipeline."/mobile-performance to define performance thresholds for benchmarking."============================================================ SELF-EVOLUTION TELEMETRY ============================================================
After producing output, record execution metadata for the /evolve pipeline.
Check if a project memory directory exists:
~/.claude/projects/skill-telemetry.md in that memory directoryEntry format:
### /device-matrix — {{YYYY-MM-DD}}
- Outcome: {{SUCCESS | PARTIAL | FAILED}}
- Self-healed: {{yes — what was healed | no}}
- Iterations used: {{N}} / {{N max}}
- Bottleneck: {{phase that struggled or "none"}}
- Suggestion: {{one-line improvement idea for /evolve, or "none"}}Only log if the memory directory exists. Skip silently if not found. Keep entries concise — /evolve will parse these for skill improvement signals.
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.