- Added phpcs:ignore for class file naming convention (79 violations)
WordPress.Files.FileName.InvalidClassFileName is a known architectural
issue — class files use short names without prautoblogger- prefix
- Added phpcs:ignore for ->prepare() table interpolation (56 violations)
WordPress.DB.PreparedSQL.InterpolatedNotPrepared: dynamic table names
(prab_generation_logs, prab_cost_logs) require interpolation; ->prepare()
does not support table name placeholders, only column values
- Fixed file-level docblock positioning (2 violations)
prautoblogger.php and uninstall.php: moved declare(strict_types=1) before
file docblock per PHP best practices
Run phpcbf --standard=WordPress-Core across includes/, prautoblogger.php,
and uninstall.php. Fixed 1,362 formatting violations in 75 files:
- Short array syntax: [] → array()
- Line breaking for long function calls
- Consistent indentation
- Function call parameter alignment
No logic changes; purely mechanical formatting.
Two-pronged fix for repeated article topics:
1. Feed last 30 days of published article titles into the LLM analysis
prompt with explicit "avoid these" instruction. Zero cost — just
extra context in an existing API call.
2. Replace keyword-overlap dedup (60% word match) with embedding-based
cosine similarity via sentence-transformers/all-MiniLM-L12-v2 on
OpenRouter. Catches rephrasings that keyword matching misses
(e.g. "BPC-157 dosing" vs "how much BPC-157 to take"). Falls back
to keyword matching if the embedding API is unavailable.
Cost: ~$0.00001 per generation run ($0.02/M tokens, ~500 tokens/run).
New files:
- class-semantic-dedup.php — Embedding cosine similarity + keyword fallback
- class-open-router-embedding-provider.php — OpenRouter /embeddings client
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>