Removed the whole fetchAdDetails opt-in. Deleted from
.actor/input_schema.json, src/models.py's ActorInput,
README.md (input table, example input/output, How-to-use step 5,
FAQ entry), promo.json (sample input, differentiators, video hook),
.actor/actor.json/scaffold.json descriptions, and
.actor/dataset_schema.json. Dropped the 3 fields it populated
(external_url/call_to_action/advertising_objective) from
src/models.py's ResultRow, src/parser.py's map_row (and
deleted parser.merge_ad_details entirely), and the dataset schema.
Removed the implementation: bootstrap.mint_details_token,
bootstrap._capture_details_request,
, client.fetch_ad_details, and main.py's
_enrich_rows/_log_enrichment_outcome/_mint_details_for_page.
_with_token_refresh (REQ-11) is now /search-token-only — it lost
its ad_id parameter and the details-mint branch of
_remint_after_expiry (which is also deleted; the one remaining
branch was folded inline). An Actor that ships fewer fields honestly
is publishable; one that advertises 3 fields and returns null on
every row is not.
Item 1 (loud-failure gap on 100%-enrichment-failure) is now MOOT.
The dispatching brief flagged that _log_enrichment_outcome (from
commit c21e6b05) degraded a total enrichment failure to a WARNING/
ERROR log line without failing the run or surfacing it in the
dataset. Since the entire enrichment path no longer exists, there is
nothing left to make loud — explicitly not skipped, just moot.
Item 2 — pinned the proxy exit country (fixed, verified).
bootstrap.py launches Camoufox with a fixed locale="en-US", but
the shipped proxyConfiguration default carried no
apifyProxyCountry — a geo-random RESIDENTIAL exit against a
static locale is exactly the fingerprint mismatch
reference-pin-proxy-country warns can park a session on an
interstitial indefinitely. Added "apifyProxyCountry": "US" to the
default/prefill in .actor/input_schema.json,
src/models.py's ActorInput.proxy_configuration default, and
tests/fixtures/input.qa.json — matching, never geoip=True
(that sweeps third-party IP-echo services through the proxy before
launch and was the documented dominant driver of a chronic
public-run-failure rate on ai-overview-citations).
Cloud-measured query-level delivery rate on the final build,
proxy-country-pinned, 4 runs / 9 queries, region: "all", no
overrides beyond the country pin:
| run id | queries | rows | completion |
|---|
p4MsGu3Mxl0UfyViR | nike, zara, adidas (cap 15) | 45 | 3/3 |
TDGwlVbvvGmwRFnss | puma, reebok (cap 15) | 30 | 2/2 |
0JcVZYQKUpMLQhWxd | gucci, prada, chanel (cap 15) | 45 | 3/3 |
bJWdvpbbqflogeRDV | nike (cap 10, enrichment probe run) | 10 | 1/1 |
9/9 queries completed (100%) — every run's status message reads
Done — N row(s) scraped across K/K quer(y/ies) completed. with
K == len(queries). This is a small sample (one batch, ~3 minutes
apart) and does not override the fleet's longer-run 87.5% figure from
T24, but it shows no regression from the proxy-country pin and no
repeat of "yesterday's" documented 3-of-4-runs-with-a-failing-query
pattern in this batch. chargedEventCounts on all 4:
actor-start: 1 (fired once, on delivery), ad-result matching row
count exactly — no over- or under-charging.
Verified locally: ruff check clean, pyright clean (0 errors on
src/; the 4 pre-existing pyright errors in untouched test files —
test_bootstrap.py, test_models.py, test_parser.py — predate this
change, noted in 0.3's entry), full hermetic suite green (75 passed,
20 dead enrichment-only tests removed rather than left red), plus
scripts/verify_input_prefill.py, verify_no_scaffold_stub.py,
verify_readme_price.py, verify_schema_refs.py,
verify_actor_implemented.py, verify_actor_source_tracked.py,
verify_charge_order.py, verify_ppe_sanity.py, verify_pydantic.py,
verify_seo.py, verify_test_imports.py — all OK.
Recommendation: PUBLISH. The one advertised-but-undeliverable
feature is gone, the remaining default path measured 100% query
completion across this session's 4 fresh cloud runs, PPE charges fire
correctly and only on delivery, and a FAILED run bills $0.00
(verified 2026-09-18, unchanged by this diff). See
scripts/publish_actors.py's SHELVED dict — this session removed
the tiktok-ad-library-scraper entry with a comment naming this
CHANGELOG section as the retiring evidence.