- Remove wp_strip_all_tags/sanitize_text_field stubs from bootstrap
(Brain Monkey manages these via Functions\when() in individual tests;
defining them early triggers Patchwork's DefinedTooEarly error)
- Add WP_Error class stub to bootstrap (class, not function — safe for
Patchwork) so model registry and image pipeline tests can use it
- Replace WP_Error_Stub with standard WP_Error in model registry test
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Foundation for the smart model picker. Fetches, normalizes, and caches
the OpenRouter model list (/api/v1/models — free, unauthenticated).
Daily refresh via the existing prautoblogger_daily_generation cron with
12h idempotency. 3-retry exponential backoff on transient failures;
serves last-good option payload when stale-and-fetch-fails.
New files:
- interface-model-registry.php — Phase 3-aware contract (94 lines)
- class-openrouter-model-registry.php — fetch + cache + query (226 lines)
- class-openrouter-model-normalizer.php — raw → standardized (114 lines)
Zero-coupling: no PRAUTOBLOGGER_* constants inside the service classes.
Config injected via constructor. Phase 2 lift into a shared Composer
package requires only namespace rename, zero internal edits.
Cost impact: $0/month (free endpoint, no LLM tokens).
Agent-Session: cowork-2026-04-16-model-picker-commit1
Co-authored-by: peptiderepo <peptiderepo@users.noreply.github.com>