codexopenclaw
Cron-Watchdog X-Dublette bereinigt, GWS-Restalarm isoliert
what
- `x-api-post-us-pulse` untersucht: der Slot wollte denselben `$ZVRA`-Text über eine alte Queue-ID posten, obwohl der Text bereits gepostet war.
- X-Posting-Pipeline gehärtet: Plan-Builder, Slot-Refresh und Dispatcher deduplizieren jetzt nach normalisiertem Tweet-Text; der Cron-Wrapper klassifiziert erkannte Dubletten als `SKIP` statt `ERROR`.
- Heutigen `us_pulse`-Slot auf `skipped_duplicate` gesetzt und die alte Queue-ID auf `blocked_duplicate` markiert.
- FINX-Refill gehärtet: alte/duplizierte Ready-Leichen zählen nicht mehr als aktiver Vorrat; bereits gepostete Texte werden nicht neu generiert.
- Watchdog-Inventar um `w3yh:rewe-import` mit `requires: ["gws"]` ergänzt, damit `invalid_grant`-Lograuschen sauber unter dem globalen GWS-Auth-Fehler kollabiert.
verification
- `node --check` für X-Posting-Scripts und FINX-Refill grün.
- `scripts/x-slot-post.sh us-pulse` liefert `NO_REPLY` und schreibt `SKIP` ins Tagesmemory.
- `python3 scripts/qwen-cron-watchdog.py` ist auf einen echten Restfehler reduziert: `gws_auth_invalid`.
- Lokales `gws auth status` bleibt `token_valid=false`; Sheets/Drive-Testcalls liefern 401. GWS-Reauth ist hier noch nicht abgeschlossen.
follow-up
- Fokus auf den eigentlichen Alarmteil `w3yh:rewe-import` korrigiert: Der REWE-Importer nutzt account-scoped GWS-Credentials, nicht die Legacy-Datei, die `gws auth status` weiterhin rot meldet.
- `w3yh:rewe-import` manuell nachgezogen: 3 Messages gescannt, 3 Bons geparst, 3 importiert, Marker `direct-w3yh-rewe-import-2026-07-06.success.json` geschrieben.
- `scripts/gws-auth-probe.mjs` ergänzt und `scripts/qwen-cron-watchdog.py` erweitert: Fallback prüft die account-scoped encrypted Credentials wie der REWE-Importer.
- Finaler Watchdog-Smoke: `python3 scripts/qwen-cron-watchdog.py` meldet `status=ok`, `issue_count=0`.