
Mobile Testing
- 146 installs
- 433 repo stars
- Updated August 4, 2026
- proffesor-for-testing/agentic-qe
Plan and execute mobile app tests across devices, OS versions, gestures, offline modes, push notifications, and store-build smoke checks before app store submission.
About
Delivers mobile testing practices from agentic-qe for iOS and Android apps, spanning device coverage, UI automation, offline behavior, notifications, and pre-submission smoke validation so mobile releases ship with fewer platform-specific regressions.
- iOS and Android device matrices
- Gesture and orientation coverage
- Offline and push notification cases
- Store build smoke tests
- Automation framework selection
Mobile Testing by the numbers
- 146 all-time installs (skills.sh)
- +4 installs in the week ending Aug 4, 2026 (Skillselion tracking)
- Ranked #892 of 2,153 Testing & QA skills by installs in the Skillselion catalog
- Data as of Aug 5, 2026 (Skillselion catalog sync)
npx skills add https://github.com/proffesor-for-testing/agentic-qe --skill mobile-testingAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 146 |
|---|---|
| repo stars | ★ 433 |
| Last updated | August 4, 2026 |
| Repository | proffesor-for-testing/agentic-qe ↗ |
What it does
Plan and execute mobile app tests across devices, OS versions, gestures, offline modes, push notifications, and store-build smoke checks before app store submission.
Files
Mobile Testing
<default_to_action> When testing mobile applications: 1. DEFINE device coverage matrix (Tier 1: 60%, Tier 2: 30%, Tier 3: 10%) 2. TEST platform differences (iOS ≠ Android: back button, permissions, UI) 3. VALIDATE touch gestures (tap, swipe, pinch, long-press) 4. TEST mobile-specific scenarios (offline, low battery, interruptions) 5. USE real devices for critical paths, emulators for fast feedback
Quick Mobile Checklist:
- Test on latest iOS + Android flagship devices
- Test offline mode and network transitions
- Verify push notifications work
- Test gesture interactions (swipe, pinch)
- Check permissions flow (camera, location, notifications)
Critical Success Factors:
- Emulators for 80% of testing, real devices for 20% critical paths
- Test on devices your users actually use (analytics)
- Device fragmentation is Android's biggest challenge
</default_to_action>
Quick Reference Card
When to Use
- Native app development (iOS/Android)
- Hybrid apps (React Native, Flutter)
- Mobile web / PWAs
- App store submission preparation
iOS vs Android Differences
| Aspect | iOS | Android |
|---|---|---|
| OS Versions | 2-3 supported | 10+ in use |
| Devices | ~40 models | 1000+ variants |
| Back Button | Gesture/nav | Hardware/software |
| Permissions | Single prompt | Runtime granular |
| App Store | Strict review | Google Play + sideload |
Device Coverage Tiers
| Tier | Coverage | Devices |
|---|---|---|
| Tier 1 | 60% users | iPhone 15, Galaxy S24, iPad |
| Tier 2 | 30% users | iPhone 14/13, Pixel 8 |
| Tier 3 | 10% users | Older devices, other manufacturers |
---
Mobile-Specific Scenarios
// Offline mode testing
test('app works offline', async () => {
await driver.toggleAirplaneMode();
await driver.findElement('view-saved-items').click();
const items = await driver.findElements('saved-item');
expect(items.length).toBeGreaterThan(0);
const banner = await driver.findElement('offline-banner');
expect(banner.getText()).toContain('No internet');
await driver.toggleAirplaneMode(); // Restore
});
// Location testing
test('location-based features', async () => {
await driver.setGeoLocation({
latitude: 37.7749,
longitude: -122.4194,
altitude: 0
});
const stores = await driver.findElement('stores-list');
expect(stores.getText()).toContain('San Francisco');
});
// Permission testing (Android)
test('camera permission flow', async () => {
await driver.findElement('take-photo').click();
// Handle permission dialog
await driver.findElement(
'com.android.packageinstaller:id/permission_allow_button'
).click();
expect(await driver.findElement('camera-view')).toBeDefined();
});---
Agent-Driven Mobile Testing
// Cross-platform mobile testing
await Task("Mobile Test Suite", {
platforms: ['iOS', 'Android'],
deviceTiers: [1, 2],
tests: 'regression-suite',
parallelDevices: 5,
deviceFarm: 'browserstack'
}, "qe-test-executor");
// Device farm integration
await Task("Device Farm Execution", {
service: 'browserstack',
devices: [
'iPhone 15 - iOS 17',
'Samsung Galaxy S24 - Android 14'
],
recordVideo: true,
captureNetworkLogs: true
}, "qe-test-executor");---
Agent Coordination Hints
Memory Namespace
aqe/mobile-testing/
├── device-matrix/* - Device coverage strategy
├── platform-tests/* - iOS/Android specific tests
├── gesture-library/* - Reusable gesture patterns
└── performance/* - Mobile performance metricsFleet Coordination
const mobileFleet = await FleetManager.coordinate({
strategy: 'mobile-testing',
agents: [
'qe-test-executor', // Cross-platform execution
'qe-performance-tester', // Mobile performance
'qe-visual-tester' // Screen size validation
],
topology: 'parallel'
});---
Related Skills
- accessibility-testing - VoiceOver, TalkBack
- performance-testing - Mobile performance
- compatibility-testing - Device compatibility
---
Remember
Test on real devices for critical flows. Emulators catch 80% of bugs but real devices are needed for actual performance, sensor behavior, and platform quirks.
With Agents: qe-test-executor orchestrates testing across device farms, manages platform differences, and tests 10+ devices in parallel.
# =============================================================================
# AQE Skill Evaluation Test Suite: Mobile Testing v1.0.0
# =============================================================================
#
# Comprehensive evaluation suite for the mobile-testing skill.
# Tests device matrix coverage, gesture validation, platform-specific differences,
# mobile-specific scenarios, and performance metrics on iOS and Android.
#
# Schema: .claude/skills/.validation/schemas/skill-eval.schema.json
# Validator: .claude/skills/mobile-testing/scripts/validate-config.json
#
# Coverage:
# - Device matrix planning (Tier 1/2/3 coverage)
# - Touch gesture validation (tap, swipe, pinch)
# - Platform differences (iOS vs Android)
# - Mobile scenarios (offline, low-battery, interruptions)
# - Performance metrics (launch time, frame rate, battery drain)
#
# =============================================================================
skill: mobile-testing
version: 1.0.0
description: >
Comprehensive evaluation suite for the mobile-testing skill.
Tests device fragmentation handling, platform-specific behaviors,
gesture interactions, mobile scenarios (offline mode, orientation changes),
and performance metrics for iOS and Android applications.
# =============================================================================
# Multi-Model Configuration
# =============================================================================
models_to_test:
- claude-sonnet-4-6 # Primary (high accuracy expected)
- claude-haiku-4-5 # Fast model (minimum quality floor)
# =============================================================================
# MCP Integration Configuration
# =============================================================================
mcp_integration:
enabled: true
namespace: skill-validation
query_patterns: true
track_outcomes: true
store_patterns: true
share_learning: true
update_quality_gate: true
target_agents:
- qe-learning-coordinator
- qe-queen-coordinator
- qe-performance-tester
# =============================================================================
# ReasoningBank Learning Configuration
# =============================================================================
learning:
store_success_patterns: true
store_failure_patterns: true
pattern_ttl_days: 90
min_confidence_to_store: 0.7
cross_model_comparison: true
# =============================================================================
# Result Format Configuration
# =============================================================================
result_format:
json_output: true
markdown_report: true
include_raw_output: false
include_timing: true
include_token_usage: true
# =============================================================================
# Environment Setup
# =============================================================================
setup:
required_tools:
- jq
environment_variables:
MOBILE_TESTING_ENABLED: "true"
DEVICE_FARM: "local"
MIN_DEVICES: "2"
# =============================================================================
# TEST CASES
# =============================================================================
test_cases:
# ---------------------------------------------------------------------------
# CATEGORY: Device Matrix Coverage
# ---------------------------------------------------------------------------
- id: tc001_device_matrix_tier1_coverage
description: "Validate Tier 1 device matrix covers 60% of users"
category: device_coverage
priority: critical
input:
tier1_devices:
- name: "iPhone 15"
platform: ios
osVersion: "17.2"
users_percent: 35
- name: "Samsung Galaxy S24"
platform: android
osVersion: "14"
users_percent: 25
tier2_devices:
- name: "iPhone 14"
platform: ios
osVersion: "17.0"
users_percent: 20
tier3_devices:
- name: "iPhone 12"
platform: ios
osVersion: "16.7"
users_percent: 10
context:
app_type: native
market: global
expected_output:
must_contain:
- "device matrix"
- "tier"
- "coverage"
- "60"
must_not_contain:
- "incomplete"
severity_classification: info
finding_count:
max: 1
validation:
schema_check: true
keyword_match_threshold: 0.8
reasoning_quality_min: 0.75
timeout_ms: 30000
- id: tc002_platform_fragmentation_android
description: "Detect Android device fragmentation issues"
category: device_coverage
priority: critical
input:
devices:
- model: "Samsung Galaxy S24"
android_version: "14"
screen_size: "6.2 inches"
- model: "OnePlus 12"
android_version: "14"
screen_size: "6.7 inches"
- model: "Xiaomi 14"
android_version: "14"
screen_size: "6.36 inches"
- model: "Google Pixel 8"
android_version: "14"
screen_size: "6.2 inches"
- model: "Motorola Edge 50"
android_version: "14"
screen_size: "6.55 inches"
context:
platform: android
concern: "1000+ device variants"
expected_output:
must_contain:
- "fragmentation"
- "screen size"
- "variant"
must_not_contain:
- "uniform"
severity_classification: high
validation:
schema_check: true
keyword_match_threshold: 0.75
# ---------------------------------------------------------------------------
# CATEGORY: Gesture Validation
# ---------------------------------------------------------------------------
- id: tc003_gesture_tap_validation
description: "Validate tap gesture detection and response"
category: gestures
priority: critical
input:
gesture: tap
coordinates:
x: 320
y: 568
duration_ms: 100
expected_action: "button click"
latency_threshold_ms: 100
context:
app_type: native
platform: ios
expected_output:
must_contain:
- "tap"
- "gesture"
- "latency"
must_not_contain:
- "failed"
severity_classification: info
validation:
schema_check: true
keyword_match_threshold: 0.7
- id: tc004_gesture_swipe_detection
description: "Validate swipe gesture for navigation"
category: gestures
priority: high
input:
gesture: swipe
direction: down
start_coordinates:
x: 320
y: 200
end_coordinates:
x: 320
y: 600
expected_action: "scroll down"
velocity: 500
context:
app_type: native
framework: uikit
expected_output:
must_contain:
- "swipe"
- "scroll"
- "velocity"
must_not_contain:
- "unresponsive"
severity_classification: info
validation:
schema_check: true
keyword_match_threshold: 0.7
- id: tc005_gesture_pinch_zoom
description: "Validate pinch-to-zoom gesture"
category: gestures
priority: high
input:
gesture: pinch
action: zoom
scale_factor: 2.0
duration_ms: 500
finger_distance_start: 100
finger_distance_end: 200
context:
app_type: native
content: image_gallery
expected_output:
must_contain:
- "pinch"
- "zoom"
- "scale"
must_not_contain:
- "failed"
severity_classification: medium
validation:
schema_check: true
keyword_match_threshold: 0.7
# ---------------------------------------------------------------------------
# CATEGORY: Platform-Specific Behavior
# ---------------------------------------------------------------------------
- id: tc006_ios_specific_features
description: "Validate iOS-specific navigation and features"
category: platform
priority: critical
input:
platform: ios
features:
- name: "safe-area"
description: "Notch and home indicator handling"
required: true
- name: "gesture-navigation"
description: "Swipe back from left edge"
required: true
- name: "haptic-feedback"
description: "Taptic Engine feedback"
required: false
context:
osversion_min: "14.0"
devices: ["iPhone 13", "iPhone 14", "iPhone 15"]
expected_output:
must_contain:
- "iOS"
- "safe-area"
- "gesture"
must_not_contain:
- "Android"
severity_classification: high
validation:
schema_check: true
keyword_match_threshold: 0.8
- id: tc007_android_specific_features
description: "Validate Android-specific features and permissions"
category: platform
priority: critical
input:
platform: android
features:
- name: "back-button"
description: "Hardware or software back button"
required: true
- name: "runtime-permissions"
description: "Android 6.0+ runtime permissions"
required: true
- name: "material-design"
description: "Material Design 3 guidelines"
required: true
context:
min_sdk: 24
target_sdk: 34
expected_output:
must_contain:
- "Android"
- "permissions"
- "back"
must_not_contain:
- "iOS"
severity_classification: high
validation:
schema_check: true
keyword_match_threshold: 0.8
# ---------------------------------------------------------------------------
# CATEGORY: Mobile-Specific Scenarios
# ---------------------------------------------------------------------------
- id: tc008_offline_mode_support
description: "Verify app functionality in offline mode"
category: scenarios
priority: critical
input:
scenario: offline_mode
steps:
- disable_network: true
- cached_data_required: true
- ui_indicator_required: true
- sync_on_reconnect: true
context:
app_type: native
data_persistence: sqlite
expected_output:
must_contain:
- "offline"
- "cache"
- "sync"
must_not_contain:
- "crash"
severity_classification: critical
validation:
schema_check: true
keyword_match_threshold: 0.8
- id: tc009_background_foreground_transitions
description: "Test app behavior during background/foreground transitions"
category: scenarios
priority: high
input:
scenario: background_foreground
sequence:
- app_running: true
- send_to_background: true
- expected_state: "paused"
- bring_to_foreground: true
- expected_state_final: "resumed"
context:
app_type: native
expected_output:
must_contain:
- "transition"
- "background"
- "foreground"
- "state"
must_not_contain:
- "memory leak"
severity_classification: high
validation:
schema_check: true
keyword_match_threshold: 0.7
- id: tc010_orientation_change_handling
description: "Verify proper handling of device rotation"
category: scenarios
priority: high
input:
scenario: orientation_change
rotations:
- from: portrait
to: landscape
preserve_state: true
- from: landscape
to: portrait
preserve_state: true
context:
app_type: native
auto_rotate: true
expected_output:
must_contain:
- "orientation"
- "rotation"
- "layout"
must_not_contain:
- "data loss"
severity_classification: high
validation:
schema_check: true
keyword_match_threshold: 0.7
# ---------------------------------------------------------------------------
# CATEGORY: Performance Metrics
# ---------------------------------------------------------------------------
- id: tc011_app_launch_performance
description: "Validate app launch time meets performance targets"
category: performance
priority: critical
input:
measurements:
- cold_start_ms: 1500
target_ms: 2000
status: passed
- warm_start_ms: 800
target_ms: 1000
status: passed
context:
device: "iPhone 15"
platform: ios
expected_output:
must_contain:
- "launch"
- "performance"
- "ms"
must_not_contain:
- "exceeded"
severity_classification: medium
validation:
schema_check: true
keyword_match_threshold: 0.7
- id: tc012_frame_rate_stability
description: "Measure frame rate and detect jank"
category: performance
priority: high
input:
measurements:
- average_fps: 58
target_fps: 60
jank_frames: 2
- drops_below_60fps: 5
percent_smooth: 99.5
context:
device: "Samsung Galaxy S24"
platform: android
expected_output:
must_contain:
- "frame rate"
- "fps"
- "smooth"
must_not_contain:
- "jank"
severity_classification: medium
validation:
schema_check: true
keyword_match_threshold: 0.7
# =============================================================================
# SUCCESS CRITERIA
# =============================================================================
success_criteria:
pass_rate: 0.85
critical_pass_rate: 1.0
avg_reasoning_quality: 0.75
max_execution_time_ms: 300000
cross_model_variance: 0.15
# =============================================================================
# METADATA
# =============================================================================
metadata:
author: "qe-test-executor"
created: "2026-02-02"
last_updated: "2026-02-02"
coverage_target: >
Mobile testing including device matrix coverage (Tier 1/2/3),
gesture validation (tap, swipe, pinch), platform-specific behaviors
(iOS safe-area, Android permissions), mobile scenarios (offline,
background/foreground, orientation), and performance metrics
(launch time, frame rate). 12 test cases covering iOS and Android
with 85% pass rate requirement.
{
"$schema": "http://json-schema.org/draft-07/schema#",
"$id": "https://agentic-qe.dev/schemas/mobile-testing-output.json",
"title": "AQE Mobile Testing Skill Output Schema",
"description": "Schema for iOS and Android mobile testing output including device matrix, gesture validation, platform differences, and performance metrics.",
"type": "object",
"required": ["skillName", "version", "timestamp", "status", "trustTier", "output"],
"properties": {
"skillName": {
"type": "string",
"const": "mobile-testing",
"description": "Skill identifier"
},
"version": {
"type": "string",
"pattern": "^\\d+\\.\\d+\\.\\d+(-[a-zA-Z0-9]+)?$"
},
"timestamp": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?(Z|[+-]\\d{2}:\\d{2})?$"
},
"status": {
"type": "string",
"enum": ["success", "partial", "failed", "skipped"]
},
"trustTier": {
"type": "integer",
"const": 3
},
"output": {
"type": "object",
"required": ["summary", "deviceMatrix", "platformCoverage", "metrics"],
"properties": {
"summary": {
"type": "string",
"minLength": 10,
"maxLength": 2000
},
"score": {
"$ref": "#/$defs/mobileScore"
},
"deviceMatrix": {
"$ref": "#/$defs/deviceMatrix",
"description": "Device coverage by tier"
},
"platformCoverage": {
"$ref": "#/$defs/platformCoverage",
"description": "iOS vs Android coverage"
},
"gestureValidation": {
"$ref": "#/$defs/gestureValidation",
"description": "Touch gesture test results"
},
"mobileScenarios": {
"type": "array",
"items": {
"$ref": "#/$defs/mobileScenario"
},
"description": "Mobile-specific scenario results"
},
"performanceMetrics": {
"$ref": "#/$defs/mobilePerformance",
"description": "Mobile performance metrics"
},
"findings": {
"type": "array",
"items": {
"$ref": "#/$defs/mobileFinding"
},
"maxItems": 500
},
"recommendations": {
"type": "array",
"items": {
"$ref": "#/$defs/recommendation"
},
"maxItems": 100
},
"metrics": {
"$ref": "#/$defs/mobileMetrics"
},
"artifacts": {
"type": "array",
"items": {
"$ref": "#/$defs/artifact"
},
"maxItems": 50
}
}
},
"metadata": {
"type": "object",
"properties": {
"executionTimeMs": { "type": "integer", "minimum": 0 },
"toolsUsed": {
"type": "array",
"items": {
"type": "string",
"enum": ["appium", "xcuitest", "espresso", "detox", "browserstack", "saucelabs"]
}
},
"agentId": { "type": "string", "pattern": "^qe-[a-z][a-z0-9-]*$" },
"appType": { "type": "string", "enum": ["native", "hybrid", "pwa", "web"] }
}
},
"validation": {
"type": "object",
"properties": {
"schemaValid": { "type": "boolean" },
"contentValid": { "type": "boolean" },
"confidence": { "type": "number", "minimum": 0, "maximum": 1 }
}
},
"learning": {
"type": "object",
"properties": {
"patternsDetected": { "type": "array", "items": { "type": "string" } },
"reward": { "type": "number", "minimum": 0, "maximum": 1 }
}
}
},
"$defs": {
"mobileScore": {
"type": "object",
"required": ["value", "max"],
"properties": {
"value": { "type": "number", "minimum": 0, "maximum": 100 },
"max": { "type": "number", "const": 100 },
"grade": { "type": "string", "pattern": "^[A-F][+-]?$" },
"userCoveragePercent": { "type": "number", "minimum": 0, "maximum": 100 }
}
},
"deviceMatrix": {
"type": "object",
"properties": {
"tier1": {
"$ref": "#/$defs/deviceTier",
"description": "Tier 1 devices (60% users)"
},
"tier2": {
"$ref": "#/$defs/deviceTier",
"description": "Tier 2 devices (30% users)"
},
"tier3": {
"$ref": "#/$defs/deviceTier",
"description": "Tier 3 devices (10% users)"
},
"totalDevices": { "type": "integer", "minimum": 0 }
}
},
"deviceTier": {
"type": "object",
"properties": {
"devices": {
"type": "array",
"items": {
"$ref": "#/$defs/deviceResult"
}
},
"passRate": { "type": "number", "minimum": 0, "maximum": 100 }
}
},
"deviceResult": {
"type": "object",
"required": ["device", "platform", "status"],
"properties": {
"device": { "type": "string", "description": "Device name (e.g., iPhone 15, Galaxy S24)" },
"platform": { "type": "string", "enum": ["ios", "android"] },
"osVersion": { "type": "string" },
"status": { "type": "string", "enum": ["passed", "failed", "partial", "skipped"] },
"issueCount": { "type": "integer", "minimum": 0 },
"screenSize": { "type": "string" }
}
},
"platformCoverage": {
"type": "object",
"properties": {
"ios": {
"$ref": "#/$defs/platformResult"
},
"android": {
"$ref": "#/$defs/platformResult"
}
}
},
"platformResult": {
"type": "object",
"properties": {
"versionsSupported": { "type": "array", "items": { "type": "string" } },
"versionsTested": { "type": "array", "items": { "type": "string" } },
"passRate": { "type": "number", "minimum": 0, "maximum": 100 },
"issues": { "type": "integer", "minimum": 0 }
}
},
"gestureValidation": {
"type": "object",
"properties": {
"tap": { "$ref": "#/$defs/gestureResult" },
"swipe": { "$ref": "#/$defs/gestureResult" },
"pinch": { "$ref": "#/$defs/gestureResult" },
"longPress": { "$ref": "#/$defs/gestureResult" },
"doubleTap": { "$ref": "#/$defs/gestureResult" },
"rotate": { "$ref": "#/$defs/gestureResult" }
}
},
"gestureResult": {
"type": "object",
"properties": {
"status": { "type": "string", "enum": ["passed", "failed", "partial", "not-tested"] },
"latencyMs": { "type": "number", "minimum": 0, "description": "Response latency" },
"issues": { "type": "array", "items": { "type": "string" } }
}
},
"mobileScenario": {
"type": "object",
"required": ["scenario", "status"],
"properties": {
"scenario": {
"type": "string",
"enum": ["offline-mode", "low-battery", "incoming-call", "push-notification", "orientation-change", "background-foreground", "memory-pressure", "network-transition"],
"description": "Mobile-specific scenario"
},
"status": { "type": "string", "enum": ["passed", "failed", "partial", "skipped"] },
"description": { "type": "string" },
"issues": { "type": "array", "items": { "type": "string" } }
}
},
"mobilePerformance": {
"type": "object",
"properties": {
"appLaunchTime": {
"type": "object",
"properties": {
"cold": { "type": "number", "description": "Cold start time in ms" },
"warm": { "type": "number", "description": "Warm start time in ms" },
"target": { "type": "number" },
"status": { "type": "string", "enum": ["passed", "failed"] }
}
},
"frameRate": {
"type": "object",
"properties": {
"average": { "type": "number" },
"minimum": { "type": "number" },
"target": { "type": "number", "default": 60 },
"jankFrames": { "type": "integer" }
}
},
"batteryDrain": {
"type": "object",
"properties": {
"foregroundPerHour": { "type": "number" },
"backgroundPerHour": { "type": "number" },
"target": { "type": "number" }
}
},
"memoryUsage": {
"type": "object",
"properties": {
"average": { "type": "number", "description": "MB" },
"peak": { "type": "number" },
"leaksDetected": { "type": "boolean" }
}
}
}
},
"mobileFinding": {
"type": "object",
"required": ["id", "title", "severity", "category"],
"properties": {
"id": { "type": "string", "pattern": "^MOB-\\d{3,6}$" },
"title": { "type": "string", "minLength": 5, "maxLength": 200 },
"description": { "type": "string", "maxLength": 2000 },
"severity": { "type": "string", "enum": ["critical", "high", "medium", "low", "info"] },
"category": {
"type": "string",
"enum": ["gesture", "performance", "permission", "offline", "platform-specific", "ui", "crash", "memory"]
},
"affectedPlatforms": { "type": "array", "items": { "type": "string" } },
"affectedDevices": { "type": "array", "items": { "type": "string" } },
"remediation": { "type": "string" }
}
},
"mobileMetrics": {
"type": "object",
"properties": {
"totalDevices": { "type": "integer", "minimum": 0 },
"devicesPassed": { "type": "integer", "minimum": 0 },
"devicesFailed": { "type": "integer", "minimum": 0 },
"passRate": { "type": "number", "minimum": 0, "maximum": 100 },
"iosCoverage": { "type": "number", "minimum": 0, "maximum": 100 },
"androidCoverage": { "type": "number", "minimum": 0, "maximum": 100 },
"criticalIssues": { "type": "integer", "minimum": 0 },
"duration": { "type": "integer", "minimum": 0 }
}
},
"recommendation": {
"type": "object",
"required": ["id", "title", "priority"],
"properties": {
"id": { "type": "string", "pattern": "^REC-\\d{3,6}$" },
"title": { "type": "string" },
"description": { "type": "string" },
"priority": { "type": "string", "enum": ["critical", "high", "medium", "low"] },
"effort": { "type": "string", "enum": ["trivial", "low", "medium", "high", "major"] }
}
},
"artifact": {
"type": "object",
"required": ["type", "path"],
"properties": {
"type": { "type": "string", "enum": ["report", "screenshot", "video", "log", "trace"] },
"path": { "type": "string" },
"format": { "type": "string", "enum": ["json", "html", "png", "mp4", "webm", "txt"] }
}
}
}
}
{
"skillName": "mobile-testing",
"skillVersion": "1.0.0",
"requiredTools": [
"jq"
],
"optionalTools": [
"appium",
"ajv",
"jsonschema",
"python3"
],
"schemaPath": "schemas/output.json",
"requiredFields": [
"skillName",
"status",
"output",
"output.deviceMatrix",
"output.platformCoverage",
"output.metrics"
],
"requiredNonEmptyFields": [
"output.summary",
"output.deviceMatrix"
],
"mustContainTerms": [
"mobile",
"device"
],
"mustNotContainTerms": [
"TODO",
"placeholder",
"FIXME"
],
"enumValidations": {
".status": [
"success",
"partial",
"failed",
"skipped"
]
}
}