Tested the hypothesis that a warm Chromium cache (the register GET being
re-served stale) was causing the protected address/search 401. Disabled
the HTTP cache (CDP Network.setCacheDisabled), the on-disk cache
(--disk-cache-size=0) and service workers (serviceWorkers:'block').
Result: identical trace — register=200 (freshly minted, not cached),
autocomplete=200, address/search=401. So cache was NOT the cause; the
401 is a server-side authorization decision on the protected endpoint
(reCAPTCHA Enterprise assertion required). Keeping the cache-disable as
hygiene + to definitively rule it out in future debugging.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Cogeco's address checker is gated by reCAPTCHA Enterprise (risk-score 401
on the protected /boutique/api/address/search call), so per-address
serviceability can't be scraped reliably from a datacenter IP without a
residential proxy. Per product decision, pivot to an assisted spot-check
instead of automated qualification.
- ReportInternetCherPage: add a "Concurrent" column with a one-click
button that copies the full service address and opens Cogeco's
availability page in a new tab (human reads the verdict in ~10s, only
for the leads that matter). fullAddress() builds "addr, city, QC ZIP".
- cogeco-checker: harden the POC anyway — track service-address/search
responses, retry the verdict call on 401 (re-register cadence), and
prioritize the authoritative JSON body in interpret(). Recon confirmed
the wall is reCAPTCHA scoring, not a timing/selector bug.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Playwright/Chromium microservice (mirrors modem-bridge: node:20-slim +
Chromium, token auth, port 3302, serialized + rate-limited) that drives
Cogeco's public address checker to determine if a competitor serves a
given address.
What works (proven on prod):
- Anti-bot bypass: vanilla headless gets 403 on /boutique/api/register
(reCAPTCHA Enterprise blocks datacenter headless). Adding
playwright-extra + stealth flips it to 200 — register + autocomplete
succeed.
- Reaches Cogeco's address system and pulls real autocomplete
suggestions. Confirmed it's Loqate/AddressComplete (id + next:
Retrieve/Find shape).
What's NOT reliable yet (do not use the verdict for decisions):
- The serviceability verdict. The Loqate flow is multi-step
(Find → Retrieve → Cogeco serviceability) and a single option click
doesn't complete it, so the final yes/no API call isn't captured.
- Current interpret() falls back to scanning UI text and produces FALSE
POSITIVES (a rural out-of-Cogeco address returned available=true off
generic marketing copy). Needs the real Retrieve+serviceability
endpoint wired before it can be trusted.
Next: capture the post-selection Retrieve + serviceability call (likely
needs a "continue" step and handling the multi-dwelling "N Addresses"
branch), then parse the real verdict + speeds.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>