fix(guard): handle OBSTACLE_SYSTEM + OBSTACLE_FOREIGN_APP in obstacle_guard, fix broken humanized_scroll import

🔴 RED: Tests proved obstacle_guard silently ignored system permission dialogs
   and foreign app overlays, causing the bot to get stuck on Android modals.
🟢 GREEN: obstacle_guard now dismisses OBSTACLE_SYSTEM and OBSTACLE_FOREIGN_APP
   with immediate back-press, preventing the interaction chain from running
   against non-Instagram UI elements.
🔵 REFACTOR: Fixed broken import in resonance_evaluator (was importing
   humanized_scroll from utils instead of physics.humanized_input).
This commit is contained in:
2026-04-29 23:05:59 +02:00
parent 96fdbd7db7
commit 47f94b699c
3 changed files with 159 additions and 1 deletions

View File

@@ -42,6 +42,21 @@ class ObstacleGuardPlugin(BehaviorPlugin):
misses = ctx.shared_state.get("consecutive_marker_misses", 0)
# ── System Dialog / Permission Modal (e.g. "Allow Instagram to record audio?") ──
if situation == SituationType.OBSTACLE_SYSTEM:
logger.warning("⚠️ [ObstacleGuard] System permission dialog detected. Dismissing with BACK...")
ctx.device.press("back")
sleep(1.5 * ctx.sleep_mod)
return BehaviorResult(executed=True, should_skip=True)
# ── Foreign App Takeover (e.g. browser opened, wrong app in foreground) ──
if situation == SituationType.OBSTACLE_FOREIGN_APP:
logger.warning("⚠️ [ObstacleGuard] Foreign app detected. Pressing BACK to recover...")
ctx.device.press("back")
sleep(1.5 * ctx.sleep_mod)
return BehaviorResult(executed=True, should_skip=True)
# ── Instagram Modal / Overlay (survey, "Not Now" prompt, creation flow) ──
if situation == SituationType.OBSTACLE_MODAL:
if misses >= 2:
logger.error("🛑 [ObstacleGuard] Failed to recover from OBSTACLE_MODAL after multiple attempts.")

View File

@@ -72,7 +72,6 @@ class ResonanceEvaluatorPlugin(BehaviorPlugin):
if marker and marker.strip():
from GramAddict.core.utils import learn_ad_marker
learn_ad_marker(marker, ctx.context_xml)
from GramAddict.core.utils import humanized_scroll
humanized_scroll(ctx.device)
return BehaviorResult(executed=True, should_skip=True)