# Strict OpenAI phone country/area-code gate (2026-05-10) ## Trigger Use this note for any OpenAI `auth.openai.com/add-phone` automation that buys and submits 5sim phone numbers. ## Bug that caused this rule During a 1085 + Indonesia test, the browser page had silently reverted to the United States selector (`美国 (+1)`) while the agent bought an Indonesia `+62` number. The number was submitted as a US local number, and OpenAI moved to `phone-verification` showing it had sent to a `+1 (...)` number. That attempt was invalid and the 5sim order was canceled. ## Mandatory rule Never rely on the intended country in the script. Before buying, after filling, and immediately before clicking Continue, verify BOTH: 1. Native select value equals the intended ISO country code. 2. Visible country button text contains the intended country and dialing code. Examples: | Country | ISO | Visible text | | --- | --- | --- | | Argentina | `AR` | `阿根廷 (+54)` | | Netherlands | `NL` | `荷兰 (+31)` | | Indonesia | `ID` | `印度尼西亚 (+62)` | If either check fails: - Do not click Continue. - If a 5sim order was already bought, cancel it immediately. - Reset the country selector and re-check before retrying. - Exclude the invalid attempt from country/provider result statistics. ## Reliable country setting React Aria click/pointer events are unreliable. Use the hidden/native select directly: ```js const sel = document.querySelector('select'); sel.focus(); sel.value = 'ID'; // AR, NL, ID, etc. sel.dispatchEvent(new Event('input', { bubbles: true })); sel.dispatchEvent(new Event('change', { bubbles: true })); await new Promise(r => setTimeout(r, 800)); ``` ## Gate function ```js function visibleCountryText() { return [...document.querySelectorAll('button')] .map(b => b.innerText) .find(t => /\(\+\d+\)/.test(t)); } function assertCountryGate(iso, visible) { const selectValue = document.querySelector('select')?.value; const country = visibleCountryText(); if (selectValue !== iso || country !== visible) { throw new Error(`country_gate_failed: select=${selectValue} visible=${country}`); } } ``` ## Correct runner behavior 1. Restore or open `add-phone`. 2. Set country via native select. 3. Run `assertCountryGate()`. 4. Only then buy a 5sim activation. 5. Fill the local part of the phone number. 6. Run `assertCountryGate()` again. 7. Click Continue. 8. Read the result: - direct rejection (`无法向此电话号码发送验证码` / `电话号码无效`) -> cancel and rotate; - accepted/waiting -> poll 5sim, click resend once, poll again, then cancel/rotate if still no SMS. ## Replacement limit For the current configured test, BOSS requested 10 replacements: ```text PHONE_VERIFICATION_REPLACEMENT_LIMIT=10 ``` Keep using configured country order first: ```text FIVE_SIM_COUNTRY_ORDER=argentina,netherlands,indonesia ```