# Free-country OpenAI phone-verification runner notes (2026-05-10) ## Trigger BOSS asked to stop constraining the country list and let the runner choose countries freely: ```text No fixed region restriction. Each country at most 2 attempts. Total 20 attempts. Try to find whether any country succeeds. ``` ## Policy learned For broad country exploration, count only **real 5sim activations** toward the global budget: ```text real activation = 5sim buy returns an activation id and phone number ``` Do **not** count these as phone attempts: - OpenAI country-gate/CDP failures before buying. - 5sim `no free phones` / non-JSON buy responses. - Unsupported country mappings. - OAuth recovery failures before `add-phone`. This prevents the global budget from being consumed by inventory misses or UI/CDP glitches. ## Country scheduling Use a broad candidate list of OpenAI-supported countries, with a per-country cap: ```text for country in candidate_order: try up to 2 real activations for this country skip/no-count if no inventory move to next country repeat/cycle if needed until global real-activation budget is met ``` Keep the same hard gates as the stricter regional runners: 1. Recover/verify page is usable `https://auth.openai.com/add-phone`. 2. Before buying, set and read back OpenAI country selector: - `select.value == target ISO` - visible text equals expected country and dial prefix, e.g. `越南 (+84)`. 3. After buying, re-check country before entering the phone number. 4. If gate fails after buying, cancel the activation immediately. 5. Probe resend channel before clicking; if WhatsApp, cancel the SMS activation rather than clicking WhatsApp resend. ## 5sim API quirks The authenticated/guest prices endpoints may return 403 in this environment: ```text GET https://5sim.net/v1/guest/prices?product=openai -> 403 GET https://5sim.net/v1/user/prices?product=openai -> 403 ``` When prices are unavailable, use controlled `buy activation` probes and classify inventory misses. 5sim buy endpoints can return HTTP 200 `text/plain` instead of JSON: ```text status=200 content-type=text/plain; charset=utf-8 body='no free phones' ``` Treat this as: ```json {"phase":"buy_failed_not_counted","reason":"no_free_phones"} ``` No activation was created, so no cancellation is needed and it must not count toward the global real-attempt total. ## Candidate-country runner shape The session generated a broad runner: ```text /tmp/phone_verify_free_country_2each_total20.py ``` Initial candidate list included Southeast Asia, Latin America, Africa, Europe, and South Asia. The first inventory checks showed: ```text Philippines: no free phones Malaysia: no free phones Thailand: no free phones Vietnam: bought activation successfully and proceeded to OpenAI polling ``` Persisted script copies should avoid secrets and should keep the candidate map as data near the top of the script so new countries can be added safely. ## Pitfalls - Do not rely on `FIVE_SIM_COUNTRY_ORDER` when BOSS explicitly asks for free-country exploration; the runner should ignore stale env country order or log its effective order clearly. - Do not let `no free phones` consume the per-country or global real-activation budget. - Keep the visible country/ISO gate even in exploration mode; the country list is larger, so selector mismatches are more likely. - If a broad run is still active in the background, record only the stable runner policy and early observations; write final outcome only after process completion and order cleanup verification.