== NoyaCare changelog ==

The current release is described in readme.txt.

= 1.9.1 =
* Security: the settings form is sanitised as it is read, field by field, before NoyaCare or an add-on sees it.
* Fix: WordPress's admin files are loaded only where they are used, and only when not loaded yet.
* Fix: the error-log check reads the log PHP writes to, never an old debug.log.
* Dev: filter `noyacare_settings_input_kinds`; `NoyaCare_Settings::clean_input()`.

= 1.9.0 =
* New: Settings → Access picks who manages NoyaCare, with a log and alerts.
* New: reports can wait for review, then go out in one click.
* New: a second try for an update that needed another update first.
* New: `wp noyacare access|report`, `NOYACARE_MANAGERS`.
* Better: the error that broke an update comes first.
* Fix: a failed rollback is never reported as done; the run stops.
* Dev: `noyacare_capability()` is now `noyacare_manage`.

= 1.8.2 =
* Security: a run's PDF report is made only while the backup folder is found closed to the web; otherwise the e-mail goes without it.
* Security: the folder test also asks for a PDF file, so a server that serves only PDFs from the folder no longer counts as closed.
* Fix: a report that could not be removed from an open folder is reported, not passed over.
* Changed: the folder test's control file goes into a folder of NoyaCare's own in uploads.

= 1.8.1 =
* Security: a stricter test of the backup folder: a redirect, a login page or an unclear answer no longer counts as closed, and the folder a restore unpacks into is tested.
* Security: a run's report stays on the server only while the backup folder is closed; otherwise it is made for each e-mail and download.
* Fix: a restore whose lock ran out stops instead of going on beside an update, and a run does a step only when the database has saved its lock and state.
* Fix: a rollback reported an empty setting as not put back.

= 1.8.0 =
* Security: runs, restores and the update policy need WordPress's update capabilities, checked for every item a run installs, "install everything" included. Multisite updates run from the main site. `DISALLOW_FILE_MODS` is respected, also by scheduled runs.
* Security: restore points and database backups go only into a backup folder that a daily test finds closed to the web.
* Fix: the full database backup turned `%` into a placeholder. It now imports exactly.
* Fix: "restoring" a full database backup did nothing while saying it was restored; it is refused.
* Fix: no update starts without a recorded restore point whose every file reads back intact.
* Fix: a restore says what it could not put back, and never overlaps a run.

= 1.7.8 =
* Changed: the REST API is read-only. The endpoint that started a maintenance run was removed: runs start from the admin screens, WP-CLI or this site's own schedule.
* Changed: a restore unpacks its restore point inside NoyaCare's own protected folder in uploads, not in WordPress's upgrade folder, and clears anything older versions left there.
* Changed: the notice about an outdated NoyaCare Pro shows where plugins are managed and on NoyaCare's own screens, instead of on every screen of the admin.

= 1.7.7 =
* Fix: a run no longer stands still where the site's background requests to itself never arrive (WordPress Playground, and some hosts and firewalls). After 15 seconds without progress, the open run screen moves the run on itself until it finishes.
* Fix: a run screen whose login changed while it was open (a new sign-in in another tab, for example) reloads itself instead of showing "Lost contact" until it is refreshed.

= 1.7.6 =
* Changed: "Never update these plugins" and "Never update these themes" are now dropdowns of what is installed, with a checkbox each, instead of text boxes. Names saved before stay ticked, and ones no longer installed are marked.

= 1.7.5 =
* New: "Remove failed tests" and "Clear all" on the Website speed screen, to tidy a page's test history. Both ask first; a test still running is left alone.

= 1.7.4 =
* Fix: "Only install updates available for at least N days" held nothing, because WordPress gives no release date for plugins, themes or core. NoyaCare now counts from the day it first sees each new version.
* Dev: `noyacare_skip_scheduled_run` lets an add-on skip a scheduled run.

= 1.7.3 =
* Fix: right after a caching plugin empties its cache (WP Rocket does whenever a plugin is installed or updated), the built-in checks no longer report a slow server and "not served from its cache". When the first visit misses the cache, the next one is checked, and WP Rocket's cached pages are recognised.

= 1.7.2 =
* Changed: when Google's speed test fails on its side ("Lighthouse returned error", a server error or a dropped connection), NoyaCare tries again two minutes later, up to twice, before reporting the failure. The dashboard says when a retry is under way.

= 1.7.1 =
* Fix: when a speed test fails, the Website speed card now says why instead of "Not tested yet". When Google's shared quota for tests without a key has run out, it says so and links to the key setting.
* Changed: saving a new speed-test key, or choosing another speed-test service, lets you test again straight away instead of waiting 10 minutes.

= 1.7.0 =
* Fix: a restore point made by an add-on is no longer treated as a plugin folder. Restoring one without its add-on now says which add-on it needs.
* Changed: an add-on's own housekeeping runs (NoyaCare Pro's media cleanup, for example) keep their own restore points and log, without becoming "the last run" on the dashboard, in the reports or in the API.
* Fix: two runs starting in the same second no longer fight over one run number.
* Fix: a NoyaCare Pro older than 1.3.0 is paused, with a notice saying what to install, instead of breaking the WordPress dashboard. It still calls the class names this version renamed.
* Dev: `noyacare_snapshot_restore`, `noyacare_snapshot_restorable`, `noyacare_side_run_triggers`, `noyacare_trigger_label` and `noyacare_kind_label`; `NoyaCare_Zip::compress_files()` and `::entries()`.
* Dev: PHP classes and functions now start with `NoyaCare_` and `noyacare_` (they were `NC_` and `nc_`). Hooks, options, database tables and cron events keep their names.

= 1.6.4 =
* Fix: a plugin or theme whose vendor keeps offering the version already installed no longer shows as a pending update.

= 1.6.3 =
* Fix: an active plugin was left switched off after NoyaCare updated it in the background or from WP-CLI. It now stays active, as with WordPress's own background updates.
* Fix: a healthy update could be rolled back because visitors' pages loaded the plugin while its files were being replaced. WordPress's short "Briefly unavailable" notice is now shown for those seconds, and the check only counts errors logged after the new files are in place.
* Fix: after one rollback, later items and the final check no longer fail on the same old errors.

= 1.6.2 =
* Fix: on LiteSpeed servers, an update was undone five minutes later whenever another plugin (Google Site Kit, for example) reset PHP's code cache after it: the server ended the request that was still checking the site. Background runs now install an update in one step and check the site in the next, after the code cache has restarted. A check that is cut off is repeated before anything is undone.

= 1.6.1 =
* Fix: on LiteSpeed servers, a background step that waited on a download (for example a large premium plugin) was stopped after about ten seconds, and the update was rolled back five minutes later. Where the server can finish a request early (LiteSpeed, PHP-FPM), each step now takes over and answers before it works.
* Fix: a background request a firewall turns away now falls back to WP-Cron at once.

= 1.6.0 =
* New: restore points are grouped into one package per maintenance run. Open a package to restore or delete its items, or delete the whole package.
* New: a failed restore says why.
* Dev: restore points record where they are kept; hooks let an add-on keep them elsewhere (`noyacare_snapshot_fetch`, `noyacare_snapshot_deleting`, `noyacare_snapshot_after_restore`, `noyacare_snapshot_storage_label`, `noyacare_backups_notes`).

= 1.5.0 =
* New: the client report says what was updated ("3 plugins, 1 theme and WordPress") in the subject, the headline and a short opening paragraph.
* New: the report counts plugin and theme updates, shows the WordPress version, and lists updates grouped by type with the old and new version.
* New: a Safety checks section with the site check, the restore points and the next scheduled maintenance.
* Changed: add-on sections such as website speed now follow the lists of updates.
* Dev: `after_items` position for `noyacare_email_sections`; report data has `counts`, `restore` and `next_run`.

= 1.4.0 =
* New: NoyaCare is free. Every feature in it works without a licence, including speed tests with Google PageSpeed Insights.
* New: website speed tests — PageSpeed Insights plus NoyaCare's own server and page checks, a Website speed screen with the score history and fixes, a dashboard card, `wp noyacare speed` and `GET /noyacare/v1/performance`.
* New: a shared header and tabs on every screen, a Protection panel on the dashboard, and settings split into sections.
* Changed: uptime monitoring, AI analysis, GTmetrix, scheduled speed tests and report branding moved to the NoyaCare Pro add-on. Their settings are kept and come back when Pro is active.
* Changed: automatic runs are off on new sites until a schedule is chosen. Existing sites keep their schedule.
* Changed: requires WordPress 6.2.
* Dev: filters and actions for add-ons (settings, run tasks, reports, speed-test services, dashboard).

= 1.4.1 =
* Fix: the speed-test settings show only the rows for the chosen service.
* Fix: browsers and password managers no longer fill a saved login into the API key fields.

= 1.3.0 =
* New: background runs — resumable steps, live progress, cancel, and a watchdog that resumes or cleanly aborts a stalled run. Scheduled runs use it; WP-CLI and REST runs stay synchronous.
* New: quarantine — a version that was rolled back is held until released, with escalation after three breakages, a dashboard card, report entries and `wp noyacare quarantine`.
* New: monitoring between runs — incidents with alert, reminder and recovery e-mails, a seven-day uptime strip, and `wp noyacare monitor`.
* New: security intelligence — WPScan or Patchstack lookups; security fixes skip the cooling-off period and the major-version hold and lead the client report.
* Fix: after a restore, later updates in the same run no longer fail with "up_to_date".
* Fix: a page that gives no answer during a health check is asked up to three times before it counts as down. On hosts with few PHP workers, a check made from inside a background run could queue behind the run itself, time out and roll back a good update.
* Fix: runs started from WP-CLI or the REST API now notice new PHP error-log entries, including new fatal errors; the log size was read once per process.
* New: licensing for the commercial features, and updates from the vendor's own server. (Both were removed again in 1.4.0.)
* New: `NOYACARE_WHITE_LABEL` hides the vendor from the client's admin without touching report branding.
* Fix: a maintenance run no longer updates NoyaCare itself mid-run; it updates from the Plugins screen instead.
* Fix: `NoyaCare_Risk_Policy::bump_type()` reads a leading "v", classifies a downgrade by the size of the step, and returns `unknown` instead of `patch` for a version string with no leading number.
* Security: server paths, e-mail addresses, IP addresses and tokens are removed from error messages and log excerpts before they are stored, shown or sent to an AI provider; suggested privacy-policy text is added.
* Security: update packages are only downloaded over HTTPS.
* Security: the backup folder never falls back to a guessable name; backups kept under the old fallback are moved.
* Security: health probes follow redirects themselves, so the probe token is never sent to another host.
* Dev: WordPress Coding Standards via PHPCS, a unit-test harness (`php tests/run.php`), a translation template, and `build.sh` to produce the release ZIP.

= 1.0.0 =
* Initial release.
