Canonical artist binding repair (#262)

Artist creation now synchronizes the canonical main-site artist term before reporting success. The ability resolves genres first so binding mirrors the saved vocabulary. Binding failures roll back the new profile and membership; incomplete rollback is reported for manual reconciliation. Platform provisioning also requires binding before storing its success option.

The existing admin_init migration advances extrachill_artist_platform_term_binding_integrity_backfill from 2.0.0 to 3.0.0. After deployment, an admin request runs the canonical sync for existing profiles, creating missing terms and reciprocal metadata rather than merely looking up slug matches. Valid bindings are preserved. The version is recorded when every sync either succeeds or reports a permanent failure. Invalid profile identities (including empty titles) and errors explicitly marked retryable => false are recorded as profile-ID-to-error-code entries in extrachill_artist_platform_term_binding_integrity_backfill_failures. These profiles are skipped on subsequent backfill passes and do not block completion; inspect and reconcile them manually. Unknown failures remain retryable.

Transient failures leave the version unchanged. extrachill_artist_platform_term_binding_integrity_backfill_retry_after stores a Unix timestamp that limits full-sync attempts to once per hour, including interrupted runs. It is cleared on completion. Existing completed 3.0.0 migrations are not rerun.

To run explicitly with WordPress loaded, call ec_backfill_artist_term_bindings() (for example with WP-CLI wp eval 'ec_backfill_artist_term_bindings();' on the artist site). Explicit calls respect the retry cooldown too. Check the migration option for 3.0.0 and inspect the _failures option afterward; completion does not imply every profile is bound. After manually repairing a reported profile, call ec_sync_artist_profile_term_binding( $profile_id ) and remove its report entry once verified. To force a pending backfill retry, delete the _retry_after option first. This repository change does not itself execute the repair against production.

Binding mutations require MySQL advisory locks; SQLite runs skip the corresponding regression tests.