Review and fix Luban one-by-one phone runner
This commit is contained in:
+2
-2
@@ -39,8 +39,8 @@ Import format:
|
||||
|
||||
```text
|
||||
邮箱----密码
|
||||
user1@2925.com----[REDACTED_PASSWORD_1]
|
||||
user2@2925.com----[REDACTED_PASSWORD_2]
|
||||
user1@2925.com----[REDACTED_PASSWORD]
|
||||
user2@2925.com----[REDACTED_PASSWORD]
|
||||
```
|
||||
|
||||
Normalized account fields:
|
||||
|
||||
+1
-1
@@ -285,7 +285,7 @@ BOSS specifically prefers Codex onboarding sub-mailboxes to use **only an 8-lett
|
||||
|
||||
```bash
|
||||
FIVE_SIM_API_KEY=
|
||||
FIVE_SIM_BASE_URL=https://5sim.net/v1
|
||||
[REDACTED]
|
||||
FIVE_SIM_COUNTRY_ORDER=argentina,netherlands,indonesia
|
||||
FIVE_SIM_OPERATOR=any
|
||||
FIVE_SIM_PRODUCT=openai
|
||||
|
||||
+150
@@ -0,0 +1,150 @@
|
||||
# Success-record review and Luban one-by-one runner fixes (2026-05-11)
|
||||
|
||||
## Why this review was needed
|
||||
|
||||
BOSS asked to deeply revisit the known phone-verification success records and compare them with the current Luban flow.
|
||||
|
||||
The immediate trigger was a Luban France event where a code was received but OpenAI stayed on `phone-verification`, followed by a one-by-one test that ended with:
|
||||
|
||||
```json
|
||||
{"bought":4,"sms_received":0,"sms_timeout":2,"submit_no_sms_page":2}
|
||||
```
|
||||
|
||||
The current OpenAI page then showed `糟糕,出错了!` on `https://auth.openai.com/add-phone`.
|
||||
|
||||
## Success records reviewed
|
||||
|
||||
### 1. 5sim Vietnam success, 2026-05-10
|
||||
|
||||
Reference: `openai-phone-free-country-vietnam-sms-success-codex2api-region-block-2026-05-10.md`.
|
||||
|
||||
Key success properties:
|
||||
|
||||
- Strict country/area-code gate before buying and again before submit.
|
||||
- Count only actual provider activations.
|
||||
- If OpenAI reaches `phone-verification`, poll provider.
|
||||
- Submit a strict 6-digit code.
|
||||
- Consider phone success only when OpenAI leaves `phone-verification` and reaches `about-you` / profile.
|
||||
|
||||
### 2. 5sim Indonesia success at 335 activations, 2026-05-11
|
||||
|
||||
Reference: `openai-phone-335-success-cpa-oauth-login-session-pitfalls-2026-05-11.md`.
|
||||
|
||||
Key success properties:
|
||||
|
||||
- OpenAI phone codes should prefer strict 6-digit extraction.
|
||||
- Do not mark provider activation as finished until browser leaves `phone-verification`.
|
||||
- A wrong parser selected a 4-digit candidate from a provider blob; rechecking the finished activation and extracting a 6-digit code fixed it.
|
||||
- After phone success, fill `about-you` fields explicitly (`name`, `age`, `birthday`).
|
||||
|
||||
## Defects found in the current Luban one-by-one flow
|
||||
|
||||
### Defect 1 — submit-code method not identical to successful 5sim method
|
||||
|
||||
The current Luban runner used a generic `setVal` with plain `Event('input')` in one path. The successful 5sim submit used:
|
||||
|
||||
```javascript
|
||||
const input=document.querySelector('input[autocomplete=one-time-code], input[name=code], input');
|
||||
const setter=Object.getOwnPropertyDescriptor(window.HTMLInputElement.prototype,'value').set;
|
||||
input.focus();
|
||||
setter.call(input, code);
|
||||
input.dispatchEvent(new InputEvent('input', {bubbles:true, inputType:'insertText', data:code}));
|
||||
input.dispatchEvent(new Event('change', {bubbles:true}));
|
||||
click exact '继续';
|
||||
```
|
||||
|
||||
Fix: use this exact method for OpenAI phone-code submit.
|
||||
|
||||
### Defect 2 — Bad Request / OpenAI error state was not fatal enough
|
||||
|
||||
The one-by-one run continued country gates after OpenAI became:
|
||||
|
||||
```text
|
||||
title: 糟糕,出错了! - OpenAI
|
||||
url: https://auth.openai.com/add-phone
|
||||
```
|
||||
|
||||
The page had no usable country selector/tel input for later countries, producing repeated false country-gate failures.
|
||||
|
||||
Fix: add `ensure_add_phone_ready()`:
|
||||
|
||||
- require `add-phone` URL, country `select`, and tel input;
|
||||
- reject pages whose title/body match `糟糕|出错|Bad request|unknown_error|HTTP ERROR`;
|
||||
- try reload/direct navigate a few times;
|
||||
- if still not ready, stop the runner before buying another number.
|
||||
|
||||
### Defect 3 — Luban release retry was too shallow
|
||||
|
||||
France `34133707` initially returned:
|
||||
|
||||
```text
|
||||
停用失败,该供应商需要在:118 秒 后停止.
|
||||
停用失败,该供应商需要在:43 秒 后停止.
|
||||
```
|
||||
|
||||
The runner stopped retrying, requiring manual cleanup. Later manual check showed `该号码已释放`.
|
||||
|
||||
Fix: `reject_after_min_wait()` now loops until:
|
||||
|
||||
- `success`, or
|
||||
- `已释放`, or
|
||||
- `wrong_status`, or
|
||||
- hard retry deadline.
|
||||
|
||||
It parses provider messages such as `N 秒 后停止` and sleeps accordingly.
|
||||
|
||||
### Defect 4 — provider/channel ambiguity was under-logged
|
||||
|
||||
The current OpenAI phone page can show WhatsApp delivery text:
|
||||
|
||||
```text
|
||||
重新发送 WhatsApp 消息
|
||||
```
|
||||
|
||||
The runner must log page channel (`whatsapp`, `sms`, `unknown`). If provider reports a code while page says WhatsApp, classify failures as ambiguous until provider raw fields and OpenAI error text are inspected.
|
||||
|
||||
### Defect 5 — `submit_no_sms_page` must not be treated as SMS delivery evidence
|
||||
|
||||
If OpenAI stays on `add-phone` after submit but does not show an explicit phone reject, classify as `submit_no_sms_page`, hold for the minimum Luban release window, release, then recover page. Do not count it as `phone-verification` SMS timeout.
|
||||
|
||||
## Implemented optimized runner
|
||||
|
||||
New script:
|
||||
|
||||
```text
|
||||
scripts/luban_one_by_one_phone_verify.py
|
||||
```
|
||||
|
||||
Key behavior:
|
||||
|
||||
1. Buys only one Luban request at a time.
|
||||
2. Validates OpenAI `add-phone` readiness before each country and before buying.
|
||||
3. Stops instead of buying when the page is in Bad Request/error state.
|
||||
4. Holds unused Luban orders for at least 3 minutes before reject.
|
||||
5. Retries reject until success/already-released/wrong_status or hard deadline.
|
||||
6. Polls provider for strict 6-digit code.
|
||||
7. On SMS received, writes the code only to a local file and logs `sms_received` without printing it.
|
||||
8. Submits code with the proven 5sim InputEvent method.
|
||||
9. If submit fails, keeps page and provider order for retry and exits with `sms_submit_failed_hold_for_retry`.
|
||||
10. Does not set success unless OpenAI leaves `/phone-verification`.
|
||||
|
||||
Run example:
|
||||
|
||||
```bash
|
||||
PYTHONUNBUFFERED=1 MAX_BUYS=10 PHONE_POLL_SECONDS=220 MIN_HOLD_SECONDS=180 \
|
||||
/Users/chick/homebrew/opt/python@3.11/bin/python3.11 \
|
||||
/Users/chick/.hermes/skills/software-development/codex-oauth-plus-onboarding/scripts/luban_one_by_one_phone_verify.py \
|
||||
| tee /tmp/luban_one_by_one_phone_verify.log
|
||||
```
|
||||
|
||||
Optional priority override:
|
||||
|
||||
```bash
|
||||
LUBAN_COUNTRY_PRIORITY='France,Vietnam,Portugal,Romania,Germany,Netherlands,Argentina'
|
||||
```
|
||||
|
||||
## Operational rule going forward
|
||||
|
||||
For Luban/OpenAI tests, use the optimized script above instead of ad-hoc `/tmp/luban_one_by_one_stop_on_sms.py`.
|
||||
|
||||
If the runner exits with `sms_submit_failed_hold_for_retry`, do not release the order and do not navigate away. Retry from the preserved page using the local code file and corrected submit helper.
|
||||
+84
@@ -0,0 +1,84 @@
|
||||
# Luban one-by-one stop-on-SMS runner and 2026-05-11 retest
|
||||
|
||||
## Why this was added
|
||||
|
||||
BOSS asked to retry Luban SMS verification one order at a time:
|
||||
|
||||
- buy only one active Luban order at once;
|
||||
- if `sms_received` occurs, notify immediately;
|
||||
- submit the code with the proven OpenAI phone-code `InputEvent` method;
|
||||
- if submission fails again, keep the OpenAI `phone-verification` page and do **not** release/navigate away/waste the number before manual retry.
|
||||
|
||||
This produced a reusable runner:
|
||||
|
||||
```text
|
||||
scripts/luban_one_by_one_stop_on_sms.py
|
||||
```
|
||||
|
||||
## Runner behavior
|
||||
|
||||
Run example:
|
||||
|
||||
```bash
|
||||
PYTHONUNBUFFERED=1 MAX_BUYS=10 PHONE_POLL_SECONDS=220 MIN_HOLD_SECONDS=180 \
|
||||
/Users/chick/homebrew/opt/python@3.11/bin/python3.11 \
|
||||
/Users/chick/.hermes/skills/software-development/codex-oauth-plus-onboarding/scripts/luban_one_by_one_stop_on_sms.py \
|
||||
| tee /tmp/luban_one_by_one_stop_on_sms.log
|
||||
```
|
||||
|
||||
Important behavior:
|
||||
|
||||
1. Resolves Luban OpenAI/ChatGPT services dynamically.
|
||||
2. Prioritizes France first because a previous run received a France code.
|
||||
3. Verifies OpenAI country gate before buying.
|
||||
4. Holds failed/timeout/submit-no-SMS-page orders for at least `MIN_HOLD_SECONDS` before release.
|
||||
5. Retries Luban `reject` when provider returns messages like `停用失败,该供应商需要在:N 秒 后停止`.
|
||||
6. Stops immediately when a code is received.
|
||||
7. Uses the corrected OpenAI code submit method:
|
||||
- `input[autocomplete="one-time-code"], input[name="code"], input`
|
||||
- native `HTMLInputElement.value` setter
|
||||
- `InputEvent('input', {inputType:'insertText', data:code})`
|
||||
- `change`
|
||||
- exact `继续` click first
|
||||
8. If code submit does not leave `/phone-verification`, logs `sms_submit_failed_hold_for_retry` and stops without releasing or navigating.
|
||||
9. Never prints full phone numbers or SMS code. Code is only written to `/tmp/luban_one_by_one_sms_code.txt`.
|
||||
|
||||
## 2026-05-11 run result
|
||||
|
||||
Command used from `/tmp` copy:
|
||||
|
||||
```text
|
||||
MAX_BUYS=10 PHONE_POLL_SECONDS=220 MIN_HOLD_SECONDS=180
|
||||
```
|
||||
|
||||
Summary:
|
||||
|
||||
```json
|
||||
{
|
||||
"bought": 4,
|
||||
"direct_reject": 0,
|
||||
"sms_timeout": 2,
|
||||
"sms_received": 0,
|
||||
"sms_submit_failed": 0,
|
||||
"success": false,
|
||||
"submit_no_sms_page": 2
|
||||
}
|
||||
```
|
||||
|
||||
Orders:
|
||||
|
||||
| Country | request_id | Result | Release |
|
||||
|---|---:|---|---|
|
||||
| France | 34133707 | `submit_no_sms_page`; stayed on `add-phone` without explicit reject | later confirmed `该号码已释放` |
|
||||
| Germany | 34133807 | reached `phone-verification`, page channel `whatsapp`, Luban `msg=wait` for ~220s | retry release success |
|
||||
| Netherlands | 34133909 | reached `phone-verification`, page channel `whatsapp`, Luban `msg=wait` for ~220s | release success |
|
||||
| Argentina | 34133959 | `submit_no_sms_page`; stayed on `add-phone` | release success |
|
||||
|
||||
No SMS code arrived in this retest, so the corrected code-submit path was not exercised.
|
||||
|
||||
## Pitfalls learned
|
||||
|
||||
- `submit_no_sms_page` is possible without explicit OpenAI rejection. Treat it as neither direct reject nor SMS-page no-delivery. Hold and release the order, then navigate/recover `add-phone` before continuing.
|
||||
- Some Luban suppliers require longer than exactly 180 seconds to reject. Parse the provider wait message and retry until success/known released, instead of only retrying once.
|
||||
- Repeated phone attempts can leave OpenAI `add-phone` in `糟糕,出错了!` state; do not buy another number until the page is reloaded/recovered and the country controls work.
|
||||
- `countryValue:null`/`countryText:null` after an error page means the selector is absent; this is a page-state failure, not a country unsupported result.
|
||||
+129
@@ -0,0 +1,129 @@
|
||||
# Luban unrestricted OpenAI phone test: 10 actual buys (2026-05-11)
|
||||
|
||||
## Context
|
||||
|
||||
Account under test:
|
||||
|
||||
```text
|
||||
2925 account: chickliu2031@2925.com
|
||||
OpenAI alias: chickliu2031som6d8@2925.com
|
||||
Email verification: passed
|
||||
OpenAI page before test: https://auth.openai.com/add-phone
|
||||
SMS provider: Luban SMS
|
||||
Run policy: unrestricted countries, at most 2 buys per country, 10 actual bought numbers total
|
||||
Minimum hold before release: >= 3 minutes per Luban order
|
||||
```
|
||||
|
||||
Secrets, full phone numbers, SMS/email codes, API keys, and proxy strings are omitted.
|
||||
|
||||
## Command
|
||||
|
||||
```bash
|
||||
PYTHONUNBUFFERED=1 TOTAL_BUYS=10 MAX_PER_COUNTRY=2 PHONE_POLL_SECONDS=190 \
|
||||
/Users/chick/homebrew/opt/python@3.11/bin/python3.11 \
|
||||
/tmp/luban_free_country_2031_10.py \
|
||||
| tee /tmp/luban_free_country_2031_10.log
|
||||
```
|
||||
|
||||
## Candidate ordering used
|
||||
|
||||
The runner dynamically resolved Luban OpenAI/ChatGPT services and put previously poor UK/Chile services near the end. Initial candidate list included:
|
||||
|
||||
```text
|
||||
Brazil service_id=508059 cost=0.05
|
||||
Philippines service_id=507996 cost=0.05
|
||||
Argentina service_id=508043 cost=0.1
|
||||
Indonesia service_id=508001 cost=0.1
|
||||
Portugal service_id=788870 cost=0.1
|
||||
Vietnam service_id=1045467 cost=0.1
|
||||
Canada service_id=788953 cost=0.15
|
||||
Netherlands service_id=508051 cost=0.15
|
||||
Thailand service_id=508044 cost=0.15
|
||||
Malaysia service_id=508068 cost=0.2
|
||||
Mexico service_id=731456 cost=0.25
|
||||
France service_id=735664 cost=0.3
|
||||
Germany service_id=741829 cost=0.43
|
||||
USA service_id=715285 cost=0.28
|
||||
Chile service_id=508058 cost=0.05
|
||||
UK/England service_id=537935 cost=0.05
|
||||
```
|
||||
|
||||
## Final summary
|
||||
|
||||
Raw runner summary:
|
||||
|
||||
```json
|
||||
{
|
||||
"bought": 10,
|
||||
"attempts": 13,
|
||||
"rejected_by_openai": 7,
|
||||
"sms_timeout": 2,
|
||||
"sms_received": 1,
|
||||
"submit_no_sms_page": 0,
|
||||
"success": false,
|
||||
"counts": {
|
||||
"Brazil": 2,
|
||||
"Philippines": 1,
|
||||
"Argentina": 1,
|
||||
"Indonesia": 1,
|
||||
"Vietnam": 1,
|
||||
"Netherlands": 1,
|
||||
"Malaysia": 1,
|
||||
"Mexico": 1,
|
||||
"France": 1
|
||||
},
|
||||
"success_request_id": 34133204,
|
||||
"success_country": "France",
|
||||
"final_href": "https://auth.openai.com/phone-verification"
|
||||
}
|
||||
```
|
||||
|
||||
Important correction: the runner's `success_request_id` field is misleading here. The France SMS arrived, but code submission left OpenAI on `phone-verification`, so the correct classification is:
|
||||
|
||||
```text
|
||||
sms_received=1
|
||||
sms_submit_failed=1
|
||||
phone_verification_success=false
|
||||
```
|
||||
|
||||
## Per-country outcome
|
||||
|
||||
```text
|
||||
Brazil #1: bought, OpenAI immediate reject, released OK.
|
||||
Philippines: bought, OpenAI immediate reject, released OK.
|
||||
Argentina: bought, OpenAI immediate reject, released OK.
|
||||
Indonesia: bought, OpenAI immediate reject, released OK.
|
||||
Portugal: buy failed, supplier maintenance; not counted as a bought number.
|
||||
Vietnam: bought, OpenAI immediate reject, released OK.
|
||||
Canada: buy failed, supplier maintenance; not counted as a bought number.
|
||||
Netherlands: bought, OpenAI immediate reject, released OK.
|
||||
Thailand: buy failed, supplier maintenance; not counted as a bought number.
|
||||
Malaysia: bought, OpenAI immediate reject, released OK.
|
||||
Mexico: bought, OpenAI entered phone-verification, no SMS after ~202s. First release attempts returned supplier wait messages, later manual recheck showed wrong_status/already released.
|
||||
France: bought, OpenAI entered phone-verification, SMS arrived in ~11s, but code submission failed / page stayed on phone-verification. Later manual status check showed getSms success and reject returned already released.
|
||||
Brazil #2: bought, OpenAI entered phone-verification, no SMS after ~193s, released OK.
|
||||
```
|
||||
|
||||
## Operational conclusions
|
||||
|
||||
1. Luban unrestricted had one useful signal: **France service_id=735664 delivered an SMS quickly**, unlike UK/Mexico/Brazil no-delivery cases.
|
||||
2. Delivery alone is not success. The runner must verify OpenAI leaves `phone-verification` after submitting the SMS code before marking success.
|
||||
3. If `sms_received` but page remains `phone-verification`, classify `sms_submit_failed` and stop/diagnose the code extraction or page input method; do not continue spending while leaving the account on a possibly code-locked phone page.
|
||||
4. Release handling must cover all post-submit paths:
|
||||
- immediate reject -> hold >=3 minutes -> reject;
|
||||
- SMS timeout -> reject, and if Luban says supplier still needs time, schedule another retry until `success`, `wrong_status`, or `already released`;
|
||||
- SMS received but code not accepted -> check status/release or confirm provider already closed the request.
|
||||
5. Do not write `success_request_id` unless OpenAI actually leaves `phone-verification` and the account advances.
|
||||
|
||||
## Runner patch requirements
|
||||
|
||||
Before reusing `/tmp/luban_free_country_2031_10.py` logic as a bundled script:
|
||||
|
||||
```text
|
||||
- Rename success_request_id to candidate_sms_request_id unless browser success is true.
|
||||
- Add sms_submit_failed counter.
|
||||
- After submit_code(), inspect body for “代码不正确” / “incorrect code” / still-on-phone-verification and classify failure.
|
||||
- If code submission fails, do not continue to the next country until the current request is released/closed and OpenAI page is deliberately reset to add-phone.
|
||||
- Keep 3-minute minimum hold before release for Luban provider orders.
|
||||
- Treat Luban reject responses containing supplier wait seconds as deferred-release, and recheck/retry until closed.
|
||||
```
|
||||
+102
@@ -0,0 +1,102 @@
|
||||
# OpenAI phone-code submit method audit: Luban France SMS received but submit failed (2026-05-11)
|
||||
|
||||
## Context
|
||||
|
||||
During Luban free-country testing with `chickliu2031som6d8@2925.com`, France request `34133204` received a code but the runner stayed on OpenAI `phone-verification` after submitting it.
|
||||
|
||||
Do not classify that event as a completed phone verification. The correct class is:
|
||||
|
||||
```text
|
||||
sms_received_but_submit_failed
|
||||
```
|
||||
|
||||
## DOM observed on OpenAI phone-verification
|
||||
|
||||
Inspection of the current OpenAI phone verification page showed a single code input, not six split inputs:
|
||||
|
||||
```json
|
||||
{
|
||||
"href": "https://auth.openai.com/phone-verification",
|
||||
"title": "查看你的手机 - OpenAI",
|
||||
"input": {
|
||||
"type": "text",
|
||||
"name": "code",
|
||||
"autocomplete": "one-time-code",
|
||||
"inputMode": "numeric",
|
||||
"maxLength": 6,
|
||||
"placeholder": "代码"
|
||||
},
|
||||
"buttons": ["继续", "重新发送 WhatsApp 消息"]
|
||||
}
|
||||
```
|
||||
|
||||
So the correct target is:
|
||||
|
||||
```javascript
|
||||
input[autocomplete="one-time-code"], input[name="code"], input
|
||||
```
|
||||
|
||||
## Difference from the previously successful 5sim Vietnam submit
|
||||
|
||||
The successful 5sim Vietnam part2 runner submitted the phone code with:
|
||||
|
||||
```javascript
|
||||
const input=document.querySelector('input[autocomplete=one-time-code], input[name=code], input');
|
||||
const setter=Object.getOwnPropertyDescriptor(window.HTMLInputElement.prototype,'value').set;
|
||||
input.focus();
|
||||
setter.call(input, code);
|
||||
input.dispatchEvent(new InputEvent('input', {bubbles:true, inputType:'insertText', data:code}));
|
||||
input.dispatchEvent(new Event('change', {bubbles:true}));
|
||||
[...document.querySelectorAll('button')].find(b=>(b.innerText||'').trim()==='继续')?.click();
|
||||
```
|
||||
|
||||
The Luban free-country runner used a generic `setVal` helper with plain `Event('input')` instead of `InputEvent('input', {inputType:'insertText', data:code})`:
|
||||
|
||||
```javascript
|
||||
setVal(inputs[0], code); // dispatches Event('input') + Event('change')
|
||||
```
|
||||
|
||||
That may fail to update OpenAI's React/form state even when the DOM value looks set.
|
||||
|
||||
## Required fix
|
||||
|
||||
For phone-code submission, use the proven 5sim method exactly:
|
||||
|
||||
1. Select `input[autocomplete="one-time-code"], input[name="code"], input`.
|
||||
2. Use the native HTMLInputElement `value` setter.
|
||||
3. Dispatch `InputEvent('input', {bubbles:true, inputType:'insertText', data:code})`.
|
||||
4. Dispatch `change`.
|
||||
5. Verify `input.value.length === 6` and the Continue button is not disabled.
|
||||
6. Click the exact Chinese `继续` button first, then fallback to English/regex.
|
||||
7. Save a redacted submit context: input count/name/autocomplete/maxLength, button disabled state, post-submit href/title/body excerpt. Never log the code.
|
||||
|
||||
A reusable helper is packaged with this skill:
|
||||
|
||||
```text
|
||||
scripts/submit_openai_phone_code_corrected.py
|
||||
```
|
||||
|
||||
It accepts a code or code-file path, submits using the proven method, and redacts the code from output.
|
||||
|
||||
## Extra channel warning
|
||||
|
||||
The current phone verification page displayed:
|
||||
|
||||
```text
|
||||
输入我们刚刚通过 WhatsApp 发送到 ... 的验证码。
|
||||
重新发送 WhatsApp 消息
|
||||
```
|
||||
|
||||
The runner must record the delivery channel text. If the page channel is WhatsApp but the SMS provider reports an SMS-style code, treat failures as ambiguous until the raw provider fields are inspected. Do not auto-mark as success unless OpenAI leaves `/phone-verification`.
|
||||
|
||||
## Runner classification fix
|
||||
|
||||
After `sms_received`, if submitting the code leaves OpenAI on `/phone-verification`, classify as:
|
||||
|
||||
```text
|
||||
sms_submit_failed
|
||||
```
|
||||
|
||||
not `success_request_id`.
|
||||
|
||||
Also release/finish the provider order explicitly according to provider rules and log the result.
|
||||
+102
@@ -0,0 +1,102 @@
|
||||
# Session review: 2925 + Luban OpenAI onboarding lessons (2026-05-11)
|
||||
|
||||
## Why this reference exists
|
||||
|
||||
BOSS asked to actively review the conversation and update the skill library. This session produced several reusable lessons for the broader `codex-oauth-plus-onboarding` workflow, and they belong under the existing umbrella skill rather than as narrow one-off skills.
|
||||
|
||||
## Class-level lessons captured
|
||||
|
||||
### 1. 2925 Webmail false negatives are a scraper problem until proven otherwise
|
||||
|
||||
A manual user check found OpenAI verification mail in 2925 Inbox even though automation reported `candidateCount=0` for multiple resend cycles. The root cause was route-based scraping:
|
||||
|
||||
```text
|
||||
Wrong: https://2925.com/#/mailList?type=收件箱
|
||||
Right: click the left-side 收件箱 nav, then inspect the real list at #/mailList
|
||||
```
|
||||
|
||||
Reusable rule: before concluding OpenAI did not deliver to a 2925 alias, verify the scraper uses the real DOM flow:
|
||||
|
||||
```text
|
||||
click left 收件箱 -> toolbar 刷新 -> table.maillist-table tr -> hidden tooltip/title/textContent -> open newest matching row -> extract code from message body
|
||||
```
|
||||
|
||||
Detailed reference: `references/mail2925-correct-inbox-scraping-openai-code-2026-05-11.md`.
|
||||
|
||||
### 2. SMS-provider tests must separate OpenAI acceptance from SMS delivery
|
||||
|
||||
Luban UK demonstrated a useful distinction:
|
||||
|
||||
```text
|
||||
OpenAI acceptance: attempts 1-9 reached phone-verification and were not rejected.
|
||||
SMS delivery: 0/10 messages arrived after ~190s each.
|
||||
```
|
||||
|
||||
Do not collapse these into a single “failed” label; report both dimensions. Attempt 10 stayed on `add-phone`, so it must be classified as `submit_no_sms_page`, not as a confirmed no-SMS phone-verification attempt.
|
||||
|
||||
Detailed reference: `references/luban-uk-openai-10-attempts-no-sms-2026-05-11.md`.
|
||||
|
||||
### 3. Luban release timing is provider-specific
|
||||
|
||||
BOSS explicitly corrected the release cadence: for real SMS-delivery testing, hold each Luban order at least 3 minutes before releasing. Immediate or too-early release can return provider errors like:
|
||||
|
||||
```text
|
||||
停用失败,该供应商需要在两分钟后停止.
|
||||
```
|
||||
|
||||
Reusable rule: calculate release eligibility from the purchase timestamp, not from the last poll timestamp.
|
||||
|
||||
### 4. Country samples should be documented with service_id and result class
|
||||
|
||||
Luban country/service results are not interchangeable:
|
||||
|
||||
```text
|
||||
UK / service_id=537935: OpenAI usually accepted, SMS did not arrive in 10 attempts.
|
||||
Chile / service_id=508058: first attempt was immediately rejected by OpenAI.
|
||||
```
|
||||
|
||||
This helps future runs avoid repeating low-yield country/provider combinations without explicit BOSS approval.
|
||||
|
||||
Detailed reference: `references/luban-chile-openai-immediate-reject-2026-05-11.md`.
|
||||
|
||||
### 5. After background process completion, always process the result visibly
|
||||
|
||||
A prior tool turn ended with an empty response after writing a script. BOSS explicitly asked to process tool results and continue. The skill already contains the rule to always return a visible status after tool-driven steps; this session reinforces that it is not optional.
|
||||
|
||||
## Current skill-library state after this session
|
||||
|
||||
Updated umbrella:
|
||||
|
||||
```text
|
||||
codex-oauth-plus-onboarding
|
||||
```
|
||||
|
||||
New/updated references:
|
||||
|
||||
```text
|
||||
references/mail2925-correct-inbox-scraping-openai-code-2026-05-11.md
|
||||
references/luban-uk-openai-10-attempts-no-sms-2026-05-11.md
|
||||
references/luban-chile-openai-immediate-reject-2026-05-11.md
|
||||
```
|
||||
|
||||
Gitea sync verified at commit:
|
||||
|
||||
```text
|
||||
c29567eda6e1619401d2ccdbc937e7534c35940e
|
||||
```
|
||||
|
||||
## Future action pattern
|
||||
|
||||
For new OpenAI/Codex onboarding runs using 2925 + Luban:
|
||||
|
||||
1. Load this umbrella skill first.
|
||||
2. Prefer the corrected 2925 scraper flow before declaring email non-delivery.
|
||||
3. For Luban, resolve service_id dynamically and log country/provider/service_id/cost.
|
||||
4. Hold Luban orders at least 3 minutes when testing delivery.
|
||||
5. Classify outcomes precisely:
|
||||
- `rejected_by_openai`
|
||||
- `phone_verification_no_sms`
|
||||
- `submit_no_sms_page`
|
||||
- `sms_received_but_code_rejected`
|
||||
- `phone_verified`
|
||||
6. Write a concise reference and sync Gitea after non-trivial provider/country tests.
|
||||
Reference in New Issue
Block a user