{"record":{"id":"ec9a9e98fa1a7423","repo":"CloakHQ/CloakBrowser","slug":"pro-binary-unavailable-e-your-license-is-valid","errorCode":null,"errorMessage":"Pro binary unavailable: {e}. Your license is valid but the Pro binary could not be downloaded right now. Retry in a moment. To use the free binary instead, unset CLOAKBROWSER_LICENSE_KEY.","messagePattern":"Pro binary unavailable: (.+?)\\. Your license is valid but the Pro binary could not be downloaded right now\\. Retry in a moment\\. To use the free binary instead, unset CLOAKBROWSER_LICENSE_KEY\\.","errorType":"exception","errorClass":"RuntimeError","httpStatus":null,"severity":"error","filePath":"cloakbrowser/download.py","lineNumber":232,"sourceCode":"                requested_version = None\n            # A valid license is entitled to Pro, so Pro failures surface loudly\n            # rather than silently substituting the older free binary. (A blip\n            # during a routine update never reaches here: _ensure_pro_binary\n            # returns the cached Pro binary and updates in the background.)\n            try:\n                return _ensure_pro_binary(\n                    key,\n                    requested_version=requested_version,\n                    plan=info.plan,\n                    release_channel=release_channel,\n                )\n            except BinaryVerificationError:\n                # Authenticity could not be confirmed — surface verbatim.\n                raise\n            except Exception as e:\n                # Transient failure with no cached Pro binary to use — surface a\n                # clear error rather than silently downloading the free binary.\n                raise RuntimeError(\n                    f\"Pro binary unavailable: {e}. Your license is valid but the \"\n                    f\"Pro binary could not be downloaded right now. Retry in a \"\n                    f\"moment. To use the free binary instead, unset \"\n                    f\"CLOAKBROWSER_LICENSE_KEY.\"\n                ) from e\n        elif info:\n            # Key supplied but rejected — abort, never downgrade to free.\n            raise CloakBrowserLicenseError(\n                f\"CloakBrowser Pro: license key is invalid or expired \"\n                f\"(plan={info.plan}). Check CLOAKBROWSER_LICENSE_KEY, or unset it \"\n                f\"to use the free binary.\"\n            )\n        else:\n            # Key supplied but unvalidatable (server down, no cache) — abort.\n            raise CloakBrowserLicenseError(\n                \"CloakBrowser Pro: license could not be validated (server \"\n                \"unreachable and no cached validation). Retry in a moment, or \"\n                \"unset CLOAKBROWSER_LICENSE_KEY to use the free binary.\"","sourceCodeStart":214,"sourceCodeEnd":250,"githubUrl":"https://github.com/CloakHQ/CloakBrowser/blob/d6bad5de261bedf025280ace1d14e800aee13923/cloakbrowser/download.py#L214-L250","documentation":"With a valid Pro license, if downloading the Pro binary fails transiently (network/HTTP error) and no cached Pro binary exists, ensure_binary raises RuntimeError instead of silently downgrading to the free binary.","triggerScenarios":"CLOAKBROWSER_LICENSE_KEY set and validated, Pro download endpoint unreachable/erroring, no previously cached Pro build on disk; occurs in ensure_binary (launch, install).","commonSituations":"Server outage, flaky network, corporate firewall blocking the Pro CDN, first run on a new machine during an outage.","solutions":["Retry after a moment","Check network/firewall access to the Pro download endpoint","If Pro isn't required, unset CLOAKBROWSER_LICENSE_KEY to use the free binary"],"exampleFix":"# before/after shell\nexport CLOAKBROWSER_LICENSE_KEY=...  # fails during outage\nunset CLOAKBROWSER_LICENSE_KEY         # free binary fallback","handlingStrategy":"retry","validationCode":null,"typeGuard":null,"tryCatchPattern":"for attempt in range(3):\n    try:\n        path = ensure_binary()\n        break\n    except RuntimeError as e:\n        if \"Pro binary unavailable\" in str(e) and attempt < 2:\n            time.sleep(2 ** attempt); continue\n        raise","preventionTips":["Run install once during CI image build to pre-cache the Pro binary","Monitor the download endpoint's availability for flakiness"],"tags":["pro-license","download","network","transient"],"backgroundTag":"binary-download-failed","analyzedSha":"d6bad5de261bedf025280ace1d14e800aee13923","analyzedAt":"2026-08-28T14:13:12.918Z","schemaVersion":2},"datasetVersion":"2026-08-28T16:17:29.566Z"}