Root cause: ffmpeg is absent in the prod worker, so vinpin.ocr cropScale silently returns the full 1600x900 frame — the tiny centered Rpartstore launch-error modal is illegible, so a DOWN Rpartstore is misread as a spinner and thrashes the seat. - Dockerfile: install ffmpeg so cropScale actually crops+3x-upscales (restores all clipped OCR: modal-crop error detect, Fiat modal, Renault header). - ensureRpartstore: gate the "already open" short-circuit on a CONTENT token (rpartstoreLoaded), not rpartstoreOpen which false-matches the flyout/title word "Rpartstore"; click the flyout entry when the submenu is up over the grid; keep a late open-window branch so a spinner/vehicle-page window still counts as present. - closeRpartstoreTab: never click windowClose(1298,14) (it hits the language selector and wedges the grid); gate the retry on a content token; Escape after. - cleanTeardown: dismiss any blocking modal BEFORE "Çıkış yap" so logout is a clean RDS log-off (not a dirty channel disconnect); recover a Disconnected dialog via disconnectedClose(953,505) + relaunch VINPIN app for a fresh grid. - Rpartstore-down cooldown (10m): a launch-error / repeated load-failure routes Renault decodes straight to Dialogys (skip reopening a down catalog); a confirmed load clears it. - ensureBrandGrid: dismiss a wedging launch-error modal + short-retry instead of burning the 84s dead-wait. - parseRenaultHeader: ignore the status-bar license-expiry date when reading the model year; sessionAlive matches RDST01/RDST02 (seat load-balances). - Keeps never-throw, VINPIN_DECODE_BUDGET_MS, sessionPoisoned, the acquire cap, spinner-guard, relogin-cap and the Fiat/Dialogys fallbacks intact. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
3.6 KiB
3.6 KiB