RIPDPI's own Compose conventions: ViewModel pattern, Route/Screen split, DataStore->StateFlow, RipDpiThemeTokens. Use for how this app does Compose, not generic Compose API questions (see compose).
한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.
RIPDPI Appium launch-contract reference: start routes and permission/service/data presets. Use when a test launches to the wrong screen or a new automation route is added. General flakiness: appium-test-debug.
한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.
설치 방법 보기설치하기 전에 에이전트에게 전달되는 지시 내용을 확인할 수 있습니다.
The automation contract launches the app directly to a specific screen with controlled state, bypassing normal navigation. It is the foundation for every Appium test.
Source of truth: Kotlin AutomationLaunchContract.kt in app/src/main/kotlin/com/poyka/ripdpi/automation/.
Python mirror: appium/lib/launch_contract.py.
conftest.py::launch_app (autouse fixture)
1. Read @pytest.mark.automation(...) kwargs from test
2. adb am force-stop com.poyka.ripdpi
3. sleep 0.5s (process teardown settle)
4. adb am start -n com.poyka.ripdpi/.activities.MainActivity \
--ez com.poyka.ripdpi.automation.ENABLED true \
--es com.poyka.ripdpi.automation.START_ROUTE {route} \
... (remaining extras)
5. wait_for_element(driver, "{route}-screen", timeout=15)
6. yield (test runs)
7. Screenshot on failure -> screenshots/{test_name}.png
| Python Constant | Extra Key | Type | Default | Purpose |
|---|---|---|---|---|
ENABLED | ...automation.ENABLED | bool | true | Activate automation mode |
RESET_STATE | ...automation.RESET_STATE | bool | true | Clear persisted state before launch |
DISABLE_MOTION | ...automation.DISABLE_MOTION | bool | true | Disable Compose animations |
START_ROUTE | ...automation.START_ROUTE | string | "home" | Target screen |
PERMISSION_PRESET | ...automation.PERMISSION_PRESET | string | "granted" | Simulated permission state |
SERVICE_PRESET | ...automation.SERVICE_PRESET | string | "idle" | Simulated service state |
DATA_PRESET | ...automation.DATA_PRESET | string | "clean_home" | Pre-populated data fixtures |
All extras are prefixed with com.poyka.ripdpi.automation..
| Route | Screen Resource ID | Typical data_preset |
|---|---|---|
home | home-screen | clean_home |
onboarding | onboarding-screen | clean_home |
config | config-screen | settings_ready |
diagnostics | diagnostics-screen | diagnostics_demo |
history | history-screen | settings_ready |
logs | logs-screen | settings_ready |
settings | settings-screen | settings_ready |
mode_editor | mode_editor-screen | settings_ready |
dns_settings | dns_settings-screen | settings_ready |
advanced_settings | advanced_settings-screen | settings_ready |
about | about-screen | settings_ready |
data_transparency | data_transparency-screen | settings_ready |
app_customization | app_customization-screen | settings_ready |
| Value | Simulates |
|---|---|
granted | All permissions granted (default) |
vpn_missing | VPN permission not granted |
notifications_missing | Notification permission not granted |
battery_review | Battery optimization not disabled |
| Value | Simulates |
|---|---|
idle | Service not running (default) |
connected_proxy | Proxy service connected |
connected_vpn | VPN service connected |
live | Live connection with real service |
| Value | Simulates |
|---|---|
clean_home | Fresh install state (default) |
settings_ready | Settings populated, configs available |
diagnostics_demo | Demo diagnostic data pre-loaded |
# Minimal -- all defaults (home screen, granted, idle, clean_home)
@pytest.mark.automation()
def test_home_loads(driver): ...
# Deep-link to sub-screen with populated data
@pytest.mark.automation(
start_route="dns_settings",
data_preset="settings_ready",
)
def test_dns_plain_save(driver): ...
# Permission-denied scenario
@pytest.mark.automation(
start_route="home",
permission_preset="vpn_missing",
)
def test_vpn_permission_banner(driver): ...
# Connected state testing
@pytest.mark.automation(
start_route="home",
service_preset="connected_vpn",
data_preset="clean_home",
)
def test_connected_vpn_stats(driver): ...
All parameters are keyword-only. Omitted params use defaults shown in the Intent Extras table.
Route sealed classAutomationLaunchContract.kt to navigate to the new screenModifier.testTag("{route}-screen") on the screen's root composable@pytest.mark.automation(start_route="{route}") in the Python testconftest.py wait (wait_for_element(driver, f"{route}-screen", timeout=15)) works automatically| Mistake | Fix |
|---|---|
Forgetting reset_state=True | Previous test's data leaks in. Default is True -- only set False if intentionally preserving state. |
Wrong data_preset for the screen | Screen renders empty or missing elements. Match route to its typical preset (see table above). |
Omitting disable_motion=True | Animations cause timing issues, especially in CI. Default is True -- only set False to test animations. |
start_route value not in Kotlin Route | App silently falls back to home screen. Verify the route exists in Route.kt. |
Screen resource-id doesn't match {route}-screen | wait_for_element times out on launch. The convention is {route}-screen. |
Testing connected state with service_preset="idle" | Stats/metrics cards won't be visible. Use connected_vpn or connected_proxy. |
.agents/skills/appium-test-authoring/SKILL.md -- How to write tests using the automation marker.agents/skills/appium-test-debug/SKILL.md -- Troubleshooting when launch fails.agents/skills/android-device-debug/SKILL.md -- Raw ADB commands for device interaction아직 리뷰가 없습니다. 사용해 본 소감을 남겨 주세요.
로그인 없이 쓸 수 있습니다. 사용 후기, 질문, 작동하지 않은 환경 등을 편하게 남겨 주세요.
아직 댓글이 없습니다. 첫 댓글을 남겨 보세요.
RIPDPI's own Compose conventions: ViewModel pattern, Route/Screen split, DataStore->StateFlow, RipDpiThemeTokens. Use for how this app does Compose, not generic Compose API questions (see compose).
한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.
ADB-based RIPDPI device/emulator debugging: build/install/launch, logcat filtering, fixture port-forwarding, instrumented tests, crash/ANR triage. Use when debugging on a real device or emulator.
한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.
RIPDPI Appium test authoring: page objects, resource-id locators, assertions, wait tiers. Use when writing a new Appium test or page object, or adding coverage for a new screen.
한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.
RIPDPI Appium failure triage: flaky tests, locator/session/wait issues, screenshot and element-tree debugging. Use when an Appium test fails or is flaky.
한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.
Add or modify a GitHub Actions job. Use when editing a file under .github/workflows/. Not for running a workflow locally (local-ci-act) or release signing (release-signing).
한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.
Conservative review of end-user legal exposure from diagnostics targets and probe hosts, by jurisdiction. Use when shipping or editing diagnostics target lists, probe hosts, or bootstrap endpoints.
한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.