Commit Graph

134 Commits

Author SHA1 Message Date
59cd5477af fix(navigation): harden obstacle guard and structural sanity checks against phantom keyboards and reply-box traps 2026-05-05 11:27:31 +02:00
c3f84088aa fix(action_memory): explicitly request JSON schema for visual verification
1. Prevent VLM from inventing arbitrary JSON keys when queried with format_json=True.
2. Ensure verify_success prompt directly requests {"success": true/false}.
3. Maintain negative reinforcement parsing integrity.
2026-05-05 11:16:40 +02:00
548fc374ae feat(perception): implement extreme VLM guards and surface spatial metadata
1. Add long_clickable and class_name to SpatialNode and box_legend.
2. Inject strict guardrails into the SoM prompt to prevent EditText, Recents gallery, and long_clickable hallucinations.
3. Update text-based resolver with equivalent extreme fallback rules.
4. Ensures VLM explicitly rejects non-deterministic edge cases (e.g., Select Album).
2026-05-05 11:01:28 +02:00
5ada31c77e feat(navigation): harden obstacle guard and intent resolver against keyboard hallucinations 2026-05-05 10:52:38 +02:00
39185593dd test(e2e): Fix E2E context generator and harden StoryView plugin
- Updated e2e_workflow_ctx in conftest to structurally parse screen_type
- Fixed StoryViewPlugin to gracefully handle pre-existing story screens
- Resolved 'LIE DETECTED' failure in story test suite
- Validated structural path transitions for story ring and story exit
2026-05-05 01:50:40 +02:00
c0cfa24384 feat(core): P0 radical evolution — kill blank_start, complete ContextGate matrix, fix HD Map back transitions
P0-2: Kill blank_start: true in config — the nuclear option that wipes ALL learned
knowledge on every run. Replaced with memory_hygiene() selective amnesia that
prunes low-confidence entries while preserving high-confidence learned patterns.

P0-3: Purge all root-level garbage scripts (scratch.py, test_run.py, profile_dump.xml,
resp_dump.json, pytest_output.log, test_output.log, coverage.xml, coverage_e2e.json).
Updated .gitignore to prevent reaccumulation.

P2-2: Replace piecemeal BANNED_SCREENS/REQUIRED_MARKERS with complete Action
Compatibility Matrix (VALID_SCREENS whitelist). Every interaction intent now has
an explicit set of valid screens. Covers like, comment, follow, unfollow, save,
repost across all 14 screen types.

P2-3: Remove non-deterministic 'press back' transitions from HD Map topology for
OTHER_PROFILE, POST_DETAIL, and SEARCH_RESULTS. Add tab transitions to POST_DETAIL.

P2-4: Replace ScreenMemoryDB nuclear 200-entry wipe with LRU eviction.
store_screen() now accepts confidence parameter.

TDD: 22 new tests (all GREEN), 240 unit/tdd/integration passed, 0 regressions.
E2E: 288 passed (+2 fixed), 6 pre-existing LIE DETECTED failures.
2026-05-04 18:19:00 +02:00
3800254fe3 feat: structural hardening, grid fast-paths, and state-aware adaptive snap recovery 2026-05-04 17:43:25 +02:00
22216cbd2d feat(core): finalize P2 & P3 hardening - Topology HD Map, Empathy Filter, and Git Hygiene 2026-05-04 15:03:42 +02:00
79e5784b93 feat(core): complete P1 hardening phase - ContextGate, Localization Purge, SoM Safety Clamp 2026-05-04 14:51:54 +02:00
5c9ea0e5e2 fix(resonance): remediate 0.85 score flatlining (P1-4)
- Raised ContentMemoryDB cache threshold from 0.95 to 0.98 to prevent cross-post poisoning.
- Implemented continuous resonance scoring by storing and retrieving 'resonance_score'
  in ContentMemoryDB.
- ResonanceEngine now prioritizes high-fidelity raw scores from cache over
  discrete 'high/medium/low' mapping.

TDD: 3 tests verifying threshold and scoring logic integrity.
2026-05-04 14:42:59 +02:00
a265dee3d0 fix(memory): ScreenMemory threshold hardening + stale layout purge (P0-3)
- Raised similarity_threshold from 0.90 to 0.95 in get_screen_type() to eliminate
  POST_DETAIL false-positives caused by embedding saturation.
- Implemented purge_stale_screens() with 24h TTL to remove layout drift.
- Added collection size cap (200 points) to store_screen() with automatic wipe
  when saturated to clear overfitting bias.
- Triggered purge_stale_screens() on ScreenIdentity initialization.

TDD: 3 new tests for threshold defaults and purge method integrity.
2026-05-04 14:39:55 +02:00
d81a5d4e81 fix(perception): structural Resource-ID bypass gate + dead code purge in ActionMemory
P0-1: Toggle intents (follow/like/save) resolved via Resource-ID fast-path
now skip VLM verification entirely. Eliminates the #1 session failure:
VLM hallucinating Follow→Like, causing zero follows per session.

P0-2: Purge 52 lines of unreachable dead code after unconditional return
at line 290. Non-toggle structural delta verification now properly reachable.
Remove 4 DEBUG-prefixed logger.info pollution statements.

TDD: 7 new tests covering bypass gate, negative guard, non-toggle delta,
and debug log pollution detection.
2026-05-04 14:35:19 +02:00
f384fbb749 feat: purge ALL remaining German/localized strings from action_memory, telepathic_engine, darwin_engine, resonance_engine — enforce zero-maintenance structural determinism with TDD compliance tests 2026-05-03 23:33:28 +02:00
c641204a6b feat: enforce zero-maintenance autonomous navigation by purging hardcoded string searches and localized translations; harden VLM perception via robust JSON fallback; fix OTHER_PROFILE topological routing 2026-05-03 23:28:00 +02:00
4b645c6fb2 Hardening: Centralized zero-trust CognitiveStack validation and removed synthetic e2e test mocks 2026-05-03 20:30:30 +02:00
c7c7ce29f8 fix(qdrant): increase embedding API timeout to 30s to allow Ollama VRAM cold-starts 2026-05-03 18:38:27 +02:00
b36dde77d8 fix(navigation): harden autonomous perimeter guards against Play Store trap 2026-05-03 18:29:25 +02:00
67c3d464e0 fix(navigation): harden ScreenIdentity priority cascade and GOAP structural action detection
1. ScreenIdentity: Restructured priority cascade to prevent Qdrant semantic
   cache from overriding deterministic structural heuristics. Cached types
   now resolve AFTER structural checks (Priority 3) instead of before.
   Story/Reels hallucinations from both cache and VLM are rejected if
   structural markers are absent.

2. bot_flow: Added error handling for story ring avatar tap and curiosity
   HomeFeed navigation failures — prevents silent continuation into
   undefined states.

3. GOAP: Extended is_navigation detection to include ScreenTopology
   structural actions, ensuring HD Map routes are correctly classified.

4. action_memory: Tightened _parse_yes_no to prevent JSON fall-through
   into ambiguous text matching. Structured responses with 'success'
   boolean are now handled directly.
2026-05-03 17:00:27 +02:00
d298f03891 fix(sae): structural fast-path for Instagram survey/interstitial modal detection
The SAE perceive() had no structural fast-path for Instagram-internal
modal overlays (surveys, rating prompts, interstitials). These modals
live inside com.instagram.android and were invisible to the foreign-app
detector. The LLM fallback frequently misclassified them as NORMAL,
causing the bot to get trapped in survey dialogs.

Added two O(1) structural detection layers:
1. Resource-ID markers: survey_overlay_container, interstitial_container,
   mystery_interstitial, nux_overlay, rating_prompt, feedback_dialog
2. Dismiss-button heuristic: cross-validates dismiss text with overlay
   container structure to prevent caption false positives

Also removed dead code: xml_dump.lower() no-op.

Fixes: test_perceive_instagram_survey_modal
Zero regressions: 464 passed, 6 pre-existing failures
2026-05-03 16:59:52 +02:00
604f2d7341 fix(perception): avoid skipping first highlight story by differentiating from home feed tray 2026-05-03 16:38:02 +02:00
cd8f35056c fix(perception): structural fast-path skips own profile story ring on home feed to prevent modal traps 2026-05-03 16:35:59 +02:00
800fb1da98 fix(perception): replace string matching with structural feed marker check for perfect snapping 2026-05-03 16:31:32 +02:00
6cd068f951 test(curiosity): force CHECK_CURIOSITY triggering and harden HD Map routing 2026-05-03 16:20:18 +02:00
f46b0b7bcb chore: harden verify_success fallbacks to Fail-Fast and apply aggressive GOAP penalty 2026-05-03 15:42:09 +02:00
5fbbe3d273 feat(e2e): ACHIEVED ABSOLUTE REALISM - 100% Production Parity Purge. Removed all synthetic guards and mocks from core. Enabled honest Qdrant and Disk I/O in tests. Empty KNOWN_DIVERGENCES. 2026-05-03 14:44:01 +02:00
f85d0a8a76 test(e2e): eliminate create_emulator_facade monkeypatching and replace with make_real_device_with_xml where applicable 2026-05-03 13:44:58 +02:00
e535c10b65 fix(perception): structural fast-path and VLM bounds extraction for Reels 2026-05-02 23:17:12 +02:00
3da3849ca1 fix: purge GOAP tracking state when Instagram is forced to restart 2026-05-02 22:50:57 +02:00
51ee7a6793 refactor: remove mock_semantic_engine from q_nav_graph production code 2026-05-02 22:44:53 +02:00
2f8eebb7e9 fix: stochastic failure in test_autonomous_goals.py 2026-05-02 22:37:34 +02:00
cff7e976e0 fix: Tab Height Guard false-positive on author intent with 'tab' substring
Production bug 2026-05-02 22:19:
Intent 'post author username text (exclude bottom tabs)' contained the
word 'tab' in its parenthetical qualifier. The old check:
    is_tab_intent = 'tab' in intent_lower
matched this intent as a TAB navigation intent, activating the Tab
Height Guard which excluded ALL nodes with center_y < 85% of screen.

This nuked the actual clips_author_username node at y=2012, leaving
only 4 irrelevant items for the VLM → bot stuck in a loop unable to
find the author username.

Fix: Replace substring match with precise regex patterns that only
match real tab navigation intents:
  - 'tap profile tab', 'tap home tab' (tap + word + tab)
  - 'profile tab', 'explore tab' (word + tab)
  - 'tab ...' at start of intent

TDD: Red test added first, reproducing exact production state.
81 perception tests + 172 total tests pass.
2026-05-02 22:28:03 +02:00
4af4ddb060 fix: prevent SessionStateEncoder crash from non-serializable datetime on args
Root cause: bot_flow.py injected configs.args.global_start_time = datetime.now()
which polluted the args namespace. SessionStateEncoder blindly serialized
args.__dict__ via json.dump, which crashed mid-write on the datetime object,
leaving sessions.json truncated/corrupt. Every subsequent restart failed.

Fixes:
- Remove global_start_time from configs.args (only lives on engine class vars)
- Harden SessionStateEncoder with _sanitize_value() to convert any
  non-JSON-serializable type (datetime, timedelta, arbitrary objects) to strings
- Add test_system_session_persistence.py with 4 tests covering the exact
  production crash scenario (datetime injection → json.dumps → round-trip)
- Fix test_engine_timeout.py broken GoalExecutor module reference
2026-05-02 19:57:33 +02:00
f32ee46d8c test: finalize E2E timeout verification and purge global state leaks 2026-05-02 18:59:35 +02:00
9a13216064 test: enforce real VLM execution in explore tab guard and disable fallback hallucination 2026-05-01 23:41:51 +02:00
2e1edec56a fix(perception): 3 production bug regressions from 2026-05-01 run
Bug 1 — VLM Profile Tab Hallucination:
  - VLM confused 'Profile' nav tab with post author username
  - Added Author Tab Guard to filter_navigation_conflicts()
  - Fixed mock LLM to use structural row_feed_photo_profile matching
    instead of hardcoded username (was the test lie)

Bug 2 — Like Button 1-Byte Delta Kill:
  - Toggle actions (like/save) produce 1-byte XML deltas
  - GOAP's MIN_UI_CHANGE_BYTES=50 threshold killed them as 'no change'
  - Split interaction gate: interactions use ANY xml diff, navigations
    keep the 50-byte threshold

Bug 3 — Empty Username Silently Accepted:
  - PostDataExtraction returned 'Post by @' with no warning
  - Added 'username_missing' reliability flag to result dict
  - Downstream consumers can now detect degraded data quality

Cleanup:
  - Removed all debug print() statements from production code
  - Replaced with structured logger.debug() calls
2026-05-01 21:57:56 +02:00
da7201117c fix(tests): purge MagicMock, fix ad fixtures, improve pre-commit E2E fallback
- test_device_connection.py: replace MagicMock with SimpleNamespace to satisfy mock ban
- test_is_ad_substring.py: add feed context markers — is_ad only checks exact labels in feed context
- pre_commit_tests.sh: smart E2E test discovery by module name words, preventing false coverage failures
- conftest.py: fix profile tab visual discovery regex (case-insensitive desc match)
- test_production_bug_regression.py: fix TelepathicEngine singleton poisoning via monkeypatch
2026-05-01 12:09:18 +02:00
392abff313 fix(intent_resolver): add Nav Conflict Guard — Back button never valid for tab intents
PRODUCTION BUG 2026-04-30 11:50:
VLM returned action_bar_button_back (desc='Back') for 'tap profile tab'
intent on OTHER_PROFILE screen. This caused account_switcher to navigate
AWAY from the profile instead of opening the account selector bottom
sheet, halting the session.

Root cause: _visual_discovery pre-filter did not exclude navigation
buttons (Back, Close) when the intent was for a tab element.

Fix:
- Added filter_navigation_conflicts() method to IntentResolver
- Guards tab intents by excluding nodes with 'back' in resource_id
  or content_desc == 'Back'
- Does NOT apply for 'tap back button' or 'press back' intents

TDD:
- RED: test_intent_resolver_back_guard.py — 2 tests that call
  filter_navigation_conflicts on real OTHER_PROFILE XML
- GREEN: filter_navigation_conflicts method + wired into _visual_discovery
- E2E: test_workflow_account_switch.py, test_workflow_vlm_tab_confusion.py

31/31 tests passing.
2026-04-30 12:10:44 +02:00
47f94b699c 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).
2026-04-29 23:05:59 +02:00
ca91ae4b33 feat(perception): autonomous FSD ad marker learning with zero-latency structural persistence 2026-04-29 21:25:03 +02:00
a560225dc9 feat(perception): integrate VLM visual ad detection into resonance vibe check to block obfuscated ads 2026-04-29 21:20:09 +02:00
849fb63426 fix(orchestrator): inject --goal into persona_interests for autonomous resonance evaluation and fix scope shadowing bugs 2026-04-29 19:30:21 +02:00
fc44633ebc fix(physics): prevent infinite alignment loops on Reels and refine intent to avoid follow buttons 2026-04-29 19:05:31 +02:00
0f5b71708d fix(perception): enforce visual Set of Mark by passing device context globally 2026-04-29 18:40:58 +02:00
0ef2840f79 fix(perception): complete bug 5,6,7,8,10 fixes
- Resolved Bug #5: Fixed list vs str parsing in ResonanceEvaluator
- Resolved Bug #6: Use 'should_like' key for vibe score
- Resolved Bug #7: Guard TelepathicEngine against 'Follow' nodes for post media
- Resolved Bug #8: Implemented failed_bounds exclusion loop breaker in PerfectSnapping
- Resolved Bug #10: Corrected available_actions string parsing
- Validated with E2E regression suite (100% green)
2026-04-29 18:26:29 +02:00
068a6a616a fix: purge 4 production bugs — resonance null-guard, POST_DETAIL misclassification, VLM JSON response handling
🔴 RED → 🟢 GREEN for 4 critical bugs found in production run 2026-04-29:

1. ResonanceEvaluator: Add null-guard for evaluate_post_vibe() return.
   When VLM returns truncated JSON, the function returns None. The caller
   now handles this gracefully instead of crashing with AttributeError.

2. ScreenIdentity POST_DETAIL: Replace broken 'and not selected_tab'
   condition with structural differentiator using main_feed_action_bar.
   Posts opened from feed retain feed_tab selected, which was causing
   misclassification as HOME_FEED → LLM fallback → OWN_PROFILE hallucination
   → permanent Qdrant cache poisoning.

3. ActionMemory VLM verification: When VLM returns JSON instead of YES/NO,
   treat as inconclusive (fall through to structural delta) rather than
   hard failure. Only return False when response explicitly contains 'no'.

4 new E2E regression tests, 75/75 pass, zero regressions.
2026-04-29 18:05:32 +02:00
0e43996ccd feat(orchestrator): wire GoalDecomposer into bot_flow.py
Replace the old dual-path orchestrator (abstract goals vs legacy desires)
with unified GoalDecomposer-driven task routing:

1. GoalDecomposer reads mission.strategy + plugins config
2. Generates weighted Task objects (verb, target_screen, budget)
3. GrowthBrain.select_task() picks one probabilistically
4. Selected Task's target_screen routes through existing nav_graph
5. Feed loops + PluginRegistry handle the actual interactions

The abstract goals path (goal_executor.achieve('Nurture community'))
that caused infinite scrolling is now eliminated entirely.

Legacy desire fallback preserved for configs without plugins.

22/22 tests passing.
2026-04-29 17:20:04 +02:00
b6846ab0fe feat(brain): add GrowthBrain.select_task() + kill abstract goals config
- GrowthBrain.select_task() uses weighted random from concrete Task objects
- Removed self.goals from Config (no longer reads goals: from config.yml)
- Mission + plugins are now the SSOT for bot behavior

The bot no longer receives abstract strings like 'Nurture my community' that
the LLM Brain can't operationalize. Instead, the GoalDecomposer generates
Task(browse_feed, HomeFeed, budget=7) which routes to concrete feed loops.

18/18 TDD tests passing.
2026-04-29 17:17:39 +02:00
6db579f45b feat(goals): add GoalDecomposer — pure-logic task planner from mission+plugins
Introduces the GoalDecomposer class that bridges mission.strategy + plugin
capabilities into concrete, weighted Task objects. Each Task has a target
screen, budget, weight, and human-readable intent.

Key design decisions:
- Pure logic, zero LLM/device dependencies
- Strategy weights (aggressive_growth, community_builder, etc.) drive selection
- Plugins declare which screens they operate on (multi-screen map)
- Screens need BOTH an action route AND active plugin to be viable
- Frozen dataclass ensures Task immutability

12/12 TDD tests passing.
2026-04-29 17:15:17 +02:00
0ed12303ac Hardened E2E integrity, purged synthetic mocks, and implemented proactive device discovery. 2026-04-29 15:42:03 +02:00
6abb519e3b refactor(perception): Purge legacy coordinate hacks from feed and telepathic engines 2026-04-29 09:54:02 +02:00