SiteHale — complete changelog
=============================
readme.txt carries only recent releases: wp.org truncates a Changelog
section past 5,000 words, silently, at import. This file is the full
record, newest first (0.7.62 down to 0.1.0).

= 0.7.62 =
* Fixes a sitemap that was correct but served as "not found". On a site whose front page is a fixed page and which has no blog posts, WordPress answers its own sitemap address with a "page not found" status while still printing a perfect sitemap. Search engines discard anything marked not found, so the sitemap was invisible to them while looking completely right in a browser — one site had been in that state for two weeks. SiteHale now keeps sitemap addresses out of WordPress's not-found handling. Ordinary missing pages still return "not found" exactly as before.

= 0.7.61 =
* Adds IndexNow, off until you switch it on. When you publish, update or unpublish a page, SiteHale can tell Bing, Yandex, Seznam and Naver immediately instead of waiting for them to crawl your site. (Google does not take part in IndexNow.) It is the only part of this plugin that sends anything to a service other than SiteHale, which is why it ships off and why the settings screen and the readme both say exactly what is sent: the web address of the page that changed, your hostname, and a key identifying your site — never your content, never anything about your visitors. Pages you have marked noindex, password-protected posts, and sites set to discourage search engines are never submitted, and unticking the box discards anything queued.

= 0.7.60 =
* Author archives and attachment pages can now be kept out of search results, as a site-wide setting. Neither is a page anyone writes on purpose — an author archive on a one-writer site repeats the blog index at a second address, and its web address contains the account's login name, while an attachment page is a bare wrapper around a single image. Both are left in search unless you switch this on; nothing changes on an existing site by itself.
* Tag archives can now carry a SiteHale title, description and indexing setting. WordPress files blog tags under a different internal name than every other taxonomy, and SiteHale was asking for them by the wrong one — so its per-item SEO fields never attached to tag archives on any site. Nothing could be saved to one, and a tag set to be kept out of search would still have been listed in your sitemap. Categories, product categories and product tags were never affected.

= 0.7.59 =
* "See what changed" now shows what was actually flagged. The link from the weekly notice led to the Site Checkup page, whose "since your last checkup" list compares against the most recent snapshot — which is the very run the notice came from, so the finding had already been absorbed into the baseline and could never appear. The page now shows the recorded finding itself, dated, above the current results.
* A fatal-error finding now carries the error messages behind it, on the dashboard and in what a paid plan reports to SiteHale. A count on its own cannot tell fifty occurrences of one fault from fifty different ones, and the log has often rotated by the time anybody looks.
* The checkup no longer congratulates you on errors that merely stopped being visible. The fatal count covers a rolling recent-log window, so it also falls when the log is cleared or rotated and when an old burst ages out of the window; both used to be reported as "N fewer fatal PHP errors than last time". Those two cases now say what actually happened instead.

= 0.7.58 =
* SiteHale's diagnostics now report whether plugin auto-updates are switched on for this site, and for SiteHale itself. WordPress does not expose that over its REST API, so on a site SiteHale looks after without shell access there was previously no way to tell — and a site with auto-updates off silently stops receiving plugin releases without anything going wrong that you would notice. Read-only, like every other diagnostic here; it changes nothing about how your site updates.

= 0.7.57 =
* Adds a panel to the post and page editor showing what SiteHale will render for that page — the title, the meta description, the robots directives it contributes, and the share image — and whether each value is one you wrote or one built from your templates. It shows saved values, so save the post to refresh them. There is deliberately no score: the panel tells you what will be served, not how somebody grades it.
* The panel names anything else on your site writing the same tags. If your theme or another plugin adds its own OpenGraph or meta description on pages like the one you are editing, it says so and when it saw that. Duplicate tags are a common reason the wrong title shows up in search results and on shared links.
* If SiteHale has not looked at your front end since your last plugin or theme change, the panel says that instead of reporting a clean result it has not actually checked.
* The canonical URL and structured data are not in the panel — they depend on the live request — and it says so rather than quietly leaving them out.

= 0.7.55 =
* The review request now counts a fortnight of checkups, rather than a fortnight since you first opened a SiteHale page. The old clock only started when somebody visited one of the plugin's own screens, so on a site where nobody had, it never started at all and the request never appeared. If SiteHale has been checking your site for a couple of weeks it may now ask you once — on its own pages only, never while your site has an outstanding finding, and "No thanks" still removes it permanently.

= 0.7.54 =
* Adds a permanent way to leave a review — "Rate this plugin" on your Plugins list, and a link in the footer of SiteHale's own pages. Until now the only route was an occasional notice that waits two weeks after your first visit to a SiteHale screen, so on most sites it had never appeared and there was nowhere to click. Neither link interrupts anything, and both stay available whether or not you have dismissed that notice.

= 0.7.53 =
* Site Checkup now recognises SiteHale itself as the SEO plugin on a site whose SEO it manages. Sites switched over to SiteHale were told "No SEO plugin detected" — and had the SEO section marked as needing attention for it — while SiteHale was writing their titles and descriptions. Sites using another SEO plugin, or none, are unaffected and read exactly as before.
* Site Checkup now tells you who acts on each finding. On a Care or Managed site each section says whether SiteHale is handling it for you or watching it and alerting a human, so a section marked "Needs attention" no longer reads as a job waiting on you when it isn't. The status itself is unchanged — it still describes your site, not your plan.
* An end-of-life PHP or database version now says plainly that it is set in your hosting account and your host has to change it. No plan of ours can.
* Fixes the free-plan footer disappearing on a site that had connected to SiteHale but was never activated. Connecting is free and provisions nothing, so those sites are on the free plan and should read like it.

= 0.7.52 =
* Fixes a fatal error on hosts that run PHP without the mbstring extension. Shortening a title or description to fit its limit used a function those hosts do not provide, which could take down any page SiteHale generated one for. Nearly all hosts include mbstring and are unaffected; nothing else changes.

= 0.7.51 =
* Housekeeping only, with no change to how the plugin behaves: tightens two internal code checks and shortens three update notices.

= 0.7.50 =
* A product rated with stars but no written review now publishes its rating too. Previously only products with a written review did, so a product whose page showed "Rated 5.00 out of 5" could publish no rating at all.

= 0.7.49 =
* Product pages now publish the brand, the star rating and customer reviews in their structured data, so shops keep their review stars in search results after switching over. Nothing is published for a product that has no reviews — an unrated product stays unrated rather than being shown as zero stars.

= 0.7.48 =
* When SiteHale manages your SEO, a "page not found" address is no longer served with your home page's title and description. It now returns a proper not-found title, tells search engines not to index it, and no longer names itself as the preferred address for a page that does not exist.
* The one-click switch-over from your previous SEO plugin now also checks that your category and tag metadata was read, that something was actually examined, and that SiteHale has a reader for whichever plugin you are on. It stays closed rather than opening on an import that looked at nothing.
* Category and tag metadata can now be read on sites with no server access, so those sites can complete a switch-over that previously counted your taxonomy pages as empty.
* Re-importing your settings can no longer clear your business details when the address book they came from is switched off — a correction still applies, but "nothing to say" is no longer treated as "delete this".
* On a site whose previous SEO plugin was Yoast, the share image is no longer invented from your logo when Yoast never published one.
* Leftover settings from an SEO plugin that has not run on the site for years are no longer read back in as current configuration during a re-import.

= 0.7.47 =
* Business address and hours now update fully on re-import, so a correction always takes effect.

= 0.7.46 =
* Opening hours are now published only when you have actually set them, never from the SEO plugin's unused defaults.

= 0.7.45 =
* Fixes the sitemap disappearing after switching SEO over to SiteHale.

= 0.7.44 =
* Adds sitemap diagnostics, so a missing sitemap can be explained instead of guessed at.

= 0.7.43 =
* Sites without server access can now have their site-wide SEO settings applied, completing the no-server-access import.

= 0.7.42 =
* The option to switch your SEO over to SiteHale now appears only on sites with an active SiteHale plan.

= 0.7.41 =
* Sites without server access can now carry their site-wide SEO settings across, not just their page titles and descriptions.

= 0.7.39 =
* Keeps your sitemap working when SiteHale takes over from another SEO plugin, and carries site-wide settings across on sites without server access.

= 0.7.38 =
* Fixes an error page that could appear on "not found" pages for sites using the new site-wide snippet settings.

= 0.7.37 =
* Keeps site-wide search snippet settings when SiteHale takes over from another SEO plugin, so search results are not shortened.

= 0.7.36 =
* Fixes over-long meta descriptions on pages that had none of their own — SiteHale was using the whole page as the description instead of a short summary.

= 0.7.35 =
* Fixes sites whose SEO stayed paused after an update: SiteHale now checks several pages instead of betting on one, so a redirecting or members-only page no longer leaves the module switched off.

= 0.7.34 =
* The "Turn on SiteHale SEO" switch now waits until your existing titles and descriptions have been copied across, so switching over cannot lose them.

= 0.7.33 =
* Completes the update fix: SiteHale SEO now resumes fully after an update instead of getting halfway there.

= 0.7.32 =
* Completes the 0.7.31 fix, which did not take effect on the update that introduced it. Updating the plugin no longer pauses SiteHale SEO.

= 0.7.31 =
* Updating the plugin no longer pauses SiteHale SEO. It previously stopped managing your pages after each update until your site received a couple of visits, which on a quiet site could be hours.

= 0.7.30 =
* Switching SiteHale SEO on now takes effect straight away instead of waiting for the next few visitors to your site.
* After switching over, the SiteHale screen now confirms whether SEO is live — previously the button gave no acknowledgement at all.

= 0.7.29 =
* The SEO switch-over is now one click. If a site runs more than one SEO plugin (for example All in One SEO alongside All in One SEO Pro), all of them are switched off together instead of one per click.
* Add-ons belonging to the SEO plugin being switched off are now switched off too, which clears the "this add-on cannot be used" errors they otherwise leave behind.

= 0.7.28 =
* Fixes the SEO handover notice not appearing right after install — the moment it is most needed.

= 0.7.27 =
* SiteHale SEO now tells you when it cannot manage your SEO because another SEO plugin is active — and offers a one-click switch-over. Previously it stood down silently, so a site could sit for weeks with SiteHale SEO installed but idle.

= 0.7.26 =
* SEO module: custom robots.txt rules are now carried over and served by SiteHale. Sites that had rules configured in a previous SEO plugin kept serving them; previously those lines disappeared when that plugin was switched off, so pages meant to stay out of search results — carts, checkouts, account pages — became crawlable.
* SEO module: rules already present from WordPress or WooCommerce are not repeated, so robots.txt does not accumulate duplicate lines.
* SEO module: a site set to discourage search engines keeps WordPress's own robots.txt untouched.

= 0.7.25 =
* SEO module: WooCommerce products now publish full product schema — price, currency, stock availability, SKU and category, with each variation of a variable product listed separately. Product pages previously published only page-level schema, so search engines could not see what was for sale or for how much.
* SEO module: a product page no longer publishes an Article entry, which described the product as a blog post.
* SEO module: WooCommerce's own duplicate product markup is now stood down on pages where SiteHale publishes product schema, so the page describes each product once instead of twice.

= 0.7.24 =
* SEO module: canonical and og:url now use the same address scheme (http or https) the page was requested on, instead of whatever is saved in your WordPress address setting.

= 0.7.23 =
* SEO module: fixes the module refusing to manage SEO on sites using a block theme (Twenty Twenty-Four, Twenty Twenty-Five and similar), where it wrongly detected the theme's own title tag as another SEO plugin.

= 0.7.22 =
* SEO module: a separate blog page now uses the title and description you set on it, instead of falling back to your site title.

= 0.7.21 =
* SEO module: social share images now publish their dimensions, so Facebook and LinkedIn lay the card out correctly instead of cropping or falling back to a thumbnail.

= 0.7.20 =
* SEO module: your default social share image and Twitter card style are carried over from your previous SEO plugin, so pages without their own image still share with a picture.

= 0.7.19 =
* SEO module: site-wide robots rules carried over from your previous SEO plugin are now honoured — page 2 and beyond of an archive, feeds, and search results stay out of the search index when you had them set that way.

= 0.7.18 =
* SEO module: your WooCommerce shop page now uses the title and description you set on it, instead of falling back to the generic page template.

= 0.7.17 =
* SEO module: your organization logo now publishes its real width and height in structured data, instead of leaving them out.

= 0.7.16 =
* SEO module: fixes FAQ and other custom structured data being stored corrupted when it contained a quoted phrase, which left those items publishing no structured data at all.

= 0.7.15 =
* SEO module: page 2 and beyond of a category or archive keeps the separator in its title — "Site Name - Page 2" rather than "Site Name Page 2".
* SEO module: page 2 and beyond of a static front page now gets its own title and a working canonical link, instead of repeating the home page's title and pointing at a URL that did not exist.

= 0.7.14 =
* SEO module: posts with no featured image now use an image from the post's own content in their structured data, as your previous SEO plugin did — previously those posts published no article image at all. Images inserted by WordPress are found by their attachment, so older posts and sites that have moved or renamed their uploads folder still work.

= 0.7.11 =
* SEO module: article images now publish their real width, height and caption in structured data, as your previous SEO plugin did — search engines read those dimensions when deciding how to show your images.
* SEO module: articles now publish the category they belong to, the page language, and the article name alongside its headline.

= 0.7.10 =
* SEO module: your organization's description, email, phone and founding date are now carried across from your previous SEO plugin and published in your Organization structured data, instead of only its name.

= 0.7.9 =
* SEO module: search-engine ownership tokens (Google, Bing, Yandex, Baidu, Pinterest, Norton) are now carried across from your previous SEO plugin and kept on the page, so switching does not un-verify your Search Console property.

= 0.7.8 =
* Fixes a fatal error in 0.7.7 that could take a site's pages offline when SiteHale was managing its SEO. 0.7.7 was never released beyond one test site.

= 0.7.7 =
* SEO module: your site's social profile links and organization details are now carried across from your previous SEO plugin, and used for `article:publisher`, `twitter:site` and the `sameAs` links on your Organization data.
* Author avatars appear in article structured data again, where the site shows avatars.
* The organization logo configured in your previous SEO plugin is preferred over the theme logo, because it is the one that was actually being published.

= 0.7.6 =
* SEO module: a sitemap URL whose provider is not registered now redirects to the sitemap index instead of quietly serving the home page at HTTP 200. WordPress core returns without setting a 404 in that case, so removing any provider leaves a soft 404 behind.

= 0.7.5 =
* SEO module: WordPress core's sitemap now excludes items carrying a SiteHale `noindex`. Core has no noindex concept, so a cutover previously moved those items straight from "excluded" to "submitted while noindex".
* The author sitemap is suppressed only where exactly one author has published — on a single-author site the archive duplicates the blog index. Multi-author sites keep theirs. `sitehale_seo_author_sitemap` overrides.
* Retired sitemap addresses (`sitemap_index.xml`, `sitemap.rss`, `sitemap.html`, …) 301 to `/wp-sitemap.xml` instead of 404ing — and only when the request was already going to 404, so nothing that still serves is shadowed.
* All of it is inert unless SiteHale is the renderer on that request.

= 0.7.4 =
* SEO module: BreadcrumbList/ListItem schema is now built from the site's own hierarchy by default (post and page ancestors, term ancestors, the post type archive). It previously required the `sitehale_seo_breadcrumbs` filter to supply a trail, so no site rendered one. The filter still overrides.
* The trail never links its own last item, which is the most common reason a valid-looking BreadcrumbList is rejected.

= 0.7.3 =
* New, for sites on a SiteHale plan: SiteHale can now manage your site's SEO metadata itself — title, meta description, canonical, robots, OpenGraph and Twitter tags, and structured data — as part of the managed service, replacing the SEO plugin rather than sitting beside it. **Free installs are unchanged.** The free checkup still only *reports* on your SEO — whether the site is accidentally set to discourage search engines, and which plugin is writing your meta titles — it does not write it. Writing it is what the service does.
* Whatever the plan, SiteHale will not double up on anything. Before rendering, it reads your site's actual `<head>` on real page views and stands down if it finds a title, canonical, description, robots directive, OpenGraph or Twitter tag that something else already emits. That is a measurement, not a list of plugin names: it catches a theme or a social plugin nobody would think to name, and it does not stand down for an SEO plugin that is installed but rendering nothing. Two different kinds of page have to be seen — one an individual post or page — before it renders; a single foreign tag anywhere stops it; and installing another SEO plugin takes effect on the very next page load.
* WordPress's own canonical is left in place unless SiteHale is actually replacing it. Core's robots directives are added to rather than replaced, so `max-image-preview:large` survives; a `noindex` set by WordPress or another plugin is never turned back into `index`; and a site set to discourage search engines stays that way whatever is stored.
* Filters: `sitehale_seo_enabled` switches the module off entirely, `sitehale_seo_render` the rendering alone.

= 0.6.1 =
* Fix: the PHP-errors card now dates each fatal line and counts only those from the last 7 days. Error logs are picked up by file modification time, so one recent entry could keep a whole month of already-fixed history in the count — a resolved July incident was still raising the alarm in mid-August. Older fatals are reported as history ("N older fatals … not counted above"), and a fatal line with no readable date still counts, so the card fails toward reporting, never silence.

= 0.6.0 =
* New: SEO basics card on the Site Checkup — whether search engines are allowed to index this site, permalink structure, which SEO plugin (if any) is writing your meta titles and descriptions, whether a sitemap is being served and by what, theme title-tag support, and a default-tagline reminder. Read entirely on your own site, like every other card.
* New: the weekly re-check now treats "Discourage search engines" being switched on as a regression and tells you about it. It is the classic post-migration mistake, it is silent, and it drains search traffic for as long as nobody notices — which is exactly what the weekly check exists to prevent.
* New: your site serves an automatic `/llms.txt` — a compact index (name, tagline, published pages, posts and products) that AI assistants read the way search engines read a sitemap. Built from your own published content, so it never goes stale. It stands down by itself if an SEO plugin or a real file already serves that address, serves nothing on a site set to discourage search engines, and can be switched off with one filter (see the FAQ).
* New: a disk-space diagnostic endpoint for the SiteHale service (free space, and a bounded measure of the uploads folder), so sites the service reaches only through this plugin get the "disk is filling up" warning the SSH-managed ones already had. Inbound and authenticated like every other diagnostic; the free plugin sends nothing.

= 0.5.3 =
* Fixed: the Multisite uninstall loop used unprefixed variables. uninstall.php has no function scope, so those were globals that could collide with something else loaded at uninstall time — and the symptom would have been silent, with cleanup skipping sites on a network nobody is watching. No change to behaviour on a single site.

= 0.5.2 =
* New: a one-time review request on SiteHale's own admin screens, after the plugin has been installed a fortnight and run at least two checkups. It is never shown site-wide, never shown while a regression is outstanding, and "No thanks" removes it for good. No incentive is offered for a review.
* Changed: on sites with an active paid SiteHale plan, the weekly regression notice is now informational instead of a task list. Every finding it can raise — a new administrator, new fatal errors, cron stopping, an autoload jump, an out-of-support PHP or database version — is already checked centrally on those sites, so the notice was handing a paying customer work they pay SiteHale to do. It now states what changed, says the plan covers it, and drops the "Run a full Site Checkup" button. On the free plan, where you are the one watching the site, the notice is unchanged.
* New: on those same sites, the weekly check reports what regressed to SiteHale (External services, item 4), so a new fatal error reaches the people responsible for it instead of waiting for the next scheduled look. The notice only claims SiteHale has been told when that report actually got through; if it could not, it says the site's regular checks cover it, which is true either way. The free plan transmits nothing from the weekly check, as before.
* Changed: an unexplained new administrator account still asks you directly, on every plan — nobody but you can say whether you created it. On a paid site it now points you at SiteHale rather than telling you to investigate alone.

= 0.5.1 =
* Compatibility: tested against WordPress 7.1 on a clean install. Nothing in this plugin touches what 7.1 changed — it adds no scripts or styles, registers no blocks and uses no jQuery — so the iframed post editor, client-side media processing, component and toolbar changes, the new SVG icon API and the jQuery UI update all pass it by.
* Changed: now requires WordPress 5.7 or later, up from 5.6. The plugin records when the SiteHale service last contacted your site, and identifies a genuine service call using a function WordPress added in 5.7. On 5.6 that check could not run, so opening a diagnostics address in your own browser was recorded as contact from SiteHale — a reassurance the plugin had not earned. WordPress 5.6 was released in December 2020.

= 0.5.0 =
* New: Site Health integration — the Site Checkup result and the weekly re-check now appear as tests under Tools → Site Health, and a SiteHale panel is added to Site Health → Info. Both read the checkup already stored on your site, so nothing extra runs on your dashboard.
* New: the Site Checkup page shows when the next automatic weekly re-check is due, and says so plainly when it is not scheduled or has stopped running because this site's WP-Cron is not firing. The plugin promised a weekly check; now it verifies one is actually going to happen.
* New: when your site is connected, the SiteHale page and dashboard widget show when the service last contacted it — proof you can see, rather than a promise you have to take on trust.
* Fixed: the PHP errors card could report "no logs found", which reads as a clean bill of health, on sites where no log could be read at all — error logging switched off, a custom WP_DEBUG_LOG path, or PHP writing to the web server's own log (the normal arrangement on much of shared hosting). It now names which of those it found and marks the card "Could not check". A custom WP_DEBUG_LOG path is also read properly now, instead of being missed.
* Fixed: uninstalling left one stored setting behind, and on a Multisite network cleaned up only the site it was run from. Uninstall now removes everything the plugin stored, on every site in the network.
* Fixed: fatal errors caused by your own WP-CLI `wp eval` commands were counted as faults on the site. They share the same error log, so a typo at the command line was reported back as a production fatal — and would have triggered the weekly regression notice. They are now listed separately and excluded from the count. A genuine error that happens to occur while WP-CLI runs a scheduled task still counts, because your site would hit it on a page load too.
* Compatibility: tested against WordPress 7.0.3. WordPress 7.0 raised its own minimum PHP version to 7.4, which this plugin has always required.
* Fixed: the diagnostics could emit PHP notices of their own when a check came back empty — unhelpful in a plugin whose job is reporting PHP notices. Also, the Action Scheduler table lookup now escapes the table prefix so it cannot match a similarly named table.

= 0.4.11 =
* Hardened: the SiteHale page no longer updates the stored connection timestamp from a page address. The connection is recorded only by the server-to-server handshake that actually completes it, so a crafted link can never make a site appear connected.
* Clarified the readme: the Site Checkup, its history and the weekly re-check are free and fully usable on their own; the Privacy section no longer implied a subscription is required. Installation now documents the free setup first.

= 0.4.10 =
* Internal code-quality annotation only. No functional change.

= 0.4.9 =
* Removed an unused connection setting left over from the previous release. No change to behaviour; the plugin now contacts only the three addresses listed under External services.

= 0.4.8 =
* Security: the Application Password created when you click Connect is no longer passed through a redirect to an external address. WordPress now returns it to your own site, and the plugin sends it to SiteHale directly over an encrypted server-to-server request. Nothing about what is shared changes; it simply never travels in a web address.
* Connect failures are now reported instead of failing quietly, so you are never left with an unused Application Password and no explanation.

= 0.4.7 =
* Housekeeping: stored care reports are now reconciled when a new report arrives, so a report body can no longer linger in the database after its entry has gone. No change to what is shown or reported.

= 0.4.6 =
* Connect: the confirmation URL shown on the WordPress authorization screen is now much shorter and easier to read. No change to how the connection works or what is sent.

= 0.4.5 =
* Hardened: the database-health and Action Scheduler diagnostic queries now bind every value through $wpdb->prepare() with explicit placeholders instead of interpolating them. No change to the data reported.

= 0.4.4 =
* Fixed: sites set up by the SiteHale service directly (without the browser Connect flow) showed "Not connected" even while receiving care reports. Receiving an authenticated care report now marks the site as connected, so the Connection section always matches the plan status.

= 0.4.3 =
* New: "Your plan" panel now shows the SiteHale Managed plan ($149/mo) — everything in Care plus updates applied for you (staging-tested first), speed and database optimization, and verified backups with restore drills. The badge lights up when your site is on the Managed plan.
* Improved: care report delivery now records which plan the site is on, keeping the plan panel accurate automatically.

= 0.4.2 =
* Improved: the Care Reports page lets modern dashboard-style care reports use the full admin width; legacy email-style reports in the history keep the original boxed rendering.

= 0.4.1 =
* New: "Your plan" panel on the SiteHale page — a side-by-side breakdown of the Free plan (the full plugin: Site Checkup, weekly re-check, regression notices — free forever) versus the paid SiteHale Care service ($49/mo), with a live status badge: Not active, Awaiting activation (connected but Care not yet started), or Active (a care report has been delivered).
* Clarified: connecting links your site so Care can be set up — it is free, does not start a subscription, and nothing is ever charged through the plugin. The connected state now says so instead of implying the service is running.

= 0.4.0 =
* New: Checkup history — every Site Checkup stores a compact local snapshot (last 12) and the page shows what changed since last time, in both directions.
* New: Weekly background re-check (WP-Cron, local only) with a single dismissible admin notice shown only when something regressed: new administrator account, new fatal errors, cron gone overdue, autoload-weight jump, or an environment component reaching end of security support. A clean check clears the notice.
* New: Email this checkup — send the summary to any address via your own site's wp_mail(). Optional off-by-default checkbox shares the summary with SiteHale for a human follow-up (disclosed under External services).
* Uninstall now also removes the checkup history, regression state, and the scheduled event.
* Fix: database-health diagnostics on MySQL 8 hosts emitted PHP 8 "Undefined array key" warnings (information_schema returns UPPERCASE column names on MySQL, lowercase on MariaDB) — every column is now explicitly aliased.

= 0.3.0 =
* New: Site Checkup — a free wp-admin page that runs the plugin's health diagnostics locally (cron health, PHP error logs, database health, pending updates plus PHP/database end-of-support grading, administrator audit, outbound mail test). No account, no network calls, read-only.

= 0.2.1 =
* Connect intake moved to the connect.sitehale.com subdomain (marketing site now lives at sitehale.com). No change to already-connected sites.

= 0.2.0 =
* Care reports: authenticated report-push endpoint, SiteHale → Care Reports admin page (last 12 reports), and a dashboard widget showing the latest care summary.

= 0.1.0 =
* Initial release: Connect flow (core Application Passwords authorization), connect-code fallback, diagnostic REST endpoints (cron, PHP errors, DB health, updates, admins, mail probe).
