[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-automattic-woocommerce-upgrade-safety":3,"mdc--2yfb3r-key":36,"related-repo-automattic-woocommerce-upgrade-safety":3075,"related-org-automattic-woocommerce-upgrade-safety":3112},{"slug":4,"name":4,"fn":5,"description":6,"org":7,"tags":11,"stars":25,"repoUrl":26,"updatedAt":27,"license":28,"forks":29,"topics":30,"repo":31,"sourceUrl":34,"mdContent":35},"woocommerce-upgrade-safety","review WooCommerce plugin upgrades for safety","Pre-release upgrade safety review for WooCommerce plugins. Validates database migrations, settings compatibility, payment token preservation, hook deprecation, rollback safety, and merchant communication for version upgrades. Use before any minor or major version release, when a release includes database schema changes, settings restructuring, new feature declarations (HPOS, blocks), deprecated hooks\u002Ffilters, or payment flow changes. Also trigger when reviewing a diff that shows install class changes, dbDelta calls, payment token modifications, hook removals, or minimum version bumps. Skip for patch releases that contain only bug fixes with no structural changes.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},"automattic","Automattic","https:\u002F\u002Fpexgzepcugksgbtrxkhf.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Forg-logos\u002Fautomattic.png",[12,16,19,22],{"name":13,"slug":14,"type":15},"Code Review","code-review","tag",{"name":17,"slug":18,"type":15},"WooCommerce","woocommerce",{"name":20,"slug":21,"type":15},"WordPress","wordpress",{"name":23,"slug":24,"type":15},"Risk Assessment","risk-assessment",5,"https:\u002F\u002Fgithub.com\u002FAutomattic\u002Fclaude-woocommerce-toolkit","2026-04-12T04:56:23.847888",null,1,[],{"repoUrl":26,"stars":25,"forks":29,"topics":32,"description":33},[],"Claude Code skills and agents for building, reviewing, and maintaining WordPress and WooCommerce plugins","https:\u002F\u002Fgithub.com\u002FAutomattic\u002Fclaude-woocommerce-toolkit\u002Ftree\u002FHEAD\u002Fskills\u002Fwoocommerce-upgrade-safety","---\nname: woocommerce-upgrade-safety\ndescription: >\n  Pre-release upgrade safety review for WooCommerce plugins. Validates database migrations,\n  settings compatibility, payment token preservation, hook deprecation, rollback safety, and\n  merchant communication for version upgrades. Use before any minor or major version release,\n  when a release includes database schema changes, settings restructuring, new feature\n  declarations (HPOS, blocks), deprecated hooks\u002Ffilters, or payment flow changes. Also trigger\n  when reviewing a diff that shows install class changes, dbDelta calls, payment token\n  modifications, hook removals, or minimum version bumps. Skip for patch releases that contain\n  only bug fixes with no structural changes.\n---\n\n# WooCommerce Plugin Upgrade Safety Review\n\nYou are performing an upgrade safety review for a WooCommerce plugin that is about\nto ship a new version to existing merchants. This skill is concerned exclusively\nwith what happens to **existing installations** during and after the upgrade -- not\nwith the quality of the new code itself (that is covered by code review skills).\n\n## Foundation References\n\nRead these before starting -- they define the patterns you are auditing against:\n\n- **`references\u002Fwoocommerce-apis.md`** -- HPOS, CRUD, data stores, Payment Token API,\n  feature compatibility declarations\n- **`references\u002Fsecurity.md`** -- Database patterns, Options API, prepared statements\n- **`references\u002Fplugin-architecture.md`** -- Plugin lifecycle hooks, activation\u002Fdeactivation\n\n## When to Use\n\n- Before any **minor version** (1.x -> 1.y) or **major version** (1.x -> 2.0) release\n- When a release includes **database schema changes**, **settings restructuring**,\n  **new feature declarations** (HPOS, blocks), or **deprecated hooks\u002Ffilters**\n- When a release **changes the payment flow** (new tokenization method, new API\n  version, hosted fields migration)\n- Skip for **patch releases** (1.0.x -> 1.0.y) that contain only bug fixes with no\n  structural changes\n\n## How to Detect When This Skill Is Needed\n\nScan the diff between the old and new version for these high-risk patterns:\n\n| Pattern | Why It's Risky |\n|---|---|\n| Changes to `*-install.php`, `*-activator.php`, `*Install*` classes | Database migration code changed |\n| New\u002Fmodified `dbDelta()` calls or `$wpdb->query(\"ALTER TABLE\")` | Schema migration |\n| Changes to `WC_Payment_Token*` classes or `wc_payment_token` meta | Payment token schema |\n| Removed `add_action`\u002F`add_filter` calls | Hook removal |\n| Changes to `process_payment()`, `process_refund()` | Core payment flow |\n| New\u002Fchanged `delete_option()` calls | Settings migration |\n| Changed `Requires at least`, `WC requires at least`, `Requires PHP` headers | Minimum version bump |\n\nIf any of these patterns appear, run this skill.\n\n---\n\n## Step 0: Establish Upgrade Context\n\n1. Identify the **current released version** (what merchants have today)\n2. Identify the **target version** (what is about to ship)\n3. Produce a diff summary:\n   - Files added, modified, deleted\n   - Database schema changes (new tables, altered columns, new meta keys)\n   - Settings fields added, removed, or renamed\n   - Hooks\u002Ffilters added, removed, or signature-changed\n   - Payment Token schema changes\n   - Minimum version requirements changed (PHP, WP, WC)\n\nIf both versions are in git:\n```bash\ngit diff v\u003Cold>..v\u003Cnew> --stat\ngit diff v\u003Cold>..v\u003Cnew> -- src\u002FData\u002F includes\u002Fclass-*-install.php\n```\n\n---\n\n## Step 1: Database Migration Safety\n\n### 1.1 Schema Migrations\n\n- [ ] All schema changes use `dbDelta()` or equivalent safe migration pattern\n- [ ] Migrations are **idempotent** -- running the upgrade routine twice produces the\n      same result (merchants may trigger activation multiple times)\n- [ ] Column type changes are backwards-compatible (e.g., widening a VARCHAR, not\n      narrowing it)\n- [ ] New required columns have sensible defaults so existing rows are valid\n- [ ] No `DROP TABLE` or `DROP COLUMN` without a preceding version that stopped\n      writing to that table\u002Fcolumn (two-release deprecation pattern)\n- [ ] Migration runs on `admin_init` or `plugins_loaded` with a version check gate,\n      NOT on every page load\n- [ ] Schema version is stored in `wp_options` and checked before running migrations\n\n**Severity:**\n\n| Issue | Level |\n|-------|-------|\n| Data loss (DROP without migration) | Critical |\n| Non-idempotent migration | High |\n| Missing version gate (runs on every load) | High |\n| No schema version tracking | Medium |\n\n### 1.2 Data Migrations\n\n- [ ] Existing order meta is preserved or migrated to new keys (not silently orphaned)\n- [ ] If meta keys are renamed: old keys are read as fallback during a transition\n      period, not immediately deleted\n- [ ] If data format changes (e.g., serialized -> JSON, or flat -> structured):\n      migration converts existing records, does not assume new format\n- [ ] Migration handles large datasets without hitting PHP memory\u002Ftimeout limits\n      (batch processing with `LIMIT` + offset, or Action Scheduler)\n- [ ] HPOS compatibility: if migrating order meta, works with both `wp_postmeta` and\n      `wc_orders_meta` tables (use `$order->get_meta()` \u002F `$order->update_meta_data()`,\n      never raw SQL against a specific table)\n\n### 1.3 Options \u002F Settings Migrations\n\n- [ ] If settings keys are renamed or restructured: old settings are read and migrated\n      on upgrade, not lost\n- [ ] If settings are moved between storage backends (options -> custom table, or\n      vice versa): migration runs before any code reads from the new location\n- [ ] Autoloaded option size is checked -- migrations should not create large\n      autoloaded options (>100KB triggers performance degradation)\n- [ ] Default values for new settings are set during migration, not left to\n      `get_option()` fallback (avoids race conditions where code reads before\n      migration runs)\n\n---\n\n## Step 2: Payment Continuity\n\nThis section applies only to payment gateway plugins. Skip for non-payment plugins.\n\n### 2.1 Saved Payment Tokens\n\n- [ ] Existing saved payment tokens (`WC_Payment_Token_CC`, custom token types)\n      remain valid and usable after upgrade\n- [ ] If the token storage schema changes: migration converts existing tokens\n- [ ] If switching from custom token storage to the WC Payment Token API (or vice\n      versa): migration preserves all existing tokens\n- [ ] If switching payment processor API versions: existing tokens are compatible or\n      migrated (e.g., Stripe Sources -> PaymentMethods migration)\n- [ ] Merchants' customers can check out using saved cards immediately after upgrade\n      without re-entering payment details\n\n**Severity:** Any token loss or breakage is **Critical** -- merchants' customers lose\nsaved payment methods, increasing checkout friction and abandoned carts.\n\n### 2.2 Active Subscriptions\n\n- [ ] If the plugin supports WooCommerce Subscriptions: active subscription renewal\n      payments will continue to process correctly after upgrade\n- [ ] If the API integration changes: existing subscription payment profiles \u002F\n      mandates are compatible with the new flow\n- [ ] Renewal hooks (`scheduled_subscription_payment_{gateway_id}`) are still\n      registered with the same callback signature\n\n### 2.3 Pending Transactions\n\n- [ ] Orders in `pending` or `on-hold` status with this payment method can still be\n      completed after upgrade\n- [ ] Webhook\u002FIPN handlers still accept callbacks for transactions initiated before\n      the upgrade (old API format, old webhook signature scheme)\n- [ ] If the webhook endpoint URL changes: old URL still routes to a handler (or\n      returns a meaningful error, not a 404)\n\n---\n\n## Step 3: Hook and Filter Compatibility\n\n### 3.1 Removed or Renamed Hooks\n\n- [ ] List all hooks\u002Ffilters present in the current version but absent in the target\n- [ ] For each removed hook: is there a replacement? Is the old hook deprecated with\n      a notice before removal? (Should follow two-release deprecation: deprecate in\n      release N, remove in release N+2)\n- [ ] `_deprecated_hook()` or `_deprecated_function()` called for any removed or\n      renamed hooks\u002Ffunctions\n- [ ] Third-party plugins or themes hooking into removed hooks will not fatal error\n\n### 3.2 Changed Signatures\n\n- [ ] List all hooks\u002Ffilters where the number or type of parameters changed\n- [ ] Changed signatures documented in the changelog\n- [ ] If a filter return type changed: existing filter callbacks returning the old\n      type will not cause a fatal error or data corruption\n\n### 3.3 New Feature Declarations\n\n- [ ] If the plugin newly declares HPOS compatibility: verified that the upgrade path\n      from non-HPOS-aware to HPOS-aware does not break existing order access\n- [ ] If the plugin newly declares block checkout compatibility: existing classic\n      checkout integrations still work (do not remove classic support when adding\n      blocks support)\n- [ ] New `FeaturesUtil::declare_compatibility()` calls are accurate (the plugin\n      actually works with the feature, not just declaring it)\n\n---\n\n## Step 4: Rollback Safety\n\n### 4.1 Downgrade Resilience\n\n- [ ] If a merchant downgrades to the previous version after upgrading: the plugin\n      does not fatal error\n- [ ] Database schema changes are forward-compatible: columns added by v2 do not\n      break v1's queries (v1 ignores unknown columns)\n- [ ] Settings added by v2 do not break v1's `get_option()` calls (v1 ignores\n      unknown settings)\n- [ ] If the migration is destructive (cannot be reversed): this is documented in the\n      changelog and release notes with a \"backup before upgrading\" warning\n\n### 4.2 WordPress Auto-Update Safety\n\n- [ ] The plugin does not break WordPress auto-update compatibility\n- [ ] If the upgrade requires manual steps (e.g., re-entering API credentials):\n      an admin notice clearly communicates this after auto-update\n- [ ] Post-upgrade tasks that require admin attention are surfaced via\n      `WC_Admin_Notices` or WordPress admin notices (not just changelog text)\n\n---\n\n## Step 5: Changelog and Merchant Communication\n\n### 5.1 Changelog Quality\n\n- [ ] Changelog entry exists for this release\n- [ ] Format follows \"Keep a Changelog\" or WordPress conventions\n- [ ] Breaking changes are called out explicitly (not buried in a list)\n- [ ] Migration steps (if any) are documented with clear instructions\n- [ ] Deprecated features are listed with their replacement\n\n### 5.2 Upgrade Notice\n\n- [ ] `readme.txt` includes an `== Upgrade Notice ==` section for this version\n- [ ] If the upgrade requires action: the notice says so clearly\n- [ ] If the upgrade has breaking changes: severity is communicated (\"backup your\n      site before upgrading\")\n\n### 5.3 Version Metadata\n\n- [ ] Plugin header `Version:` matches the release tag\n- [ ] `WC tested up to` is updated to the latest WooCommerce release\n- [ ] `Requires at least` is updated if minimum requirements changed\n- [ ] `Requires PHP` is updated if minimum PHP version changed\n- [ ] If minimum requirements increased: changelog documents this and the upgrade\n      notice warns merchants on older versions\n\n---\n\n## Step 6: Synthesize Upgrade Safety Report\n\n### Deliverable: `upgrade-safety-report.md`\n\n```markdown\n# Upgrade Safety Report\n## Plugin: [name] v[current] -> v[target]\n## Date: [date]\n\n### Upgrade Risk Level: [LOW \u002F MEDIUM \u002F HIGH \u002F CRITICAL]\n\n| Risk Level | Definition |\n|------------|------------|\n| LOW | No schema changes, no breaking changes, patch-level fixes |\n| MEDIUM | New settings or meta keys, new feature declarations, minor hook changes |\n| HIGH | Database schema changes, payment flow changes, deprecated hooks |\n| CRITICAL | Data migration required, payment token schema change, minimum version bump |\n\nNote: Major version bumps (X.0.0) start at HIGH minimum regardless of content.\n\n### Database Migrations\n| Migration | Idempotent | Batched | Reversible | Status |\n|-----------|-----------|---------|------------|--------|\n| [description] | Yes\u002FNo | Yes\u002FNo | Yes\u002FNo | PASS\u002FFAIL |\n\n### Payment Continuity\n| Check | Status | Notes |\n|-------|--------|-------|\n| Saved tokens preserved | PASS\u002FFAIL\u002FN\u002FA | [details] |\n| Active subscriptions safe | PASS\u002FFAIL\u002FN\u002FA | [details] |\n| Pending transactions safe | PASS\u002FFAIL\u002FN\u002FA | [details] |\n| Webhook backward compat | PASS\u002FFAIL\u002FN\u002FA | [details] |\n\n### Hook Compatibility\n| Hook\u002FFilter | Change | Deprecated? | Replacement | Status |\n|-------------|--------|-------------|-------------|--------|\n| [hook name] | Removed\u002FRenamed\u002FSignature | Yes\u002FNo | [replacement] | PASS\u002FFAIL |\n\n### Rollback Assessment\n- Downgrade safe: [Yes \u002F No \u002F Partial]\n- Auto-update safe: [Yes \u002F No -- requires manual steps]\n- Manual steps required: [list, or \"None\"]\n\n### Changelog Review\n- Breaking changes documented: [Yes \u002F No \u002F N\u002FA]\n- Upgrade notice present: [Yes \u002F No]\n- Version metadata current: [Yes \u002F No]\n\n### Prioritized Upgrade Issues\n\n## Critical\n### UPG-001: [Brief description]\n- **Category:** [Database \u002F Payment \u002F Hooks \u002F Rollback \u002F Changelog]\n- **File:** [path]\n- **Lines:** [N-M]\n- **Issue:** [What is wrong]\n- **Merchant Impact:** [What breaks for existing merchants]\n- **Fix:** [What to change, with before\u002Fafter code]\n- **Status:** [ ] Not started\n\n## High\n[...]\n\n## Medium\n[...]\n```\n\n---\n\n## Step 7: Save and Present\n\n1. Save the report\n2. Present a one-paragraph risk summary\n3. If Critical or High issues exist: recommend blocking the release until resolved\n4. If the upgrade risk level is HIGH or CRITICAL: recommend the partner include a\n   \"backup before upgrading\" notice in the release\n\n## Important Notes\n\n- This skill does NOT evaluate code quality, security, or UX -- those are handled by\n  other review skills\n- Focus exclusively on the **delta between versions**, not absolute quality\n- Payment token preservation is the highest-stakes item -- verify thoroughly\n- Database migrations that work on 10 test orders may fail on 10,000 production\n  orders due to memory\u002Ftimeout -- always check for batching\n- WordPress auto-updates mean merchants may upgrade without reading the changelog --\n  surface breaking changes via admin notices, not just documentation\n",{"data":37,"body":38},{"name":4,"description":6},{"type":39,"children":40},"root",[41,50,64,71,76,124,130,207,213,218,445,450,454,460,525,530,689,692,698,705,830,838,911,917,1006,1012,1060,1063,1069,1074,1080,1137,1152,1158,1197,1203,1249,1252,1258,1264,1319,1325,1356,1362,1401,1404,1410,1416,1463,1469,1508,1511,1517,1523,1572,1578,1624,1630,1706,1709,1715,1727,2996,2999,3005,3028,3034,3069],{"type":42,"tag":43,"props":44,"children":46},"element","h1",{"id":45},"woocommerce-plugin-upgrade-safety-review",[47],{"type":48,"value":49},"text","WooCommerce Plugin Upgrade Safety Review",{"type":42,"tag":51,"props":52,"children":53},"p",{},[54,56,62],{"type":48,"value":55},"You are performing an upgrade safety review for a WooCommerce plugin that is about\nto ship a new version to existing merchants. This skill is concerned exclusively\nwith what happens to ",{"type":42,"tag":57,"props":58,"children":59},"strong",{},[60],{"type":48,"value":61},"existing installations",{"type":48,"value":63}," during and after the upgrade -- not\nwith the quality of the new code itself (that is covered by code review skills).",{"type":42,"tag":65,"props":66,"children":68},"h2",{"id":67},"foundation-references",[69],{"type":48,"value":70},"Foundation References",{"type":42,"tag":51,"props":72,"children":73},{},[74],{"type":48,"value":75},"Read these before starting -- they define the patterns you are auditing against:",{"type":42,"tag":77,"props":78,"children":79},"ul",{},[80,96,110],{"type":42,"tag":81,"props":82,"children":83},"li",{},[84,94],{"type":42,"tag":57,"props":85,"children":86},{},[87],{"type":42,"tag":88,"props":89,"children":91},"code",{"className":90},[],[92],{"type":48,"value":93},"references\u002Fwoocommerce-apis.md",{"type":48,"value":95}," -- HPOS, CRUD, data stores, Payment Token API,\nfeature compatibility declarations",{"type":42,"tag":81,"props":97,"children":98},{},[99,108],{"type":42,"tag":57,"props":100,"children":101},{},[102],{"type":42,"tag":88,"props":103,"children":105},{"className":104},[],[106],{"type":48,"value":107},"references\u002Fsecurity.md",{"type":48,"value":109}," -- Database patterns, Options API, prepared statements",{"type":42,"tag":81,"props":111,"children":112},{},[113,122],{"type":42,"tag":57,"props":114,"children":115},{},[116],{"type":42,"tag":88,"props":117,"children":119},{"className":118},[],[120],{"type":48,"value":121},"references\u002Fplugin-architecture.md",{"type":48,"value":123}," -- Plugin lifecycle hooks, activation\u002Fdeactivation",{"type":42,"tag":65,"props":125,"children":127},{"id":126},"when-to-use",[128],{"type":48,"value":129},"When to Use",{"type":42,"tag":77,"props":131,"children":132},{},[133,152,183,195],{"type":42,"tag":81,"props":134,"children":135},{},[136,138,143,145,150],{"type":48,"value":137},"Before any ",{"type":42,"tag":57,"props":139,"children":140},{},[141],{"type":48,"value":142},"minor version",{"type":48,"value":144}," (1.x -> 1.y) or ",{"type":42,"tag":57,"props":146,"children":147},{},[148],{"type":48,"value":149},"major version",{"type":48,"value":151}," (1.x -> 2.0) release",{"type":42,"tag":81,"props":153,"children":154},{},[155,157,162,164,169,171,176,178],{"type":48,"value":156},"When a release includes ",{"type":42,"tag":57,"props":158,"children":159},{},[160],{"type":48,"value":161},"database schema changes",{"type":48,"value":163},", ",{"type":42,"tag":57,"props":165,"children":166},{},[167],{"type":48,"value":168},"settings restructuring",{"type":48,"value":170},",\n",{"type":42,"tag":57,"props":172,"children":173},{},[174],{"type":48,"value":175},"new feature declarations",{"type":48,"value":177}," (HPOS, blocks), or ",{"type":42,"tag":57,"props":179,"children":180},{},[181],{"type":48,"value":182},"deprecated hooks\u002Ffilters",{"type":42,"tag":81,"props":184,"children":185},{},[186,188,193],{"type":48,"value":187},"When a release ",{"type":42,"tag":57,"props":189,"children":190},{},[191],{"type":48,"value":192},"changes the payment flow",{"type":48,"value":194}," (new tokenization method, new API\nversion, hosted fields migration)",{"type":42,"tag":81,"props":196,"children":197},{},[198,200,205],{"type":48,"value":199},"Skip for ",{"type":42,"tag":57,"props":201,"children":202},{},[203],{"type":48,"value":204},"patch releases",{"type":48,"value":206}," (1.0.x -> 1.0.y) that contain only bug fixes with no\nstructural changes",{"type":42,"tag":65,"props":208,"children":210},{"id":209},"how-to-detect-when-this-skill-is-needed",[211],{"type":48,"value":212},"How to Detect When This Skill Is Needed",{"type":42,"tag":51,"props":214,"children":215},{},[216],{"type":48,"value":217},"Scan the diff between the old and new version for these high-risk patterns:",{"type":42,"tag":219,"props":220,"children":221},"table",{},[222,241],{"type":42,"tag":223,"props":224,"children":225},"thead",{},[226],{"type":42,"tag":227,"props":228,"children":229},"tr",{},[230,236],{"type":42,"tag":231,"props":232,"children":233},"th",{},[234],{"type":48,"value":235},"Pattern",{"type":42,"tag":231,"props":237,"children":238},{},[239],{"type":48,"value":240},"Why It's Risky",{"type":42,"tag":242,"props":243,"children":244},"tbody",{},[245,281,308,336,365,390,410],{"type":42,"tag":227,"props":246,"children":247},{},[248,276],{"type":42,"tag":249,"props":250,"children":251},"td",{},[252,254,260,261,267,268,274],{"type":48,"value":253},"Changes to ",{"type":42,"tag":88,"props":255,"children":257},{"className":256},[],[258],{"type":48,"value":259},"*-install.php",{"type":48,"value":163},{"type":42,"tag":88,"props":262,"children":264},{"className":263},[],[265],{"type":48,"value":266},"*-activator.php",{"type":48,"value":163},{"type":42,"tag":88,"props":269,"children":271},{"className":270},[],[272],{"type":48,"value":273},"*Install*",{"type":48,"value":275}," classes",{"type":42,"tag":249,"props":277,"children":278},{},[279],{"type":48,"value":280},"Database migration code changed",{"type":42,"tag":227,"props":282,"children":283},{},[284,303],{"type":42,"tag":249,"props":285,"children":286},{},[287,289,295,297],{"type":48,"value":288},"New\u002Fmodified ",{"type":42,"tag":88,"props":290,"children":292},{"className":291},[],[293],{"type":48,"value":294},"dbDelta()",{"type":48,"value":296}," calls or ",{"type":42,"tag":88,"props":298,"children":300},{"className":299},[],[301],{"type":48,"value":302},"$wpdb->query(\"ALTER TABLE\")",{"type":42,"tag":249,"props":304,"children":305},{},[306],{"type":48,"value":307},"Schema migration",{"type":42,"tag":227,"props":309,"children":310},{},[311,331],{"type":42,"tag":249,"props":312,"children":313},{},[314,315,321,323,329],{"type":48,"value":253},{"type":42,"tag":88,"props":316,"children":318},{"className":317},[],[319],{"type":48,"value":320},"WC_Payment_Token*",{"type":48,"value":322}," classes or ",{"type":42,"tag":88,"props":324,"children":326},{"className":325},[],[327],{"type":48,"value":328},"wc_payment_token",{"type":48,"value":330}," meta",{"type":42,"tag":249,"props":332,"children":333},{},[334],{"type":48,"value":335},"Payment token schema",{"type":42,"tag":227,"props":337,"children":338},{},[339,360],{"type":42,"tag":249,"props":340,"children":341},{},[342,344,350,352,358],{"type":48,"value":343},"Removed ",{"type":42,"tag":88,"props":345,"children":347},{"className":346},[],[348],{"type":48,"value":349},"add_action",{"type":48,"value":351},"\u002F",{"type":42,"tag":88,"props":353,"children":355},{"className":354},[],[356],{"type":48,"value":357},"add_filter",{"type":48,"value":359}," calls",{"type":42,"tag":249,"props":361,"children":362},{},[363],{"type":48,"value":364},"Hook removal",{"type":42,"tag":227,"props":366,"children":367},{},[368,385],{"type":42,"tag":249,"props":369,"children":370},{},[371,372,378,379],{"type":48,"value":253},{"type":42,"tag":88,"props":373,"children":375},{"className":374},[],[376],{"type":48,"value":377},"process_payment()",{"type":48,"value":163},{"type":42,"tag":88,"props":380,"children":382},{"className":381},[],[383],{"type":48,"value":384},"process_refund()",{"type":42,"tag":249,"props":386,"children":387},{},[388],{"type":48,"value":389},"Core payment flow",{"type":42,"tag":227,"props":391,"children":392},{},[393,405],{"type":42,"tag":249,"props":394,"children":395},{},[396,398,404],{"type":48,"value":397},"New\u002Fchanged ",{"type":42,"tag":88,"props":399,"children":401},{"className":400},[],[402],{"type":48,"value":403},"delete_option()",{"type":48,"value":359},{"type":42,"tag":249,"props":406,"children":407},{},[408],{"type":48,"value":409},"Settings migration",{"type":42,"tag":227,"props":411,"children":412},{},[413,440],{"type":42,"tag":249,"props":414,"children":415},{},[416,418,424,425,431,432,438],{"type":48,"value":417},"Changed ",{"type":42,"tag":88,"props":419,"children":421},{"className":420},[],[422],{"type":48,"value":423},"Requires at least",{"type":48,"value":163},{"type":42,"tag":88,"props":426,"children":428},{"className":427},[],[429],{"type":48,"value":430},"WC requires at least",{"type":48,"value":163},{"type":42,"tag":88,"props":433,"children":435},{"className":434},[],[436],{"type":48,"value":437},"Requires PHP",{"type":48,"value":439}," headers",{"type":42,"tag":249,"props":441,"children":442},{},[443],{"type":48,"value":444},"Minimum version bump",{"type":42,"tag":51,"props":446,"children":447},{},[448],{"type":48,"value":449},"If any of these patterns appear, run this skill.",{"type":42,"tag":451,"props":452,"children":453},"hr",{},[],{"type":42,"tag":65,"props":455,"children":457},{"id":456},"step-0-establish-upgrade-context",[458],{"type":48,"value":459},"Step 0: Establish Upgrade Context",{"type":42,"tag":461,"props":462,"children":463},"ol",{},[464,476,487],{"type":42,"tag":81,"props":465,"children":466},{},[467,469,474],{"type":48,"value":468},"Identify the ",{"type":42,"tag":57,"props":470,"children":471},{},[472],{"type":48,"value":473},"current released version",{"type":48,"value":475}," (what merchants have today)",{"type":42,"tag":81,"props":477,"children":478},{},[479,480,485],{"type":48,"value":468},{"type":42,"tag":57,"props":481,"children":482},{},[483],{"type":48,"value":484},"target version",{"type":48,"value":486}," (what is about to ship)",{"type":42,"tag":81,"props":488,"children":489},{},[490,492],{"type":48,"value":491},"Produce a diff summary:\n",{"type":42,"tag":77,"props":493,"children":494},{},[495,500,505,510,515,520],{"type":42,"tag":81,"props":496,"children":497},{},[498],{"type":48,"value":499},"Files added, modified, deleted",{"type":42,"tag":81,"props":501,"children":502},{},[503],{"type":48,"value":504},"Database schema changes (new tables, altered columns, new meta keys)",{"type":42,"tag":81,"props":506,"children":507},{},[508],{"type":48,"value":509},"Settings fields added, removed, or renamed",{"type":42,"tag":81,"props":511,"children":512},{},[513],{"type":48,"value":514},"Hooks\u002Ffilters added, removed, or signature-changed",{"type":42,"tag":81,"props":516,"children":517},{},[518],{"type":48,"value":519},"Payment Token schema changes",{"type":42,"tag":81,"props":521,"children":522},{},[523],{"type":48,"value":524},"Minimum version requirements changed (PHP, WP, WC)",{"type":42,"tag":51,"props":526,"children":527},{},[528],{"type":48,"value":529},"If both versions are in git:",{"type":42,"tag":531,"props":532,"children":537},"pre",{"className":533,"code":534,"language":535,"meta":536,"style":536},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","git diff v\u003Cold>..v\u003Cnew> --stat\ngit diff v\u003Cold>..v\u003Cnew> -- src\u002FData\u002F includes\u002Fclass-*-install.php\n","bash","",[538],{"type":42,"tag":88,"props":539,"children":540},{"__ignoreMap":536},[541,612],{"type":42,"tag":542,"props":543,"children":545},"span",{"class":544,"line":29},"line",[546,552,558,563,569,573,579,584,589,593,598,603,607],{"type":42,"tag":542,"props":547,"children":549},{"style":548},"--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B",[550],{"type":48,"value":551},"git",{"type":42,"tag":542,"props":553,"children":555},{"style":554},"--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D",[556],{"type":48,"value":557}," diff",{"type":42,"tag":542,"props":559,"children":560},{"style":554},[561],{"type":48,"value":562}," v",{"type":42,"tag":542,"props":564,"children":566},{"style":565},"--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF",[567],{"type":48,"value":568},"\u003C",{"type":42,"tag":542,"props":570,"children":571},{"style":554},[572],{"type":48,"value":461},{"type":42,"tag":542,"props":574,"children":576},{"style":575},"--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8",[577],{"type":48,"value":578},"d",{"type":42,"tag":542,"props":580,"children":581},{"style":565},[582],{"type":48,"value":583},">",{"type":42,"tag":542,"props":585,"children":586},{"style":554},[587],{"type":48,"value":588},"..v",{"type":42,"tag":542,"props":590,"children":591},{"style":565},[592],{"type":48,"value":568},{"type":42,"tag":542,"props":594,"children":595},{"style":554},[596],{"type":48,"value":597},"ne",{"type":42,"tag":542,"props":599,"children":600},{"style":575},[601],{"type":48,"value":602},"w",{"type":42,"tag":542,"props":604,"children":605},{"style":565},[606],{"type":48,"value":583},{"type":42,"tag":542,"props":608,"children":609},{"style":554},[610],{"type":48,"value":611}," --stat\n",{"type":42,"tag":542,"props":613,"children":615},{"class":544,"line":614},2,[616,620,624,628,632,636,640,644,648,652,656,660,664,669,674,679,684],{"type":42,"tag":542,"props":617,"children":618},{"style":548},[619],{"type":48,"value":551},{"type":42,"tag":542,"props":621,"children":622},{"style":554},[623],{"type":48,"value":557},{"type":42,"tag":542,"props":625,"children":626},{"style":554},[627],{"type":48,"value":562},{"type":42,"tag":542,"props":629,"children":630},{"style":565},[631],{"type":48,"value":568},{"type":42,"tag":542,"props":633,"children":634},{"style":554},[635],{"type":48,"value":461},{"type":42,"tag":542,"props":637,"children":638},{"style":575},[639],{"type":48,"value":578},{"type":42,"tag":542,"props":641,"children":642},{"style":565},[643],{"type":48,"value":583},{"type":42,"tag":542,"props":645,"children":646},{"style":554},[647],{"type":48,"value":588},{"type":42,"tag":542,"props":649,"children":650},{"style":565},[651],{"type":48,"value":568},{"type":42,"tag":542,"props":653,"children":654},{"style":554},[655],{"type":48,"value":597},{"type":42,"tag":542,"props":657,"children":658},{"style":575},[659],{"type":48,"value":602},{"type":42,"tag":542,"props":661,"children":662},{"style":565},[663],{"type":48,"value":583},{"type":42,"tag":542,"props":665,"children":666},{"style":554},[667],{"type":48,"value":668}," --",{"type":42,"tag":542,"props":670,"children":671},{"style":554},[672],{"type":48,"value":673}," src\u002FData\u002F",{"type":42,"tag":542,"props":675,"children":676},{"style":554},[677],{"type":48,"value":678}," includes\u002Fclass-",{"type":42,"tag":542,"props":680,"children":681},{"style":575},[682],{"type":48,"value":683},"*",{"type":42,"tag":542,"props":685,"children":686},{"style":554},[687],{"type":48,"value":688},"-install.php\n",{"type":42,"tag":451,"props":690,"children":691},{},[],{"type":42,"tag":65,"props":693,"children":695},{"id":694},"step-1-database-migration-safety",[696],{"type":48,"value":697},"Step 1: Database Migration Safety",{"type":42,"tag":699,"props":700,"children":702},"h3",{"id":701},"_11-schema-migrations",[703],{"type":48,"value":704},"1.1 Schema Migrations",{"type":42,"tag":77,"props":706,"children":709},{"className":707},[708],"contains-task-list",[710,730,746,755,764,789,813],{"type":42,"tag":81,"props":711,"children":714},{"className":712},[713],"task-list-item",[715,721,723,728],{"type":42,"tag":716,"props":717,"children":720},"input",{"disabled":718,"type":719},true,"checkbox",[],{"type":48,"value":722}," All schema changes use ",{"type":42,"tag":88,"props":724,"children":726},{"className":725},[],[727],{"type":48,"value":294},{"type":48,"value":729}," or equivalent safe migration pattern",{"type":42,"tag":81,"props":731,"children":733},{"className":732},[713],[734,737,739,744],{"type":42,"tag":716,"props":735,"children":736},{"disabled":718,"type":719},[],{"type":48,"value":738}," Migrations are ",{"type":42,"tag":57,"props":740,"children":741},{},[742],{"type":48,"value":743},"idempotent",{"type":48,"value":745}," -- running the upgrade routine twice produces the\nsame result (merchants may trigger activation multiple times)",{"type":42,"tag":81,"props":747,"children":749},{"className":748},[713],[750,753],{"type":42,"tag":716,"props":751,"children":752},{"disabled":718,"type":719},[],{"type":48,"value":754}," Column type changes are backwards-compatible (e.g., widening a VARCHAR, not\nnarrowing it)",{"type":42,"tag":81,"props":756,"children":758},{"className":757},[713],[759,762],{"type":42,"tag":716,"props":760,"children":761},{"disabled":718,"type":719},[],{"type":48,"value":763}," New required columns have sensible defaults so existing rows are valid",{"type":42,"tag":81,"props":765,"children":767},{"className":766},[713],[768,771,773,779,781,787],{"type":42,"tag":716,"props":769,"children":770},{"disabled":718,"type":719},[],{"type":48,"value":772}," No ",{"type":42,"tag":88,"props":774,"children":776},{"className":775},[],[777],{"type":48,"value":778},"DROP TABLE",{"type":48,"value":780}," or ",{"type":42,"tag":88,"props":782,"children":784},{"className":783},[],[785],{"type":48,"value":786},"DROP COLUMN",{"type":48,"value":788}," without a preceding version that stopped\nwriting to that table\u002Fcolumn (two-release deprecation pattern)",{"type":42,"tag":81,"props":790,"children":792},{"className":791},[713],[793,796,798,804,805,811],{"type":42,"tag":716,"props":794,"children":795},{"disabled":718,"type":719},[],{"type":48,"value":797}," Migration runs on ",{"type":42,"tag":88,"props":799,"children":801},{"className":800},[],[802],{"type":48,"value":803},"admin_init",{"type":48,"value":780},{"type":42,"tag":88,"props":806,"children":808},{"className":807},[],[809],{"type":48,"value":810},"plugins_loaded",{"type":48,"value":812}," with a version check gate,\nNOT on every page load",{"type":42,"tag":81,"props":814,"children":816},{"className":815},[713],[817,820,822,828],{"type":42,"tag":716,"props":818,"children":819},{"disabled":718,"type":719},[],{"type":48,"value":821}," Schema version is stored in ",{"type":42,"tag":88,"props":823,"children":825},{"className":824},[],[826],{"type":48,"value":827},"wp_options",{"type":48,"value":829}," and checked before running migrations",{"type":42,"tag":51,"props":831,"children":832},{},[833],{"type":42,"tag":57,"props":834,"children":835},{},[836],{"type":48,"value":837},"Severity:",{"type":42,"tag":219,"props":839,"children":840},{},[841,857],{"type":42,"tag":223,"props":842,"children":843},{},[844],{"type":42,"tag":227,"props":845,"children":846},{},[847,852],{"type":42,"tag":231,"props":848,"children":849},{},[850],{"type":48,"value":851},"Issue",{"type":42,"tag":231,"props":853,"children":854},{},[855],{"type":48,"value":856},"Level",{"type":42,"tag":242,"props":858,"children":859},{},[860,873,886,898],{"type":42,"tag":227,"props":861,"children":862},{},[863,868],{"type":42,"tag":249,"props":864,"children":865},{},[866],{"type":48,"value":867},"Data loss (DROP without migration)",{"type":42,"tag":249,"props":869,"children":870},{},[871],{"type":48,"value":872},"Critical",{"type":42,"tag":227,"props":874,"children":875},{},[876,881],{"type":42,"tag":249,"props":877,"children":878},{},[879],{"type":48,"value":880},"Non-idempotent migration",{"type":42,"tag":249,"props":882,"children":883},{},[884],{"type":48,"value":885},"High",{"type":42,"tag":227,"props":887,"children":888},{},[889,894],{"type":42,"tag":249,"props":890,"children":891},{},[892],{"type":48,"value":893},"Missing version gate (runs on every load)",{"type":42,"tag":249,"props":895,"children":896},{},[897],{"type":48,"value":885},{"type":42,"tag":227,"props":899,"children":900},{},[901,906],{"type":42,"tag":249,"props":902,"children":903},{},[904],{"type":48,"value":905},"No schema version tracking",{"type":42,"tag":249,"props":907,"children":908},{},[909],{"type":48,"value":910},"Medium",{"type":42,"tag":699,"props":912,"children":914},{"id":913},"_12-data-migrations",[915],{"type":48,"value":916},"1.2 Data Migrations",{"type":42,"tag":77,"props":918,"children":920},{"className":919},[708],[921,930,939,948,965],{"type":42,"tag":81,"props":922,"children":924},{"className":923},[713],[925,928],{"type":42,"tag":716,"props":926,"children":927},{"disabled":718,"type":719},[],{"type":48,"value":929}," Existing order meta is preserved or migrated to new keys (not silently orphaned)",{"type":42,"tag":81,"props":931,"children":933},{"className":932},[713],[934,937],{"type":42,"tag":716,"props":935,"children":936},{"disabled":718,"type":719},[],{"type":48,"value":938}," If meta keys are renamed: old keys are read as fallback during a transition\nperiod, not immediately deleted",{"type":42,"tag":81,"props":940,"children":942},{"className":941},[713],[943,946],{"type":42,"tag":716,"props":944,"children":945},{"disabled":718,"type":719},[],{"type":48,"value":947}," If data format changes (e.g., serialized -> JSON, or flat -> structured):\nmigration converts existing records, does not assume new format",{"type":42,"tag":81,"props":949,"children":951},{"className":950},[713],[952,955,957,963],{"type":42,"tag":716,"props":953,"children":954},{"disabled":718,"type":719},[],{"type":48,"value":956}," Migration handles large datasets without hitting PHP memory\u002Ftimeout limits\n(batch processing with ",{"type":42,"tag":88,"props":958,"children":960},{"className":959},[],[961],{"type":48,"value":962},"LIMIT",{"type":48,"value":964}," + offset, or Action Scheduler)",{"type":42,"tag":81,"props":966,"children":968},{"className":967},[713],[969,972,974,980,982,988,990,996,998,1004],{"type":42,"tag":716,"props":970,"children":971},{"disabled":718,"type":719},[],{"type":48,"value":973}," HPOS compatibility: if migrating order meta, works with both ",{"type":42,"tag":88,"props":975,"children":977},{"className":976},[],[978],{"type":48,"value":979},"wp_postmeta",{"type":48,"value":981}," and\n",{"type":42,"tag":88,"props":983,"children":985},{"className":984},[],[986],{"type":48,"value":987},"wc_orders_meta",{"type":48,"value":989}," tables (use ",{"type":42,"tag":88,"props":991,"children":993},{"className":992},[],[994],{"type":48,"value":995},"$order->get_meta()",{"type":48,"value":997}," \u002F ",{"type":42,"tag":88,"props":999,"children":1001},{"className":1000},[],[1002],{"type":48,"value":1003},"$order->update_meta_data()",{"type":48,"value":1005},",\nnever raw SQL against a specific table)",{"type":42,"tag":699,"props":1007,"children":1009},{"id":1008},"_13-options-settings-migrations",[1010],{"type":48,"value":1011},"1.3 Options \u002F Settings Migrations",{"type":42,"tag":77,"props":1013,"children":1015},{"className":1014},[708],[1016,1025,1034,1043],{"type":42,"tag":81,"props":1017,"children":1019},{"className":1018},[713],[1020,1023],{"type":42,"tag":716,"props":1021,"children":1022},{"disabled":718,"type":719},[],{"type":48,"value":1024}," If settings keys are renamed or restructured: old settings are read and migrated\non upgrade, not lost",{"type":42,"tag":81,"props":1026,"children":1028},{"className":1027},[713],[1029,1032],{"type":42,"tag":716,"props":1030,"children":1031},{"disabled":718,"type":719},[],{"type":48,"value":1033}," If settings are moved between storage backends (options -> custom table, or\nvice versa): migration runs before any code reads from the new location",{"type":42,"tag":81,"props":1035,"children":1037},{"className":1036},[713],[1038,1041],{"type":42,"tag":716,"props":1039,"children":1040},{"disabled":718,"type":719},[],{"type":48,"value":1042}," Autoloaded option size is checked -- migrations should not create large\nautoloaded options (>100KB triggers performance degradation)",{"type":42,"tag":81,"props":1044,"children":1046},{"className":1045},[713],[1047,1050,1052,1058],{"type":42,"tag":716,"props":1048,"children":1049},{"disabled":718,"type":719},[],{"type":48,"value":1051}," Default values for new settings are set during migration, not left to\n",{"type":42,"tag":88,"props":1053,"children":1055},{"className":1054},[],[1056],{"type":48,"value":1057},"get_option()",{"type":48,"value":1059}," fallback (avoids race conditions where code reads before\nmigration runs)",{"type":42,"tag":451,"props":1061,"children":1062},{},[],{"type":42,"tag":65,"props":1064,"children":1066},{"id":1065},"step-2-payment-continuity",[1067],{"type":48,"value":1068},"Step 2: Payment Continuity",{"type":42,"tag":51,"props":1070,"children":1071},{},[1072],{"type":48,"value":1073},"This section applies only to payment gateway plugins. Skip for non-payment plugins.",{"type":42,"tag":699,"props":1075,"children":1077},{"id":1076},"_21-saved-payment-tokens",[1078],{"type":48,"value":1079},"2.1 Saved Payment Tokens",{"type":42,"tag":77,"props":1081,"children":1083},{"className":1082},[708],[1084,1101,1110,1119,1128],{"type":42,"tag":81,"props":1085,"children":1087},{"className":1086},[713],[1088,1091,1093,1099],{"type":42,"tag":716,"props":1089,"children":1090},{"disabled":718,"type":719},[],{"type":48,"value":1092}," Existing saved payment tokens (",{"type":42,"tag":88,"props":1094,"children":1096},{"className":1095},[],[1097],{"type":48,"value":1098},"WC_Payment_Token_CC",{"type":48,"value":1100},", custom token types)\nremain valid and usable after upgrade",{"type":42,"tag":81,"props":1102,"children":1104},{"className":1103},[713],[1105,1108],{"type":42,"tag":716,"props":1106,"children":1107},{"disabled":718,"type":719},[],{"type":48,"value":1109}," If the token storage schema changes: migration converts existing tokens",{"type":42,"tag":81,"props":1111,"children":1113},{"className":1112},[713],[1114,1117],{"type":42,"tag":716,"props":1115,"children":1116},{"disabled":718,"type":719},[],{"type":48,"value":1118}," If switching from custom token storage to the WC Payment Token API (or vice\nversa): migration preserves all existing tokens",{"type":42,"tag":81,"props":1120,"children":1122},{"className":1121},[713],[1123,1126],{"type":42,"tag":716,"props":1124,"children":1125},{"disabled":718,"type":719},[],{"type":48,"value":1127}," If switching payment processor API versions: existing tokens are compatible or\nmigrated (e.g., Stripe Sources -> PaymentMethods migration)",{"type":42,"tag":81,"props":1129,"children":1131},{"className":1130},[713],[1132,1135],{"type":42,"tag":716,"props":1133,"children":1134},{"disabled":718,"type":719},[],{"type":48,"value":1136}," Merchants' customers can check out using saved cards immediately after upgrade\nwithout re-entering payment details",{"type":42,"tag":51,"props":1138,"children":1139},{},[1140,1144,1146,1150],{"type":42,"tag":57,"props":1141,"children":1142},{},[1143],{"type":48,"value":837},{"type":48,"value":1145}," Any token loss or breakage is ",{"type":42,"tag":57,"props":1147,"children":1148},{},[1149],{"type":48,"value":872},{"type":48,"value":1151}," -- merchants' customers lose\nsaved payment methods, increasing checkout friction and abandoned carts.",{"type":42,"tag":699,"props":1153,"children":1155},{"id":1154},"_22-active-subscriptions",[1156],{"type":48,"value":1157},"2.2 Active Subscriptions",{"type":42,"tag":77,"props":1159,"children":1161},{"className":1160},[708],[1162,1171,1180],{"type":42,"tag":81,"props":1163,"children":1165},{"className":1164},[713],[1166,1169],{"type":42,"tag":716,"props":1167,"children":1168},{"disabled":718,"type":719},[],{"type":48,"value":1170}," If the plugin supports WooCommerce Subscriptions: active subscription renewal\npayments will continue to process correctly after upgrade",{"type":42,"tag":81,"props":1172,"children":1174},{"className":1173},[713],[1175,1178],{"type":42,"tag":716,"props":1176,"children":1177},{"disabled":718,"type":719},[],{"type":48,"value":1179}," If the API integration changes: existing subscription payment profiles \u002F\nmandates are compatible with the new flow",{"type":42,"tag":81,"props":1181,"children":1183},{"className":1182},[713],[1184,1187,1189,1195],{"type":42,"tag":716,"props":1185,"children":1186},{"disabled":718,"type":719},[],{"type":48,"value":1188}," Renewal hooks (",{"type":42,"tag":88,"props":1190,"children":1192},{"className":1191},[],[1193],{"type":48,"value":1194},"scheduled_subscription_payment_{gateway_id}",{"type":48,"value":1196},") are still\nregistered with the same callback signature",{"type":42,"tag":699,"props":1198,"children":1200},{"id":1199},"_23-pending-transactions",[1201],{"type":48,"value":1202},"2.3 Pending Transactions",{"type":42,"tag":77,"props":1204,"children":1206},{"className":1205},[708],[1207,1231,1240],{"type":42,"tag":81,"props":1208,"children":1210},{"className":1209},[713],[1211,1214,1216,1222,1223,1229],{"type":42,"tag":716,"props":1212,"children":1213},{"disabled":718,"type":719},[],{"type":48,"value":1215}," Orders in ",{"type":42,"tag":88,"props":1217,"children":1219},{"className":1218},[],[1220],{"type":48,"value":1221},"pending",{"type":48,"value":780},{"type":42,"tag":88,"props":1224,"children":1226},{"className":1225},[],[1227],{"type":48,"value":1228},"on-hold",{"type":48,"value":1230}," status with this payment method can still be\ncompleted after upgrade",{"type":42,"tag":81,"props":1232,"children":1234},{"className":1233},[713],[1235,1238],{"type":42,"tag":716,"props":1236,"children":1237},{"disabled":718,"type":719},[],{"type":48,"value":1239}," Webhook\u002FIPN handlers still accept callbacks for transactions initiated before\nthe upgrade (old API format, old webhook signature scheme)",{"type":42,"tag":81,"props":1241,"children":1243},{"className":1242},[713],[1244,1247],{"type":42,"tag":716,"props":1245,"children":1246},{"disabled":718,"type":719},[],{"type":48,"value":1248}," If the webhook endpoint URL changes: old URL still routes to a handler (or\nreturns a meaningful error, not a 404)",{"type":42,"tag":451,"props":1250,"children":1251},{},[],{"type":42,"tag":65,"props":1253,"children":1255},{"id":1254},"step-3-hook-and-filter-compatibility",[1256],{"type":48,"value":1257},"Step 3: Hook and Filter Compatibility",{"type":42,"tag":699,"props":1259,"children":1261},{"id":1260},"_31-removed-or-renamed-hooks",[1262],{"type":48,"value":1263},"3.1 Removed or Renamed Hooks",{"type":42,"tag":77,"props":1265,"children":1267},{"className":1266},[708],[1268,1277,1286,1310],{"type":42,"tag":81,"props":1269,"children":1271},{"className":1270},[713],[1272,1275],{"type":42,"tag":716,"props":1273,"children":1274},{"disabled":718,"type":719},[],{"type":48,"value":1276}," List all hooks\u002Ffilters present in the current version but absent in the target",{"type":42,"tag":81,"props":1278,"children":1280},{"className":1279},[713],[1281,1284],{"type":42,"tag":716,"props":1282,"children":1283},{"disabled":718,"type":719},[],{"type":48,"value":1285}," For each removed hook: is there a replacement? Is the old hook deprecated with\na notice before removal? (Should follow two-release deprecation: deprecate in\nrelease N, remove in release N+2)",{"type":42,"tag":81,"props":1287,"children":1289},{"className":1288},[713],[1290,1293,1295,1301,1302,1308],{"type":42,"tag":716,"props":1291,"children":1292},{"disabled":718,"type":719},[],{"type":48,"value":1294}," ",{"type":42,"tag":88,"props":1296,"children":1298},{"className":1297},[],[1299],{"type":48,"value":1300},"_deprecated_hook()",{"type":48,"value":780},{"type":42,"tag":88,"props":1303,"children":1305},{"className":1304},[],[1306],{"type":48,"value":1307},"_deprecated_function()",{"type":48,"value":1309}," called for any removed or\nrenamed hooks\u002Ffunctions",{"type":42,"tag":81,"props":1311,"children":1313},{"className":1312},[713],[1314,1317],{"type":42,"tag":716,"props":1315,"children":1316},{"disabled":718,"type":719},[],{"type":48,"value":1318}," Third-party plugins or themes hooking into removed hooks will not fatal error",{"type":42,"tag":699,"props":1320,"children":1322},{"id":1321},"_32-changed-signatures",[1323],{"type":48,"value":1324},"3.2 Changed Signatures",{"type":42,"tag":77,"props":1326,"children":1328},{"className":1327},[708],[1329,1338,1347],{"type":42,"tag":81,"props":1330,"children":1332},{"className":1331},[713],[1333,1336],{"type":42,"tag":716,"props":1334,"children":1335},{"disabled":718,"type":719},[],{"type":48,"value":1337}," List all hooks\u002Ffilters where the number or type of parameters changed",{"type":42,"tag":81,"props":1339,"children":1341},{"className":1340},[713],[1342,1345],{"type":42,"tag":716,"props":1343,"children":1344},{"disabled":718,"type":719},[],{"type":48,"value":1346}," Changed signatures documented in the changelog",{"type":42,"tag":81,"props":1348,"children":1350},{"className":1349},[713],[1351,1354],{"type":42,"tag":716,"props":1352,"children":1353},{"disabled":718,"type":719},[],{"type":48,"value":1355}," If a filter return type changed: existing filter callbacks returning the old\ntype will not cause a fatal error or data corruption",{"type":42,"tag":699,"props":1357,"children":1359},{"id":1358},"_33-new-feature-declarations",[1360],{"type":48,"value":1361},"3.3 New Feature Declarations",{"type":42,"tag":77,"props":1363,"children":1365},{"className":1364},[708],[1366,1375,1384],{"type":42,"tag":81,"props":1367,"children":1369},{"className":1368},[713],[1370,1373],{"type":42,"tag":716,"props":1371,"children":1372},{"disabled":718,"type":719},[],{"type":48,"value":1374}," If the plugin newly declares HPOS compatibility: verified that the upgrade path\nfrom non-HPOS-aware to HPOS-aware does not break existing order access",{"type":42,"tag":81,"props":1376,"children":1378},{"className":1377},[713],[1379,1382],{"type":42,"tag":716,"props":1380,"children":1381},{"disabled":718,"type":719},[],{"type":48,"value":1383}," If the plugin newly declares block checkout compatibility: existing classic\ncheckout integrations still work (do not remove classic support when adding\nblocks support)",{"type":42,"tag":81,"props":1385,"children":1387},{"className":1386},[713],[1388,1391,1393,1399],{"type":42,"tag":716,"props":1389,"children":1390},{"disabled":718,"type":719},[],{"type":48,"value":1392}," New ",{"type":42,"tag":88,"props":1394,"children":1396},{"className":1395},[],[1397],{"type":48,"value":1398},"FeaturesUtil::declare_compatibility()",{"type":48,"value":1400}," calls are accurate (the plugin\nactually works with the feature, not just declaring it)",{"type":42,"tag":451,"props":1402,"children":1403},{},[],{"type":42,"tag":65,"props":1405,"children":1407},{"id":1406},"step-4-rollback-safety",[1408],{"type":48,"value":1409},"Step 4: Rollback Safety",{"type":42,"tag":699,"props":1411,"children":1413},{"id":1412},"_41-downgrade-resilience",[1414],{"type":48,"value":1415},"4.1 Downgrade Resilience",{"type":42,"tag":77,"props":1417,"children":1419},{"className":1418},[708],[1420,1429,1438,1454],{"type":42,"tag":81,"props":1421,"children":1423},{"className":1422},[713],[1424,1427],{"type":42,"tag":716,"props":1425,"children":1426},{"disabled":718,"type":719},[],{"type":48,"value":1428}," If a merchant downgrades to the previous version after upgrading: the plugin\ndoes not fatal error",{"type":42,"tag":81,"props":1430,"children":1432},{"className":1431},[713],[1433,1436],{"type":42,"tag":716,"props":1434,"children":1435},{"disabled":718,"type":719},[],{"type":48,"value":1437}," Database schema changes are forward-compatible: columns added by v2 do not\nbreak v1's queries (v1 ignores unknown columns)",{"type":42,"tag":81,"props":1439,"children":1441},{"className":1440},[713],[1442,1445,1447,1452],{"type":42,"tag":716,"props":1443,"children":1444},{"disabled":718,"type":719},[],{"type":48,"value":1446}," Settings added by v2 do not break v1's ",{"type":42,"tag":88,"props":1448,"children":1450},{"className":1449},[],[1451],{"type":48,"value":1057},{"type":48,"value":1453}," calls (v1 ignores\nunknown settings)",{"type":42,"tag":81,"props":1455,"children":1457},{"className":1456},[713],[1458,1461],{"type":42,"tag":716,"props":1459,"children":1460},{"disabled":718,"type":719},[],{"type":48,"value":1462}," If the migration is destructive (cannot be reversed): this is documented in the\nchangelog and release notes with a \"backup before upgrading\" warning",{"type":42,"tag":699,"props":1464,"children":1466},{"id":1465},"_42-wordpress-auto-update-safety",[1467],{"type":48,"value":1468},"4.2 WordPress Auto-Update Safety",{"type":42,"tag":77,"props":1470,"children":1472},{"className":1471},[708],[1473,1482,1491],{"type":42,"tag":81,"props":1474,"children":1476},{"className":1475},[713],[1477,1480],{"type":42,"tag":716,"props":1478,"children":1479},{"disabled":718,"type":719},[],{"type":48,"value":1481}," The plugin does not break WordPress auto-update compatibility",{"type":42,"tag":81,"props":1483,"children":1485},{"className":1484},[713],[1486,1489],{"type":42,"tag":716,"props":1487,"children":1488},{"disabled":718,"type":719},[],{"type":48,"value":1490}," If the upgrade requires manual steps (e.g., re-entering API credentials):\nan admin notice clearly communicates this after auto-update",{"type":42,"tag":81,"props":1492,"children":1494},{"className":1493},[713],[1495,1498,1500,1506],{"type":42,"tag":716,"props":1496,"children":1497},{"disabled":718,"type":719},[],{"type":48,"value":1499}," Post-upgrade tasks that require admin attention are surfaced via\n",{"type":42,"tag":88,"props":1501,"children":1503},{"className":1502},[],[1504],{"type":48,"value":1505},"WC_Admin_Notices",{"type":48,"value":1507}," or WordPress admin notices (not just changelog text)",{"type":42,"tag":451,"props":1509,"children":1510},{},[],{"type":42,"tag":65,"props":1512,"children":1514},{"id":1513},"step-5-changelog-and-merchant-communication",[1515],{"type":48,"value":1516},"Step 5: Changelog and Merchant Communication",{"type":42,"tag":699,"props":1518,"children":1520},{"id":1519},"_51-changelog-quality",[1521],{"type":48,"value":1522},"5.1 Changelog Quality",{"type":42,"tag":77,"props":1524,"children":1526},{"className":1525},[708],[1527,1536,1545,1554,1563],{"type":42,"tag":81,"props":1528,"children":1530},{"className":1529},[713],[1531,1534],{"type":42,"tag":716,"props":1532,"children":1533},{"disabled":718,"type":719},[],{"type":48,"value":1535}," Changelog entry exists for this release",{"type":42,"tag":81,"props":1537,"children":1539},{"className":1538},[713],[1540,1543],{"type":42,"tag":716,"props":1541,"children":1542},{"disabled":718,"type":719},[],{"type":48,"value":1544}," Format follows \"Keep a Changelog\" or WordPress conventions",{"type":42,"tag":81,"props":1546,"children":1548},{"className":1547},[713],[1549,1552],{"type":42,"tag":716,"props":1550,"children":1551},{"disabled":718,"type":719},[],{"type":48,"value":1553}," Breaking changes are called out explicitly (not buried in a list)",{"type":42,"tag":81,"props":1555,"children":1557},{"className":1556},[713],[1558,1561],{"type":42,"tag":716,"props":1559,"children":1560},{"disabled":718,"type":719},[],{"type":48,"value":1562}," Migration steps (if any) are documented with clear instructions",{"type":42,"tag":81,"props":1564,"children":1566},{"className":1565},[713],[1567,1570],{"type":42,"tag":716,"props":1568,"children":1569},{"disabled":718,"type":719},[],{"type":48,"value":1571}," Deprecated features are listed with their replacement",{"type":42,"tag":699,"props":1573,"children":1575},{"id":1574},"_52-upgrade-notice",[1576],{"type":48,"value":1577},"5.2 Upgrade Notice",{"type":42,"tag":77,"props":1579,"children":1581},{"className":1580},[708],[1582,1606,1615],{"type":42,"tag":81,"props":1583,"children":1585},{"className":1584},[713],[1586,1589,1590,1596,1598,1604],{"type":42,"tag":716,"props":1587,"children":1588},{"disabled":718,"type":719},[],{"type":48,"value":1294},{"type":42,"tag":88,"props":1591,"children":1593},{"className":1592},[],[1594],{"type":48,"value":1595},"readme.txt",{"type":48,"value":1597}," includes an ",{"type":42,"tag":88,"props":1599,"children":1601},{"className":1600},[],[1602],{"type":48,"value":1603},"== Upgrade Notice ==",{"type":48,"value":1605}," section for this version",{"type":42,"tag":81,"props":1607,"children":1609},{"className":1608},[713],[1610,1613],{"type":42,"tag":716,"props":1611,"children":1612},{"disabled":718,"type":719},[],{"type":48,"value":1614}," If the upgrade requires action: the notice says so clearly",{"type":42,"tag":81,"props":1616,"children":1618},{"className":1617},[713],[1619,1622],{"type":42,"tag":716,"props":1620,"children":1621},{"disabled":718,"type":719},[],{"type":48,"value":1623}," If the upgrade has breaking changes: severity is communicated (\"backup your\nsite before upgrading\")",{"type":42,"tag":699,"props":1625,"children":1627},{"id":1626},"_53-version-metadata",[1628],{"type":48,"value":1629},"5.3 Version Metadata",{"type":42,"tag":77,"props":1631,"children":1633},{"className":1632},[708],[1634,1651,1667,1682,1697],{"type":42,"tag":81,"props":1635,"children":1637},{"className":1636},[713],[1638,1641,1643,1649],{"type":42,"tag":716,"props":1639,"children":1640},{"disabled":718,"type":719},[],{"type":48,"value":1642}," Plugin header ",{"type":42,"tag":88,"props":1644,"children":1646},{"className":1645},[],[1647],{"type":48,"value":1648},"Version:",{"type":48,"value":1650}," matches the release tag",{"type":42,"tag":81,"props":1652,"children":1654},{"className":1653},[713],[1655,1658,1659,1665],{"type":42,"tag":716,"props":1656,"children":1657},{"disabled":718,"type":719},[],{"type":48,"value":1294},{"type":42,"tag":88,"props":1660,"children":1662},{"className":1661},[],[1663],{"type":48,"value":1664},"WC tested up to",{"type":48,"value":1666}," is updated to the latest WooCommerce release",{"type":42,"tag":81,"props":1668,"children":1670},{"className":1669},[713],[1671,1674,1675,1680],{"type":42,"tag":716,"props":1672,"children":1673},{"disabled":718,"type":719},[],{"type":48,"value":1294},{"type":42,"tag":88,"props":1676,"children":1678},{"className":1677},[],[1679],{"type":48,"value":423},{"type":48,"value":1681}," is updated if minimum requirements changed",{"type":42,"tag":81,"props":1683,"children":1685},{"className":1684},[713],[1686,1689,1690,1695],{"type":42,"tag":716,"props":1687,"children":1688},{"disabled":718,"type":719},[],{"type":48,"value":1294},{"type":42,"tag":88,"props":1691,"children":1693},{"className":1692},[],[1694],{"type":48,"value":437},{"type":48,"value":1696}," is updated if minimum PHP version changed",{"type":42,"tag":81,"props":1698,"children":1700},{"className":1699},[713],[1701,1704],{"type":42,"tag":716,"props":1702,"children":1703},{"disabled":718,"type":719},[],{"type":48,"value":1705}," If minimum requirements increased: changelog documents this and the upgrade\nnotice warns merchants on older versions",{"type":42,"tag":451,"props":1707,"children":1708},{},[],{"type":42,"tag":65,"props":1710,"children":1712},{"id":1711},"step-6-synthesize-upgrade-safety-report",[1713],{"type":48,"value":1714},"Step 6: Synthesize Upgrade Safety Report",{"type":42,"tag":699,"props":1716,"children":1718},{"id":1717},"deliverable-upgrade-safety-reportmd",[1719,1721],{"type":48,"value":1720},"Deliverable: ",{"type":42,"tag":88,"props":1722,"children":1724},{"className":1723},[],[1725],{"type":48,"value":1726},"upgrade-safety-report.md",{"type":42,"tag":531,"props":1728,"children":1732},{"className":1729,"code":1730,"language":1731,"meta":536,"style":536},"language-markdown shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","# Upgrade Safety Report\n## Plugin: [name] v[current] -> v[target]\n## Date: [date]\n\n### Upgrade Risk Level: [LOW \u002F MEDIUM \u002F HIGH \u002F CRITICAL]\n\n| Risk Level | Definition |\n|------------|------------|\n| LOW | No schema changes, no breaking changes, patch-level fixes |\n| MEDIUM | New settings or meta keys, new feature declarations, minor hook changes |\n| HIGH | Database schema changes, payment flow changes, deprecated hooks |\n| CRITICAL | Data migration required, payment token schema change, minimum version bump |\n\nNote: Major version bumps (X.0.0) start at HIGH minimum regardless of content.\n\n### Database Migrations\n| Migration | Idempotent | Batched | Reversible | Status |\n|-----------|-----------|---------|------------|--------|\n| [description] | Yes\u002FNo | Yes\u002FNo | Yes\u002FNo | PASS\u002FFAIL |\n\n### Payment Continuity\n| Check | Status | Notes |\n|-------|--------|-------|\n| Saved tokens preserved | PASS\u002FFAIL\u002FN\u002FA | [details] |\n| Active subscriptions safe | PASS\u002FFAIL\u002FN\u002FA | [details] |\n| Pending transactions safe | PASS\u002FFAIL\u002FN\u002FA | [details] |\n| Webhook backward compat | PASS\u002FFAIL\u002FN\u002FA | [details] |\n\n### Hook Compatibility\n| Hook\u002FFilter | Change | Deprecated? | Replacement | Status |\n|-------------|--------|-------------|-------------|--------|\n| [hook name] | Removed\u002FRenamed\u002FSignature | Yes\u002FNo | [replacement] | PASS\u002FFAIL |\n\n### Rollback Assessment\n- Downgrade safe: [Yes \u002F No \u002F Partial]\n- Auto-update safe: [Yes \u002F No -- requires manual steps]\n- Manual steps required: [list, or \"None\"]\n\n### Changelog Review\n- Breaking changes documented: [Yes \u002F No \u002F N\u002FA]\n- Upgrade notice present: [Yes \u002F No]\n- Version metadata current: [Yes \u002F No]\n\n### Prioritized Upgrade Issues\n\n## Critical\n### UPG-001: [Brief description]\n- **Category:** [Database \u002F Payment \u002F Hooks \u002F Rollback \u002F Changelog]\n- **File:** [path]\n- **Lines:** [N-M]\n- **Issue:** [What is wrong]\n- **Merchant Impact:** [What breaks for existing merchants]\n- **Fix:** [What to change, with before\u002Fafter code]\n- **Status:** [ ] Not started\n\n## High\n[...]\n\n## Medium\n[...]\n","markdown",[1733],{"type":42,"tag":88,"props":1734,"children":1735},{"__ignoreMap":536},[1736,1749,1813,1839,1848,1861,1869,1897,1906,1932,1958,1984,2010,2018,2027,2035,2048,2101,2110,2171,2179,2192,2226,2235,2279,2320,2361,2402,2410,2423,2475,2484,2543,2551,2564,2578,2591,2604,2612,2625,2638,2651,2664,2672,2685,2693,2706,2719,2749,2783,2817,2843,2869,2895,2921,2929,2942,2959,2967,2980],{"type":42,"tag":542,"props":1737,"children":1738},{"class":544,"line":29},[1739,1744],{"type":42,"tag":542,"props":1740,"children":1741},{"style":565},[1742],{"type":48,"value":1743},"# ",{"type":42,"tag":542,"props":1745,"children":1746},{"style":548},[1747],{"type":48,"value":1748},"Upgrade Safety Report\n",{"type":42,"tag":542,"props":1750,"children":1751},{"class":544,"line":614},[1752,1757,1762,1767,1772,1777,1781,1785,1790,1794,1799,1803,1808],{"type":42,"tag":542,"props":1753,"children":1754},{"style":565},[1755],{"type":48,"value":1756},"## ",{"type":42,"tag":542,"props":1758,"children":1759},{"style":548},[1760],{"type":48,"value":1761},"Plugin: ",{"type":42,"tag":542,"props":1763,"children":1764},{"style":565},[1765],{"type":48,"value":1766},"[",{"type":42,"tag":542,"props":1768,"children":1769},{"style":554},[1770],{"type":48,"value":1771},"name",{"type":42,"tag":542,"props":1773,"children":1774},{"style":565},[1775],{"type":48,"value":1776},"]",{"type":42,"tag":542,"props":1778,"children":1779},{"style":548},[1780],{"type":48,"value":562},{"type":42,"tag":542,"props":1782,"children":1783},{"style":565},[1784],{"type":48,"value":1766},{"type":42,"tag":542,"props":1786,"children":1787},{"style":554},[1788],{"type":48,"value":1789},"current",{"type":42,"tag":542,"props":1791,"children":1792},{"style":565},[1793],{"type":48,"value":1776},{"type":42,"tag":542,"props":1795,"children":1796},{"style":548},[1797],{"type":48,"value":1798}," -> v",{"type":42,"tag":542,"props":1800,"children":1801},{"style":565},[1802],{"type":48,"value":1766},{"type":42,"tag":542,"props":1804,"children":1805},{"style":554},[1806],{"type":48,"value":1807},"target",{"type":42,"tag":542,"props":1809,"children":1810},{"style":565},[1811],{"type":48,"value":1812},"]\n",{"type":42,"tag":542,"props":1814,"children":1816},{"class":544,"line":1815},3,[1817,1821,1826,1830,1835],{"type":42,"tag":542,"props":1818,"children":1819},{"style":565},[1820],{"type":48,"value":1756},{"type":42,"tag":542,"props":1822,"children":1823},{"style":548},[1824],{"type":48,"value":1825},"Date: ",{"type":42,"tag":542,"props":1827,"children":1828},{"style":565},[1829],{"type":48,"value":1766},{"type":42,"tag":542,"props":1831,"children":1832},{"style":554},[1833],{"type":48,"value":1834},"date",{"type":42,"tag":542,"props":1836,"children":1837},{"style":565},[1838],{"type":48,"value":1812},{"type":42,"tag":542,"props":1840,"children":1842},{"class":544,"line":1841},4,[1843],{"type":42,"tag":542,"props":1844,"children":1845},{"emptyLinePlaceholder":718},[1846],{"type":48,"value":1847},"\n",{"type":42,"tag":542,"props":1849,"children":1850},{"class":544,"line":25},[1851,1856],{"type":42,"tag":542,"props":1852,"children":1853},{"style":565},[1854],{"type":48,"value":1855},"### ",{"type":42,"tag":542,"props":1857,"children":1858},{"style":548},[1859],{"type":48,"value":1860},"Upgrade Risk Level: [LOW \u002F MEDIUM \u002F HIGH \u002F CRITICAL]\n",{"type":42,"tag":542,"props":1862,"children":1864},{"class":544,"line":1863},6,[1865],{"type":42,"tag":542,"props":1866,"children":1867},{"emptyLinePlaceholder":718},[1868],{"type":48,"value":1847},{"type":42,"tag":542,"props":1870,"children":1872},{"class":544,"line":1871},7,[1873,1878,1883,1887,1892],{"type":42,"tag":542,"props":1874,"children":1875},{"style":565},[1876],{"type":48,"value":1877},"|",{"type":42,"tag":542,"props":1879,"children":1880},{"style":575},[1881],{"type":48,"value":1882}," Risk Level ",{"type":42,"tag":542,"props":1884,"children":1885},{"style":565},[1886],{"type":48,"value":1877},{"type":42,"tag":542,"props":1888,"children":1889},{"style":575},[1890],{"type":48,"value":1891}," Definition ",{"type":42,"tag":542,"props":1893,"children":1894},{"style":565},[1895],{"type":48,"value":1896},"|\n",{"type":42,"tag":542,"props":1898,"children":1900},{"class":544,"line":1899},8,[1901],{"type":42,"tag":542,"props":1902,"children":1903},{"style":565},[1904],{"type":48,"value":1905},"|------------|------------|\n",{"type":42,"tag":542,"props":1907,"children":1909},{"class":544,"line":1908},9,[1910,1914,1919,1923,1928],{"type":42,"tag":542,"props":1911,"children":1912},{"style":565},[1913],{"type":48,"value":1877},{"type":42,"tag":542,"props":1915,"children":1916},{"style":575},[1917],{"type":48,"value":1918}," LOW ",{"type":42,"tag":542,"props":1920,"children":1921},{"style":565},[1922],{"type":48,"value":1877},{"type":42,"tag":542,"props":1924,"children":1925},{"style":575},[1926],{"type":48,"value":1927}," No schema changes, no breaking changes, patch-level fixes ",{"type":42,"tag":542,"props":1929,"children":1930},{"style":565},[1931],{"type":48,"value":1896},{"type":42,"tag":542,"props":1933,"children":1935},{"class":544,"line":1934},10,[1936,1940,1945,1949,1954],{"type":42,"tag":542,"props":1937,"children":1938},{"style":565},[1939],{"type":48,"value":1877},{"type":42,"tag":542,"props":1941,"children":1942},{"style":575},[1943],{"type":48,"value":1944}," MEDIUM ",{"type":42,"tag":542,"props":1946,"children":1947},{"style":565},[1948],{"type":48,"value":1877},{"type":42,"tag":542,"props":1950,"children":1951},{"style":575},[1952],{"type":48,"value":1953}," New settings or meta keys, new feature declarations, minor hook changes ",{"type":42,"tag":542,"props":1955,"children":1956},{"style":565},[1957],{"type":48,"value":1896},{"type":42,"tag":542,"props":1959,"children":1961},{"class":544,"line":1960},11,[1962,1966,1971,1975,1980],{"type":42,"tag":542,"props":1963,"children":1964},{"style":565},[1965],{"type":48,"value":1877},{"type":42,"tag":542,"props":1967,"children":1968},{"style":575},[1969],{"type":48,"value":1970}," HIGH ",{"type":42,"tag":542,"props":1972,"children":1973},{"style":565},[1974],{"type":48,"value":1877},{"type":42,"tag":542,"props":1976,"children":1977},{"style":575},[1978],{"type":48,"value":1979}," Database schema changes, payment flow changes, deprecated hooks ",{"type":42,"tag":542,"props":1981,"children":1982},{"style":565},[1983],{"type":48,"value":1896},{"type":42,"tag":542,"props":1985,"children":1987},{"class":544,"line":1986},12,[1988,1992,1997,2001,2006],{"type":42,"tag":542,"props":1989,"children":1990},{"style":565},[1991],{"type":48,"value":1877},{"type":42,"tag":542,"props":1993,"children":1994},{"style":575},[1995],{"type":48,"value":1996}," CRITICAL ",{"type":42,"tag":542,"props":1998,"children":1999},{"style":565},[2000],{"type":48,"value":1877},{"type":42,"tag":542,"props":2002,"children":2003},{"style":575},[2004],{"type":48,"value":2005}," Data migration required, payment token schema change, minimum version bump ",{"type":42,"tag":542,"props":2007,"children":2008},{"style":565},[2009],{"type":48,"value":1896},{"type":42,"tag":542,"props":2011,"children":2013},{"class":544,"line":2012},13,[2014],{"type":42,"tag":542,"props":2015,"children":2016},{"emptyLinePlaceholder":718},[2017],{"type":48,"value":1847},{"type":42,"tag":542,"props":2019,"children":2021},{"class":544,"line":2020},14,[2022],{"type":42,"tag":542,"props":2023,"children":2024},{"style":575},[2025],{"type":48,"value":2026},"Note: Major version bumps (X.0.0) start at HIGH minimum regardless of content.\n",{"type":42,"tag":542,"props":2028,"children":2030},{"class":544,"line":2029},15,[2031],{"type":42,"tag":542,"props":2032,"children":2033},{"emptyLinePlaceholder":718},[2034],{"type":48,"value":1847},{"type":42,"tag":542,"props":2036,"children":2038},{"class":544,"line":2037},16,[2039,2043],{"type":42,"tag":542,"props":2040,"children":2041},{"style":565},[2042],{"type":48,"value":1855},{"type":42,"tag":542,"props":2044,"children":2045},{"style":548},[2046],{"type":48,"value":2047},"Database Migrations\n",{"type":42,"tag":542,"props":2049,"children":2051},{"class":544,"line":2050},17,[2052,2056,2061,2065,2070,2074,2079,2083,2088,2092,2097],{"type":42,"tag":542,"props":2053,"children":2054},{"style":565},[2055],{"type":48,"value":1877},{"type":42,"tag":542,"props":2057,"children":2058},{"style":575},[2059],{"type":48,"value":2060}," Migration ",{"type":42,"tag":542,"props":2062,"children":2063},{"style":565},[2064],{"type":48,"value":1877},{"type":42,"tag":542,"props":2066,"children":2067},{"style":575},[2068],{"type":48,"value":2069}," Idempotent ",{"type":42,"tag":542,"props":2071,"children":2072},{"style":565},[2073],{"type":48,"value":1877},{"type":42,"tag":542,"props":2075,"children":2076},{"style":575},[2077],{"type":48,"value":2078}," Batched ",{"type":42,"tag":542,"props":2080,"children":2081},{"style":565},[2082],{"type":48,"value":1877},{"type":42,"tag":542,"props":2084,"children":2085},{"style":575},[2086],{"type":48,"value":2087}," Reversible ",{"type":42,"tag":542,"props":2089,"children":2090},{"style":565},[2091],{"type":48,"value":1877},{"type":42,"tag":542,"props":2093,"children":2094},{"style":575},[2095],{"type":48,"value":2096}," Status ",{"type":42,"tag":542,"props":2098,"children":2099},{"style":565},[2100],{"type":48,"value":1896},{"type":42,"tag":542,"props":2102,"children":2104},{"class":544,"line":2103},18,[2105],{"type":42,"tag":542,"props":2106,"children":2107},{"style":565},[2108],{"type":48,"value":2109},"|-----------|-----------|---------|------------|--------|\n",{"type":42,"tag":542,"props":2111,"children":2113},{"class":544,"line":2112},19,[2114,2118,2123,2128,2132,2137,2142,2146,2150,2154,2158,2162,2167],{"type":42,"tag":542,"props":2115,"children":2116},{"style":565},[2117],{"type":48,"value":1877},{"type":42,"tag":542,"props":2119,"children":2120},{"style":565},[2121],{"type":48,"value":2122}," [",{"type":42,"tag":542,"props":2124,"children":2125},{"style":554},[2126],{"type":48,"value":2127},"description",{"type":42,"tag":542,"props":2129,"children":2130},{"style":565},[2131],{"type":48,"value":1776},{"type":42,"tag":542,"props":2133,"children":2134},{"style":565},[2135],{"type":48,"value":2136}," |",{"type":42,"tag":542,"props":2138,"children":2139},{"style":575},[2140],{"type":48,"value":2141}," Yes\u002FNo ",{"type":42,"tag":542,"props":2143,"children":2144},{"style":565},[2145],{"type":48,"value":1877},{"type":42,"tag":542,"props":2147,"children":2148},{"style":575},[2149],{"type":48,"value":2141},{"type":42,"tag":542,"props":2151,"children":2152},{"style":565},[2153],{"type":48,"value":1877},{"type":42,"tag":542,"props":2155,"children":2156},{"style":575},[2157],{"type":48,"value":2141},{"type":42,"tag":542,"props":2159,"children":2160},{"style":565},[2161],{"type":48,"value":1877},{"type":42,"tag":542,"props":2163,"children":2164},{"style":575},[2165],{"type":48,"value":2166}," PASS\u002FFAIL ",{"type":42,"tag":542,"props":2168,"children":2169},{"style":565},[2170],{"type":48,"value":1896},{"type":42,"tag":542,"props":2172,"children":2174},{"class":544,"line":2173},20,[2175],{"type":42,"tag":542,"props":2176,"children":2177},{"emptyLinePlaceholder":718},[2178],{"type":48,"value":1847},{"type":42,"tag":542,"props":2180,"children":2182},{"class":544,"line":2181},21,[2183,2187],{"type":42,"tag":542,"props":2184,"children":2185},{"style":565},[2186],{"type":48,"value":1855},{"type":42,"tag":542,"props":2188,"children":2189},{"style":548},[2190],{"type":48,"value":2191},"Payment Continuity\n",{"type":42,"tag":542,"props":2193,"children":2195},{"class":544,"line":2194},22,[2196,2200,2205,2209,2213,2217,2222],{"type":42,"tag":542,"props":2197,"children":2198},{"style":565},[2199],{"type":48,"value":1877},{"type":42,"tag":542,"props":2201,"children":2202},{"style":575},[2203],{"type":48,"value":2204}," Check ",{"type":42,"tag":542,"props":2206,"children":2207},{"style":565},[2208],{"type":48,"value":1877},{"type":42,"tag":542,"props":2210,"children":2211},{"style":575},[2212],{"type":48,"value":2096},{"type":42,"tag":542,"props":2214,"children":2215},{"style":565},[2216],{"type":48,"value":1877},{"type":42,"tag":542,"props":2218,"children":2219},{"style":575},[2220],{"type":48,"value":2221}," Notes ",{"type":42,"tag":542,"props":2223,"children":2224},{"style":565},[2225],{"type":48,"value":1896},{"type":42,"tag":542,"props":2227,"children":2229},{"class":544,"line":2228},23,[2230],{"type":42,"tag":542,"props":2231,"children":2232},{"style":565},[2233],{"type":48,"value":2234},"|-------|--------|-------|\n",{"type":42,"tag":542,"props":2236,"children":2238},{"class":544,"line":2237},24,[2239,2243,2248,2252,2257,2261,2265,2270,2274],{"type":42,"tag":542,"props":2240,"children":2241},{"style":565},[2242],{"type":48,"value":1877},{"type":42,"tag":542,"props":2244,"children":2245},{"style":575},[2246],{"type":48,"value":2247}," Saved tokens preserved ",{"type":42,"tag":542,"props":2249,"children":2250},{"style":565},[2251],{"type":48,"value":1877},{"type":42,"tag":542,"props":2253,"children":2254},{"style":575},[2255],{"type":48,"value":2256}," PASS\u002FFAIL\u002FN\u002FA ",{"type":42,"tag":542,"props":2258,"children":2259},{"style":565},[2260],{"type":48,"value":1877},{"type":42,"tag":542,"props":2262,"children":2263},{"style":565},[2264],{"type":48,"value":2122},{"type":42,"tag":542,"props":2266,"children":2267},{"style":554},[2268],{"type":48,"value":2269},"details",{"type":42,"tag":542,"props":2271,"children":2272},{"style":565},[2273],{"type":48,"value":1776},{"type":42,"tag":542,"props":2275,"children":2276},{"style":565},[2277],{"type":48,"value":2278}," |\n",{"type":42,"tag":542,"props":2280,"children":2282},{"class":544,"line":2281},25,[2283,2287,2292,2296,2300,2304,2308,2312,2316],{"type":42,"tag":542,"props":2284,"children":2285},{"style":565},[2286],{"type":48,"value":1877},{"type":42,"tag":542,"props":2288,"children":2289},{"style":575},[2290],{"type":48,"value":2291}," Active subscriptions safe ",{"type":42,"tag":542,"props":2293,"children":2294},{"style":565},[2295],{"type":48,"value":1877},{"type":42,"tag":542,"props":2297,"children":2298},{"style":575},[2299],{"type":48,"value":2256},{"type":42,"tag":542,"props":2301,"children":2302},{"style":565},[2303],{"type":48,"value":1877},{"type":42,"tag":542,"props":2305,"children":2306},{"style":565},[2307],{"type":48,"value":2122},{"type":42,"tag":542,"props":2309,"children":2310},{"style":554},[2311],{"type":48,"value":2269},{"type":42,"tag":542,"props":2313,"children":2314},{"style":565},[2315],{"type":48,"value":1776},{"type":42,"tag":542,"props":2317,"children":2318},{"style":565},[2319],{"type":48,"value":2278},{"type":42,"tag":542,"props":2321,"children":2323},{"class":544,"line":2322},26,[2324,2328,2333,2337,2341,2345,2349,2353,2357],{"type":42,"tag":542,"props":2325,"children":2326},{"style":565},[2327],{"type":48,"value":1877},{"type":42,"tag":542,"props":2329,"children":2330},{"style":575},[2331],{"type":48,"value":2332}," Pending transactions safe ",{"type":42,"tag":542,"props":2334,"children":2335},{"style":565},[2336],{"type":48,"value":1877},{"type":42,"tag":542,"props":2338,"children":2339},{"style":575},[2340],{"type":48,"value":2256},{"type":42,"tag":542,"props":2342,"children":2343},{"style":565},[2344],{"type":48,"value":1877},{"type":42,"tag":542,"props":2346,"children":2347},{"style":565},[2348],{"type":48,"value":2122},{"type":42,"tag":542,"props":2350,"children":2351},{"style":554},[2352],{"type":48,"value":2269},{"type":42,"tag":542,"props":2354,"children":2355},{"style":565},[2356],{"type":48,"value":1776},{"type":42,"tag":542,"props":2358,"children":2359},{"style":565},[2360],{"type":48,"value":2278},{"type":42,"tag":542,"props":2362,"children":2364},{"class":544,"line":2363},27,[2365,2369,2374,2378,2382,2386,2390,2394,2398],{"type":42,"tag":542,"props":2366,"children":2367},{"style":565},[2368],{"type":48,"value":1877},{"type":42,"tag":542,"props":2370,"children":2371},{"style":575},[2372],{"type":48,"value":2373}," Webhook backward compat ",{"type":42,"tag":542,"props":2375,"children":2376},{"style":565},[2377],{"type":48,"value":1877},{"type":42,"tag":542,"props":2379,"children":2380},{"style":575},[2381],{"type":48,"value":2256},{"type":42,"tag":542,"props":2383,"children":2384},{"style":565},[2385],{"type":48,"value":1877},{"type":42,"tag":542,"props":2387,"children":2388},{"style":565},[2389],{"type":48,"value":2122},{"type":42,"tag":542,"props":2391,"children":2392},{"style":554},[2393],{"type":48,"value":2269},{"type":42,"tag":542,"props":2395,"children":2396},{"style":565},[2397],{"type":48,"value":1776},{"type":42,"tag":542,"props":2399,"children":2400},{"style":565},[2401],{"type":48,"value":2278},{"type":42,"tag":542,"props":2403,"children":2405},{"class":544,"line":2404},28,[2406],{"type":42,"tag":542,"props":2407,"children":2408},{"emptyLinePlaceholder":718},[2409],{"type":48,"value":1847},{"type":42,"tag":542,"props":2411,"children":2413},{"class":544,"line":2412},29,[2414,2418],{"type":42,"tag":542,"props":2415,"children":2416},{"style":565},[2417],{"type":48,"value":1855},{"type":42,"tag":542,"props":2419,"children":2420},{"style":548},[2421],{"type":48,"value":2422},"Hook Compatibility\n",{"type":42,"tag":542,"props":2424,"children":2426},{"class":544,"line":2425},30,[2427,2431,2436,2440,2445,2449,2454,2458,2463,2467,2471],{"type":42,"tag":542,"props":2428,"children":2429},{"style":565},[2430],{"type":48,"value":1877},{"type":42,"tag":542,"props":2432,"children":2433},{"style":575},[2434],{"type":48,"value":2435}," Hook\u002FFilter ",{"type":42,"tag":542,"props":2437,"children":2438},{"style":565},[2439],{"type":48,"value":1877},{"type":42,"tag":542,"props":2441,"children":2442},{"style":575},[2443],{"type":48,"value":2444}," Change ",{"type":42,"tag":542,"props":2446,"children":2447},{"style":565},[2448],{"type":48,"value":1877},{"type":42,"tag":542,"props":2450,"children":2451},{"style":575},[2452],{"type":48,"value":2453}," Deprecated? ",{"type":42,"tag":542,"props":2455,"children":2456},{"style":565},[2457],{"type":48,"value":1877},{"type":42,"tag":542,"props":2459,"children":2460},{"style":575},[2461],{"type":48,"value":2462}," Replacement ",{"type":42,"tag":542,"props":2464,"children":2465},{"style":565},[2466],{"type":48,"value":1877},{"type":42,"tag":542,"props":2468,"children":2469},{"style":575},[2470],{"type":48,"value":2096},{"type":42,"tag":542,"props":2472,"children":2473},{"style":565},[2474],{"type":48,"value":1896},{"type":42,"tag":542,"props":2476,"children":2478},{"class":544,"line":2477},31,[2479],{"type":42,"tag":542,"props":2480,"children":2481},{"style":565},[2482],{"type":48,"value":2483},"|-------------|--------|-------------|-------------|--------|\n",{"type":42,"tag":542,"props":2485,"children":2487},{"class":544,"line":2486},32,[2488,2492,2497,2501,2506,2510,2514,2518,2522,2527,2531,2535,2539],{"type":42,"tag":542,"props":2489,"children":2490},{"style":565},[2491],{"type":48,"value":1877},{"type":42,"tag":542,"props":2493,"children":2494},{"style":575},[2495],{"type":48,"value":2496}," [hook name] ",{"type":42,"tag":542,"props":2498,"children":2499},{"style":565},[2500],{"type":48,"value":1877},{"type":42,"tag":542,"props":2502,"children":2503},{"style":575},[2504],{"type":48,"value":2505}," Removed\u002FRenamed\u002FSignature ",{"type":42,"tag":542,"props":2507,"children":2508},{"style":565},[2509],{"type":48,"value":1877},{"type":42,"tag":542,"props":2511,"children":2512},{"style":575},[2513],{"type":48,"value":2141},{"type":42,"tag":542,"props":2515,"children":2516},{"style":565},[2517],{"type":48,"value":1877},{"type":42,"tag":542,"props":2519,"children":2520},{"style":565},[2521],{"type":48,"value":2122},{"type":42,"tag":542,"props":2523,"children":2524},{"style":554},[2525],{"type":48,"value":2526},"replacement",{"type":42,"tag":542,"props":2528,"children":2529},{"style":565},[2530],{"type":48,"value":1776},{"type":42,"tag":542,"props":2532,"children":2533},{"style":565},[2534],{"type":48,"value":2136},{"type":42,"tag":542,"props":2536,"children":2537},{"style":575},[2538],{"type":48,"value":2166},{"type":42,"tag":542,"props":2540,"children":2541},{"style":565},[2542],{"type":48,"value":1896},{"type":42,"tag":542,"props":2544,"children":2546},{"class":544,"line":2545},33,[2547],{"type":42,"tag":542,"props":2548,"children":2549},{"emptyLinePlaceholder":718},[2550],{"type":48,"value":1847},{"type":42,"tag":542,"props":2552,"children":2554},{"class":544,"line":2553},34,[2555,2559],{"type":42,"tag":542,"props":2556,"children":2557},{"style":565},[2558],{"type":48,"value":1855},{"type":42,"tag":542,"props":2560,"children":2561},{"style":548},[2562],{"type":48,"value":2563},"Rollback Assessment\n",{"type":42,"tag":542,"props":2565,"children":2567},{"class":544,"line":2566},35,[2568,2573],{"type":42,"tag":542,"props":2569,"children":2570},{"style":565},[2571],{"type":48,"value":2572},"-",{"type":42,"tag":542,"props":2574,"children":2575},{"style":575},[2576],{"type":48,"value":2577}," Downgrade safe: [Yes \u002F No \u002F Partial]\n",{"type":42,"tag":542,"props":2579,"children":2581},{"class":544,"line":2580},36,[2582,2586],{"type":42,"tag":542,"props":2583,"children":2584},{"style":565},[2585],{"type":48,"value":2572},{"type":42,"tag":542,"props":2587,"children":2588},{"style":575},[2589],{"type":48,"value":2590}," Auto-update safe: [Yes \u002F No -- requires manual steps]\n",{"type":42,"tag":542,"props":2592,"children":2594},{"class":544,"line":2593},37,[2595,2599],{"type":42,"tag":542,"props":2596,"children":2597},{"style":565},[2598],{"type":48,"value":2572},{"type":42,"tag":542,"props":2600,"children":2601},{"style":575},[2602],{"type":48,"value":2603}," Manual steps required: [list, or \"None\"]\n",{"type":42,"tag":542,"props":2605,"children":2607},{"class":544,"line":2606},38,[2608],{"type":42,"tag":542,"props":2609,"children":2610},{"emptyLinePlaceholder":718},[2611],{"type":48,"value":1847},{"type":42,"tag":542,"props":2613,"children":2615},{"class":544,"line":2614},39,[2616,2620],{"type":42,"tag":542,"props":2617,"children":2618},{"style":565},[2619],{"type":48,"value":1855},{"type":42,"tag":542,"props":2621,"children":2622},{"style":548},[2623],{"type":48,"value":2624},"Changelog Review\n",{"type":42,"tag":542,"props":2626,"children":2628},{"class":544,"line":2627},40,[2629,2633],{"type":42,"tag":542,"props":2630,"children":2631},{"style":565},[2632],{"type":48,"value":2572},{"type":42,"tag":542,"props":2634,"children":2635},{"style":575},[2636],{"type":48,"value":2637}," Breaking changes documented: [Yes \u002F No \u002F N\u002FA]\n",{"type":42,"tag":542,"props":2639,"children":2641},{"class":544,"line":2640},41,[2642,2646],{"type":42,"tag":542,"props":2643,"children":2644},{"style":565},[2645],{"type":48,"value":2572},{"type":42,"tag":542,"props":2647,"children":2648},{"style":575},[2649],{"type":48,"value":2650}," Upgrade notice present: [Yes \u002F No]\n",{"type":42,"tag":542,"props":2652,"children":2654},{"class":544,"line":2653},42,[2655,2659],{"type":42,"tag":542,"props":2656,"children":2657},{"style":565},[2658],{"type":48,"value":2572},{"type":42,"tag":542,"props":2660,"children":2661},{"style":575},[2662],{"type":48,"value":2663}," Version metadata current: [Yes \u002F No]\n",{"type":42,"tag":542,"props":2665,"children":2667},{"class":544,"line":2666},43,[2668],{"type":42,"tag":542,"props":2669,"children":2670},{"emptyLinePlaceholder":718},[2671],{"type":48,"value":1847},{"type":42,"tag":542,"props":2673,"children":2675},{"class":544,"line":2674},44,[2676,2680],{"type":42,"tag":542,"props":2677,"children":2678},{"style":565},[2679],{"type":48,"value":1855},{"type":42,"tag":542,"props":2681,"children":2682},{"style":548},[2683],{"type":48,"value":2684},"Prioritized Upgrade Issues\n",{"type":42,"tag":542,"props":2686,"children":2688},{"class":544,"line":2687},45,[2689],{"type":42,"tag":542,"props":2690,"children":2691},{"emptyLinePlaceholder":718},[2692],{"type":48,"value":1847},{"type":42,"tag":542,"props":2694,"children":2696},{"class":544,"line":2695},46,[2697,2701],{"type":42,"tag":542,"props":2698,"children":2699},{"style":565},[2700],{"type":48,"value":1756},{"type":42,"tag":542,"props":2702,"children":2703},{"style":548},[2704],{"type":48,"value":2705},"Critical\n",{"type":42,"tag":542,"props":2707,"children":2709},{"class":544,"line":2708},47,[2710,2714],{"type":42,"tag":542,"props":2711,"children":2712},{"style":565},[2713],{"type":48,"value":1855},{"type":42,"tag":542,"props":2715,"children":2716},{"style":548},[2717],{"type":48,"value":2718},"UPG-001: [Brief description]\n",{"type":42,"tag":542,"props":2720,"children":2722},{"class":544,"line":2721},48,[2723,2727,2733,2739,2744],{"type":42,"tag":542,"props":2724,"children":2725},{"style":565},[2726],{"type":48,"value":2572},{"type":42,"tag":542,"props":2728,"children":2730},{"style":2729},"--shiki-light:#39ADB5;--shiki-light-font-weight:bold;--shiki-default:#89DDFF;--shiki-default-font-weight:bold;--shiki-dark:#89DDFF;--shiki-dark-font-weight:bold",[2731],{"type":48,"value":2732}," **",{"type":42,"tag":542,"props":2734,"children":2736},{"style":2735},"--shiki-light:#E53935;--shiki-light-font-weight:bold;--shiki-default:#F07178;--shiki-default-font-weight:bold;--shiki-dark:#F07178;--shiki-dark-font-weight:bold",[2737],{"type":48,"value":2738},"Category:",{"type":42,"tag":542,"props":2740,"children":2741},{"style":2729},[2742],{"type":48,"value":2743},"**",{"type":42,"tag":542,"props":2745,"children":2746},{"style":575},[2747],{"type":48,"value":2748}," [Database \u002F Payment \u002F Hooks \u002F Rollback \u002F Changelog]\n",{"type":42,"tag":542,"props":2750,"children":2752},{"class":544,"line":2751},49,[2753,2757,2761,2766,2770,2774,2779],{"type":42,"tag":542,"props":2754,"children":2755},{"style":565},[2756],{"type":48,"value":2572},{"type":42,"tag":542,"props":2758,"children":2759},{"style":2729},[2760],{"type":48,"value":2732},{"type":42,"tag":542,"props":2762,"children":2763},{"style":2735},[2764],{"type":48,"value":2765},"File:",{"type":42,"tag":542,"props":2767,"children":2768},{"style":2729},[2769],{"type":48,"value":2743},{"type":42,"tag":542,"props":2771,"children":2772},{"style":565},[2773],{"type":48,"value":2122},{"type":42,"tag":542,"props":2775,"children":2776},{"style":554},[2777],{"type":48,"value":2778},"path",{"type":42,"tag":542,"props":2780,"children":2781},{"style":565},[2782],{"type":48,"value":1812},{"type":42,"tag":542,"props":2784,"children":2786},{"class":544,"line":2785},50,[2787,2791,2795,2800,2804,2808,2813],{"type":42,"tag":542,"props":2788,"children":2789},{"style":565},[2790],{"type":48,"value":2572},{"type":42,"tag":542,"props":2792,"children":2793},{"style":2729},[2794],{"type":48,"value":2732},{"type":42,"tag":542,"props":2796,"children":2797},{"style":2735},[2798],{"type":48,"value":2799},"Lines:",{"type":42,"tag":542,"props":2801,"children":2802},{"style":2729},[2803],{"type":48,"value":2743},{"type":42,"tag":542,"props":2805,"children":2806},{"style":565},[2807],{"type":48,"value":2122},{"type":42,"tag":542,"props":2809,"children":2810},{"style":554},[2811],{"type":48,"value":2812},"N-M",{"type":42,"tag":542,"props":2814,"children":2815},{"style":565},[2816],{"type":48,"value":1812},{"type":42,"tag":542,"props":2818,"children":2820},{"class":544,"line":2819},51,[2821,2825,2829,2834,2838],{"type":42,"tag":542,"props":2822,"children":2823},{"style":565},[2824],{"type":48,"value":2572},{"type":42,"tag":542,"props":2826,"children":2827},{"style":2729},[2828],{"type":48,"value":2732},{"type":42,"tag":542,"props":2830,"children":2831},{"style":2735},[2832],{"type":48,"value":2833},"Issue:",{"type":42,"tag":542,"props":2835,"children":2836},{"style":2729},[2837],{"type":48,"value":2743},{"type":42,"tag":542,"props":2839,"children":2840},{"style":575},[2841],{"type":48,"value":2842}," [What is wrong]\n",{"type":42,"tag":542,"props":2844,"children":2846},{"class":544,"line":2845},52,[2847,2851,2855,2860,2864],{"type":42,"tag":542,"props":2848,"children":2849},{"style":565},[2850],{"type":48,"value":2572},{"type":42,"tag":542,"props":2852,"children":2853},{"style":2729},[2854],{"type":48,"value":2732},{"type":42,"tag":542,"props":2856,"children":2857},{"style":2735},[2858],{"type":48,"value":2859},"Merchant Impact:",{"type":42,"tag":542,"props":2861,"children":2862},{"style":2729},[2863],{"type":48,"value":2743},{"type":42,"tag":542,"props":2865,"children":2866},{"style":575},[2867],{"type":48,"value":2868}," [What breaks for existing merchants]\n",{"type":42,"tag":542,"props":2870,"children":2872},{"class":544,"line":2871},53,[2873,2877,2881,2886,2890],{"type":42,"tag":542,"props":2874,"children":2875},{"style":565},[2876],{"type":48,"value":2572},{"type":42,"tag":542,"props":2878,"children":2879},{"style":2729},[2880],{"type":48,"value":2732},{"type":42,"tag":542,"props":2882,"children":2883},{"style":2735},[2884],{"type":48,"value":2885},"Fix:",{"type":42,"tag":542,"props":2887,"children":2888},{"style":2729},[2889],{"type":48,"value":2743},{"type":42,"tag":542,"props":2891,"children":2892},{"style":575},[2893],{"type":48,"value":2894}," [What to change, with before\u002Fafter code]\n",{"type":42,"tag":542,"props":2896,"children":2898},{"class":544,"line":2897},54,[2899,2903,2907,2912,2916],{"type":42,"tag":542,"props":2900,"children":2901},{"style":565},[2902],{"type":48,"value":2572},{"type":42,"tag":542,"props":2904,"children":2905},{"style":2729},[2906],{"type":48,"value":2732},{"type":42,"tag":542,"props":2908,"children":2909},{"style":2735},[2910],{"type":48,"value":2911},"Status:",{"type":42,"tag":542,"props":2913,"children":2914},{"style":2729},[2915],{"type":48,"value":2743},{"type":42,"tag":542,"props":2917,"children":2918},{"style":575},[2919],{"type":48,"value":2920}," [ ] Not started\n",{"type":42,"tag":542,"props":2922,"children":2924},{"class":544,"line":2923},55,[2925],{"type":42,"tag":542,"props":2926,"children":2927},{"emptyLinePlaceholder":718},[2928],{"type":48,"value":1847},{"type":42,"tag":542,"props":2930,"children":2932},{"class":544,"line":2931},56,[2933,2937],{"type":42,"tag":542,"props":2934,"children":2935},{"style":565},[2936],{"type":48,"value":1756},{"type":42,"tag":542,"props":2938,"children":2939},{"style":548},[2940],{"type":48,"value":2941},"High\n",{"type":42,"tag":542,"props":2943,"children":2945},{"class":544,"line":2944},57,[2946,2950,2955],{"type":42,"tag":542,"props":2947,"children":2948},{"style":565},[2949],{"type":48,"value":1766},{"type":42,"tag":542,"props":2951,"children":2952},{"style":554},[2953],{"type":48,"value":2954},"...",{"type":42,"tag":542,"props":2956,"children":2957},{"style":565},[2958],{"type":48,"value":1812},{"type":42,"tag":542,"props":2960,"children":2962},{"class":544,"line":2961},58,[2963],{"type":42,"tag":542,"props":2964,"children":2965},{"emptyLinePlaceholder":718},[2966],{"type":48,"value":1847},{"type":42,"tag":542,"props":2968,"children":2970},{"class":544,"line":2969},59,[2971,2975],{"type":42,"tag":542,"props":2972,"children":2973},{"style":565},[2974],{"type":48,"value":1756},{"type":42,"tag":542,"props":2976,"children":2977},{"style":548},[2978],{"type":48,"value":2979},"Medium\n",{"type":42,"tag":542,"props":2981,"children":2983},{"class":544,"line":2982},60,[2984,2988,2992],{"type":42,"tag":542,"props":2985,"children":2986},{"style":565},[2987],{"type":48,"value":1766},{"type":42,"tag":542,"props":2989,"children":2990},{"style":554},[2991],{"type":48,"value":2954},{"type":42,"tag":542,"props":2993,"children":2994},{"style":565},[2995],{"type":48,"value":1812},{"type":42,"tag":451,"props":2997,"children":2998},{},[],{"type":42,"tag":65,"props":3000,"children":3002},{"id":3001},"step-7-save-and-present",[3003],{"type":48,"value":3004},"Step 7: Save and Present",{"type":42,"tag":461,"props":3006,"children":3007},{},[3008,3013,3018,3023],{"type":42,"tag":81,"props":3009,"children":3010},{},[3011],{"type":48,"value":3012},"Save the report",{"type":42,"tag":81,"props":3014,"children":3015},{},[3016],{"type":48,"value":3017},"Present a one-paragraph risk summary",{"type":42,"tag":81,"props":3019,"children":3020},{},[3021],{"type":48,"value":3022},"If Critical or High issues exist: recommend blocking the release until resolved",{"type":42,"tag":81,"props":3024,"children":3025},{},[3026],{"type":48,"value":3027},"If the upgrade risk level is HIGH or CRITICAL: recommend the partner include a\n\"backup before upgrading\" notice in the release",{"type":42,"tag":65,"props":3029,"children":3031},{"id":3030},"important-notes",[3032],{"type":48,"value":3033},"Important Notes",{"type":42,"tag":77,"props":3035,"children":3036},{},[3037,3042,3054,3059,3064],{"type":42,"tag":81,"props":3038,"children":3039},{},[3040],{"type":48,"value":3041},"This skill does NOT evaluate code quality, security, or UX -- those are handled by\nother review skills",{"type":42,"tag":81,"props":3043,"children":3044},{},[3045,3047,3052],{"type":48,"value":3046},"Focus exclusively on the ",{"type":42,"tag":57,"props":3048,"children":3049},{},[3050],{"type":48,"value":3051},"delta between versions",{"type":48,"value":3053},", not absolute quality",{"type":42,"tag":81,"props":3055,"children":3056},{},[3057],{"type":48,"value":3058},"Payment token preservation is the highest-stakes item -- verify thoroughly",{"type":42,"tag":81,"props":3060,"children":3061},{},[3062],{"type":48,"value":3063},"Database migrations that work on 10 test orders may fail on 10,000 production\norders due to memory\u002Ftimeout -- always check for batching",{"type":42,"tag":81,"props":3065,"children":3066},{},[3067],{"type":48,"value":3068},"WordPress auto-updates mean merchants may upgrade without reading the changelog --\nsurface breaking changes via admin notices, not just documentation",{"type":42,"tag":3070,"props":3071,"children":3072},"style",{},[3073],{"type":48,"value":3074},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"items":3076,"total":1815},[3077,3090,3105],{"slug":3078,"name":3078,"fn":3079,"description":3080,"org":3081,"tags":3082,"stars":25,"repoUrl":26,"updatedAt":3089},"woocommerce-finalize","audit WooCommerce plugin code health","Pre-release code health and traceability audit for WooCommerce plugins. Runs after code review -- focuses on dead code, duplication, structural complexity, and full-stack traceability analysis. Use when finalizing, auditing, or preparing a WooCommerce plugin for release. Also trigger when the user mentions \"finalize\", \"pre-release audit\", \"code health check\", \"traceability analysis\", or \"ready to ship\". This skill complements security and UX review by catching structural issues and broken data paths that checklist-based reviews miss.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3083,3086,3087,3088],{"name":3084,"slug":3085,"type":15},"Code Analysis","code-analysis",{"name":13,"slug":14,"type":15},{"name":17,"slug":18,"type":15},{"name":20,"slug":21,"type":15},"2026-04-12T04:56:21.142829",{"slug":3091,"name":3091,"fn":3092,"description":3093,"org":3094,"tags":3095,"stars":25,"repoUrl":26,"updatedAt":3104},"woocommerce-plugin-dev","develop WooCommerce plugins","Comprehensive WooCommerce plugin development skill that enforces WordPress and WooCommerce coding standards, security best practices, and end-to-end testing for every file created. Use this skill whenever the user wants to create, scaffold, build, or start a WooCommerce plugin, WooCommerce extension, or WordPress plugin that integrates with WooCommerce. Also trigger when the user mentions \"WooCommerce plugin\", \"Woo extension\", \"WooCommerce add-on\", \"payment gateway plugin\", \"shipping method plugin\", or any plugin that touches orders, products, carts, checkout, or the WooCommerce REST API. Even if the user just says \"start a new plugin\" in the context of a WooCommerce project, use this skill. This skill should be the first thing consulted before writing any code for a WooCommerce plugin project.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3096,3099,3102,3103],{"name":3097,"slug":3098,"type":15},"Plugin Development","plugin-development",{"name":3100,"slug":3101,"type":15},"Testing","testing",{"name":17,"slug":18,"type":15},{"name":20,"slug":21,"type":15},"2026-04-12T04:56:22.485222",{"slug":4,"name":4,"fn":5,"description":6,"org":3106,"tags":3107,"stars":25,"repoUrl":26,"updatedAt":27},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3108,3109,3110,3111],{"name":13,"slug":14,"type":15},{"name":23,"slug":24,"type":15},{"name":17,"slug":18,"type":15},{"name":20,"slug":21,"type":15},{"items":3113,"total":3299},[3114,3135,3152,3166,3183,3198,3210,3225,3242,3253,3268,3284],{"slug":3115,"name":3115,"fn":3116,"description":3117,"org":3118,"tags":3119,"stars":3132,"repoUrl":3133,"updatedAt":3134},"annotate","collect visual feedback with browser annotation tools","Open a browser with visual annotation tools. The user clicks elements on their site and leaves feedback — the agent reads annotations and makes changes. Use this when the user wants to point at specific elements to fix, tweak, or redesign.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3120,3123,3126,3129],{"name":3121,"slug":3122,"type":15},"Frontend","frontend",{"name":3124,"slug":3125,"type":15},"Productivity","productivity",{"name":3127,"slug":3128,"type":15},"UX Copy","ux-copy",{"name":3130,"slug":3131,"type":15},"UX Design","ux-design",484,"https:\u002F\u002Fgithub.com\u002FAutomattic\u002Fstudio","2026-05-06T05:40:01.516544",{"slug":3136,"name":3136,"fn":3137,"description":3138,"org":3139,"tags":3140,"stars":3132,"repoUrl":3133,"updatedAt":3151},"block-content","write editable WordPress block markup","Write editable WordPress block markup for local Studio sites, including core\u002Fhtml limits, block-theme layout rules, full-width sections, validation, and skeleton-first page\u002FCSS recipes.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3141,3144,3147,3150],{"name":3142,"slug":3143,"type":15},"Block Editor","block-editor",{"name":3145,"slug":3146,"type":15},"CSS","css",{"name":3148,"slug":3149,"type":15},"HTML","html",{"name":20,"slug":21,"type":15},"2026-05-27T07:01:55.629681",{"slug":3153,"name":3153,"fn":3154,"description":3155,"org":3156,"tags":3157,"stars":3132,"repoUrl":3133,"updatedAt":3165},"hosting-plans-helper","provide WordPress.com hosting plan information","Answer WordPress.com plan, pricing, upgrade, and feature-tier questions (plan names, what each tier unlocks — plugins, themes, custom code, SSH, hosting — and current prices) from authoritative live data. Load before answering ANY plan, pricing, or feature-gating question; never answer these from memory.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3158,3161,3164],{"name":3159,"slug":3160,"type":15},"Pricing","pricing",{"name":3162,"slug":3163,"type":15},"Reference","reference",{"name":20,"slug":21,"type":15},"2026-07-02T07:42:33.654791",{"slug":3167,"name":3167,"fn":3168,"description":3169,"org":3170,"tags":3171,"stars":3132,"repoUrl":3133,"updatedAt":3182},"liberate","migrate websites to WordPress","Import and rebuild a website from a closed platform (Wix, Squarespace, Webflow, Shopify, GoDaddy, Hostinger, HubSpot, Weebly) into a Studio WordPress site. Extracts pages\u002Fposts\u002Fproducts + media, then reconstructs the design as editable blocks + WooCommerce OR as a high-fidelity replica theme. Invoke when the user wants to migrate, import, liberate, or rebuild a site from one of these platforms.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3172,3175,3178,3181],{"name":3173,"slug":3174,"type":15},"CMS","cms",{"name":3176,"slug":3177,"type":15},"Migration","migration",{"name":3179,"slug":3180,"type":15},"Web Development","web-development",{"name":20,"slug":21,"type":15},"2026-07-09T06:47:33.454311",{"slug":3184,"name":3184,"fn":3185,"description":3186,"org":3187,"tags":3188,"stars":3132,"repoUrl":3133,"updatedAt":3197},"need-for-speed","run frontend performance audits for WordPress sites","Run a frontend performance audit on a WordPress site and get actionable optimization recommendations.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3189,3192,3193,3196],{"name":3190,"slug":3191,"type":15},"Audit","audit",{"name":3121,"slug":3122,"type":15},{"name":3194,"slug":3195,"type":15},"Performance","performance",{"name":20,"slug":21,"type":15},"2026-05-06T05:40:06.433267",{"slug":3199,"name":3199,"fn":3200,"description":3201,"org":3202,"tags":3203,"stars":3132,"repoUrl":3133,"updatedAt":3209},"plugin-recommendations","recommend WordPress plugins for site features","Choose recommended plugins and plugin-provided blocks for features core WordPress blocks do not cover - ecommerce (WooCommerce), forms and newsletters (Jetpack), online courses and quizzes (Sensei LMS), polls, surveys and ratings (Crowdsignal), spam protection (Akismet) - while keeping generated content editable and avoiding raw HTML fallbacks. Any request to sell products or build a shop, store, or storefront requires WooCommerce with products.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3204,3207,3208],{"name":3205,"slug":3206,"type":15},"Content Creation","content-creation",{"name":3097,"slug":3098,"type":15},{"name":20,"slug":21,"type":15},"2026-05-27T07:01:58.249105",{"slug":3211,"name":3211,"fn":3212,"description":3213,"org":3214,"tags":3215,"stars":3132,"repoUrl":3133,"updatedAt":3224},"rank-me-up","run on-page SEO audits for WordPress sites","Run an on-page SEO audit on a WordPress site and get actionable recommendations to improve search visibility.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3216,3217,3220,3223],{"name":3190,"slug":3191,"type":15},{"name":3218,"slug":3219,"type":15},"Marketing","marketing",{"name":3221,"slug":3222,"type":15},"SEO","seo",{"name":20,"slug":21,"type":15},"2026-05-06T05:40:05.196367",{"slug":3226,"name":3226,"fn":3227,"description":3228,"org":3229,"tags":3230,"stars":3132,"repoUrl":3133,"updatedAt":3241},"site-spec","gather specifications for new WordPress sites","Gather the site name and layout preference before building a WordPress site. Run this before creating any new site.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3231,3234,3237,3240],{"name":3232,"slug":3233,"type":15},"Design","design",{"name":3235,"slug":3236,"type":15},"Product Management","product-management",{"name":3238,"slug":3239,"type":15},"Specs","specs",{"name":20,"slug":21,"type":15},"2026-05-06T05:40:02.739409",{"slug":3243,"name":3243,"fn":3244,"description":3245,"org":3246,"tags":3247,"stars":3132,"repoUrl":3133,"updatedAt":3252},"studio-cli","manage local WordPress sites with Studio CLI","Use the Studio CLI to manage local WordPress sites, authentication, and preview sites. Invoke this skill when you need to run Studio CLI commands, manage sites, or troubleshoot site issues.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3248,3251],{"name":3249,"slug":3250,"type":15},"CLI","cli",{"name":20,"slug":21,"type":15},"2026-04-06T18:02:57.150231",{"slug":3254,"name":3254,"fn":3255,"description":3256,"org":3257,"tags":3258,"stars":3132,"repoUrl":3133,"updatedAt":3267},"taxonomist","optimize WordPress category taxonomy","Analyze and optimize a WordPress site's category taxonomy. Exports all posts, uses AI to suggest an improved category structure — merging duplicates, retiring dead categories, creating missing ones, writing descriptions, and re-categorizing posts. Run this when the user wants to clean up or improve their categories.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3259,3262,3265,3266],{"name":3260,"slug":3261,"type":15},"Content Strategy","content-strategy",{"name":3263,"slug":3264,"type":15},"Data Cleaning","data-cleaning",{"name":3221,"slug":3222,"type":15},{"name":20,"slug":21,"type":15},"2026-05-06T05:40:03.966799",{"slug":3269,"name":3269,"fn":3270,"description":3271,"org":3272,"tags":3273,"stars":3132,"repoUrl":3133,"updatedAt":3283},"visual-design","plan and execute visual design direction","Plan and execute high-quality visual direction for site creation, redesign, layout, typography, color, motion, and visual polish.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3274,3277,3278,3281],{"name":3275,"slug":3276,"type":15},"Animation","animation",{"name":3232,"slug":3233,"type":15},{"name":3279,"slug":3280,"type":15},"Typography","typography",{"name":3282,"slug":3269,"type":15},"Visual Design","2026-07-24T05:40:57.887452",{"slug":3285,"name":3285,"fn":3286,"description":3287,"org":3288,"tags":3289,"stars":3132,"repoUrl":3133,"updatedAt":3298},"visual-polish","verify and polish website visual design","Verify and polish a built or redesigned site by diagnosing rendered-DOM issues against intent and fixing them in a planned, batched screenshot-and-fix loop.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3290,3293,3294,3297],{"name":3291,"slug":3292,"type":15},"Debugging","debugging",{"name":3121,"slug":3122,"type":15},{"name":3295,"slug":3296,"type":15},"Screenshots","screenshots",{"name":3282,"slug":3269,"type":15},"2026-06-06T07:09:59.809812",81]