BLOCKED-ENV (day 2 of identical credential failure). OAuth refresh token in vault.env returns invalid_grant: Token has been expired or revoked. from oauth2.googleapis.com/token. Vault was last modified 2026-04-25 01:19 UTC; no rotation has happened since yesterday's BLOCKED-ENV report. The dedicated SAIL_GOOGLE_ADS_REFRESH_TOKEN and SAIL_GOOGLE_ADS_DEVELOPER_TOKEN for the cloud cutover are still missing.
Only one positive change: yesterday's Q3 recommendation (3-second OAuth pre-flight self-test) was implemented inline in this run. BLOCKED-ENV is now caught in <1s instead of ~30s. The change has not been committed back to the shared campaign_health script in the repo — that promotion is in this run's QA pack as Q2.
Everything else is identical: same token, same vault mtime, same shared-credential outage across three daily tasks.
python3 generate_user_credentials.py against the existing OAuth client.GOOGLE_ADS_REFRESH_TOKEN in /Users/samaguiar/Documents/Projects/.credentials/vault.env. (Vault writes blocked for Claude by hook.)google-ads/scripts/_oauth_preflight.py and import from all three daily Google Ads scripts.Full report: /Users/samaguiar/Documents/Projects/Repos/sail-googleads/google-ads/outputs/reports/campaign-health-2026-04-27.md
Handoff: /Users/samaguiar/Documents/Projects/Repos/sail-googleads/handoffs/gads-campaign-health-2026-04-27.md
Codex QA queue: /Users/samaguiar/Documents/Codex/_qa-queue/2026-04-27.md
[11:17:28] start gads-campaign-health 2026-04-27
[11:17:28] customer=3813916687 login_customer_id=8676599345 (MCC override per Decision 8)
[11:17:28] window_last_7=2026-04-20..2026-04-26 prior_7=2026-04-13..2026-04-19
[11:17:28] whitelist=[23723841732, 23729092958, 23729092712]
[11:17:28] vault loaded; mtime 2026-04-25 01:19 UTC (unchanged since yesterday)
[11:17:28] OAuth pre-flight self-test (NEW today, per 2026-04-26 Q3): POST oauth2.googleapis.com/token
[11:17:29] OAuth pre-flight: FAIL invalid_grant
[11:17:29] decision: BLOCKED-ENV. abort before SDK init.
[11:17:29] adspirer: not used.