Some VPS configs can't get pdo_sqlite at all — Ubuntu 20.04 with Ondrej Sury's PHP 8.3 builds doesn't ship php8.3-sqlite3, and OS upgrade isn't always an option. Make MySQL the documented default while keeping SQLite working where it's available. - Schema (0001_initial.sql): TEXT → VARCHAR(N), INTEGER → BIGINT, keys declared with explicit PRIMARY KEY (...) syntax. Drops the previously unused request_log table (it had AUTO_INCREMENT, which spells differently on each engine and nothing wrote to it anyway). Both engines accept the new column types and indexes are IF NOT EXISTS for retry-safety. - Migrations.php: guard commit()/rollBack() with inTransaction(). MySQL implicitly commits any open transaction the moment it sees a DDL statement, so by the time we explicitly commit() the transaction is already gone and PDO throws "There is no active transaction". Same schema in PHP CREATE TABLE migrations also moved to VARCHAR/BIGINT. - Store::upsertStep: driver-detect via PDO::ATTR_DRIVER_NAME and emit ON DUPLICATE KEY UPDATE for MySQL, ON CONFLICT (...) DO UPDATE for SQLite/PostgreSQL. VALUES(col) (vs new.col aliasing) for MySQL 5.7 compatibility. - Db.php: when DSN is mysql:, SET NAMES utf8mb4 + sql_mode strict on every session so we get sane behaviour regardless of server defaults. SQLite branch (PRAGMA foreign_keys/journal_mode/synchronous) unchanged. - config.php.example: MySQL DSN is now the default + an inline SQLite alternative block. - DEPLOY.md: new "Database — MySQL or SQLite" section explaining when to pick which and showing the CREATE DATABASE / CREATE USER / GRANT statements. Install snippet split so SQLite-only steps (mkdir data, chmod 770) are clearly optional. Verified end-to-end on a live MySQL 8.0.34 box: POST creates session (201), PUT step inserts (200) and updates via the upsert branch (200), GET returns the round-tripped state, /sites lists distinct site_keys. SQLite path still re-applies the migration idempotently locally. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Site Healthcheck
Internal WordPress plugin that walks a technician through a structured healthcheck. Companion to wp-site-recovery, which it expects to be installed as step 0.
Install
ln -s ~/dev/wp-healthcheck /path/to/wp/wp-content/plugins/att-site-healthcheck
Then activate from Plugins. Settings appear under Tools → Site Healthcheck.
Use
- Open Tools → Site Healthcheck.
- Confirm the recovery plugin status panel shows ✓ active.
- Click Start new healthcheck.
- Work through each step card. For each: choose a status (done / skipped / blocked / n/a) and add notes.
- Click Finish & generate report.
- Download the Markdown report or copy it to clipboard.
One in-progress session per site at a time. Reports are not stored in the database (the plugin is meant to be uninstalled at the end of each engagement) — download them.
Adding, removing, reordering steps
Each step is a single file under includes/steps/ named <order>-<slug>.php.
<?php
// includes/steps/45-staging.php
return new class extends ATT_HC_Step {
public function id(): string { return 'staging'; }
public function title(): string { return 'Step 4.5 — Verify Staging Sync'; }
public function sub_items(): array {
return ['Re-deploy from production', 'Run smoke tests'];
}
};
- Add: drop a new file.
- Remove: delete the file.
- Reorder: rename the numeric prefix (steps are loaded in
natsortorder). - Conditionally drop on one install: use the
att_hc_stepsfilter tounsetthe step by id.
Stable string IDs (returned by id()) are what's stored in session data, so renaming a file does not break in-progress sessions as long as the id stays the same.
Phase roadmap
Phase 1 (this) is a checklist + Markdown report. Phase 3 will add per-step automation — backup detection, env auto-collect, plugin update intelligence, PageSpeed Insights, SSL checks, etc. See beads epic hc-5ix for the full plan.
Distribution
Internal/agency tool — not a WP.org plugin (decision hc-5ix.26). Distributed as a built ZIP. A self-hosted update channel is hc-5ix.27 on the phase-3 backlog.
Tracking
cd ~/dev/wp-healthcheck
bd list --label phase-1 # MVP work
bd list --label phase-3 # automation backlog