2026-08-12 - version 1.12.2
* Tweak - Name paid WooCommerce and Freemius packages Laqi Order Status Workflows Pro for WooCommerce on the Plugins screen, so the Free and Pro editions are easy to distinguish when both are installed. Slugs, shared data, and runtime behaviour are unchanged.
* Dev - Verify the expected Free or Pro plugin name inside every channel archive during quality and release workflows.

2026-08-12 - version 1.12.1
* Fix - Keep rules and settings when one edition is removed while another is still installed. Deleting the Free edition after upgrading to a paid one previously ran the full uninstall cleanup and emptied the rule list that the paid edition was still using. Cleanup now runs only when the last edition is removed.
* Tweak - Say in the two-editions notice that both editions share the same rules and settings, so removing the one that is no longer needed keeps them.
* Dev - Regenerate the translation template so the reworded notice can be translated.

2026-08-11 - version 1.12.0
* Tweak - Rename the plugin to Laqi Order Status Workflows for WooCommerce, changing the slug and text domain to laqi-order-status-workflows. Stored rules, settings, and history are untouched, because the laqi_osa_ prefix on every option, metadata, and hook name is deliberately unchanged, and no feature moved between editions.
* Fix - Remove the --file option from `wp osa export`, which wrote to any path the caller supplied. Redirect the command's output instead, for example `wp osa export > rules.json`.
* Tweak - Move the edition comparison out of the notice area at the top of the rules screen and into a single line beneath the rules list.
* Dev - Remove the unused licensing SDK bootstrap from the WooCommerce Marketplace archive, which referenced an SDK that channel has never shipped. No behaviour changes.

2026-08-06 - version 1.11.4
* Fix - Correct the WordPress.org package descriptions so they match the SDK-free Free edition.
* Dev - Include the human-readable Free admin source and reproducible build configuration in the WordPress.org package.

2026-08-06 - version 1.11.3
* Dev - Stabilize the authenticated browser release gate on clean WordPress installations and across both supported REST URL formats.

2026-08-06 - version 1.11.2
* Fix - Pass the CSV escape character explicitly when exporting the Premium audit trail, preserving current output and compatibility with future PHP versions.

2026-08-06 - version 1.11.1
* Add - Manage signed inbound credentials from a dedicated paid-edition screen, including rotation, revocation, endpoint guidance, and last-used visibility.
* Tweak - Clarify trigger conditions and actions in the rule editor, improve label and segment management, and expose stop-after-match priority in the rule list.
* Fix - Keep all paid scan controls and implementation assets out of the Free edition.
* Security - Harden signed inbound requests against replay, oversized payloads, unsafe rotation, and timing inconsistencies.
* Dev - Strengthen release gates for the exact WordPress.org package and shorten its public changelog to the initial Free release.

2026-08-04 - version 1.11.0
* Add - Reusable condition segments in paid editions, compiled into safe per-rule snapshots and refreshed when their named definition changes.
* Add - Signed inbound endpoints for saved rules in paid editions, with one-time secrets, rotation grace, replay protection, and rate limiting.
* Add - Resumable background saved-rule runs in paid editions, with complete previews for large selections, bounded batches, progress, cancellation, status sets, and a capped paginated result log.
* Add - Multi-step sequences in paid editions: up to 20 ordered delayed steps, with 20 actions per step, per-step rule re-checks, durable per-order state, and automatic cancellation when the order or rule no longer matches.
* Fix - Prefix plugin UI selectors with the full Laqi and plugin identifier to prevent collisions with other extensions.

2026-08-03 - version 1.11.0
* Add - Audit trail in paid editions: age- and size-bounded per-action history, filters, CSV export, and conflict-safe undo for reversible actions.
* Add - Shadow mode in paid editions: continuously observe what an active rule would do without running its actions, with a compact configurable log.
* Add - Preview and apply saved rules to existing orders within a required, inclusive order-created date range.
* Add - Split the plugin into a useful free edition and full paid editions from one source tree.
* Add - Offer unlimited rules, nested condition groups, and starter templates in the free edition.
* Add - Build a reproducible, SDK-free WordPress.org submission archive and run official Plugin Check against it in CI.
* Fix - Keep the update source channel-specific so WordPress.org updates the free edition without downgrading paid WooCommerce.com installs.
* Fix - Align the directory readme with the actual free feature set, disclose external behavior, and link to the human-readable React source.

2026-08-03 - version 1.10.2
* Dev - Prefix plugin-owned global identifiers with `laqi_osa_` before public distribution.

2026-08-02 - version 1.10.1
* Fix - Exclude test results, hidden files, and nested ZIP archives from production packages.
* Dev - Stop the build if a development artifact reaches package staging.

2026-07-25 - version 1.10.0
* Add - Run coding standards, frontend asset checks, unit tests, and the WordPress/WooCommerce integration suite in continuous integration across PHP 7.4 and 8.3.
* Add - Build and inspect both sales-channel archives in CI, proving that WooCommerce excludes Freemius and the Freemius build includes its SDK.
* Fix - Let the shared source load safely in PHPUnit when Freemius declines to initialize outside the normal WordPress plugins directory.
* Performance - Restrict privacy export and erasure order lookups to the capped activity log rather than querying a customer's complete order history.
* Security - Reject imported or REST-submitted condition trees deeper than 10 levels or larger than 100 nodes, preventing unbounded recursive processing.

2026-07-22 - version 1.9.1
* Fix - Build the WooCommerce Marketplace package without Composer's Freemius autoload map, which otherwise required an SDK file intentionally excluded from that sales channel.
* Tweak - Update the Freemius sales-channel build to WordPress SDK 2.13.4. The WooCommerce Marketplace build remains unchanged and excludes the SDK.
* Fix - Cancel queued order evaluations and outbound deliveries as well as the recurring scan when the plugin is deactivated.
* Fix - Refuse to package the plugin without its generated rule-builder assets, and verify those assets in the release workflow.

2026-06-27 - version 1.9.0
* Add - More order placeholders for the email, Slack/Teams, and add-note actions: {customer_name}, {billing_address}, {shipping_address}, {order_phone}.
* Fix - The email "Send to" field now resolves placeholders, so {order_email} routes the message to the customer instead of being treated as a literal address and falling back to the site admin.
* Fix - The add-note action now resolves placeholders in the note text; previously a note written with {order_status} (etc.) was saved with the raw placeholder.

2026-06-23 - version 1.8.1
* Tweak - Show the author name as "Laqi Logistics" (was "LAQI Logistics").

2026-06-23 - version 1.8.0
* Add - License management and automatic updates for copies sold through our own store (Freemius). No change to functionality; copies installed from the WooCommerce Marketplace are unaffected.

2026-06-23 - version 1.7.2
* Add - Plugin and author website links (Plugin URI / Author URI) pointing to laqi-logistics.com.

2026-06-15 - version 1.7.1
* Tweak - The rule editor now opens as a focused full-screen view: while editing, the Rules / Activity / Settings tabs are hidden, so an in-progress edit can no longer be lost by switching tabs. Leave via Save, Cancel, or “Back to rules”.

2026-06-15 - version 1.7.0
* Add - Unsaved-changes guard in the rule editor: Cancel asks before discarding edits, and the browser warns before a refresh/close drops them.
* Add - Reorder a rule's actions with up/down controls (actions run in order, so order matters).
* Add - Pre-save warning when a rule wouldn't do anything (no actions, or an action with a blank target) — with a "Save anyway" option.
* Add - A "Back to rules" button at the top of the rule editor (next to Save/Cancel at the bottom), so you don't have to scroll to leave a long form.
* Add - Bulk-delete selected rules from the rule list's selection bar (alongside Enable / Disable), with a confirmation.
* Tweak - Replace the browser's native confirm popups (delete rule, clear log, run-on-existing) with the styled WordPress confirm dialog.
* Tweak - Collapse the per-row icon buttons into a single labelled actions menu; the rule title still opens the editor in one click.

2026-06-14 - version 1.6.0
* Add - Developer extension points so add-ons can extend the engine without forking: register a custom action (laqi_osa_action_registry + laqi_osa_action_types), a custom order-level condition field (laqi_osa_fields), a custom operator (laqi_osa_operators), and a starter template (laqi_osa_rule_templates).
* Add - Rule lifecycle hooks: laqi_osa_should_apply_rule (veto a firing before any action runs) and laqi_osa_before_action / laqi_osa_after_action (audit each action).
* Tweak - Internal refactor with no behaviour change: shared RestController base for the REST controllers, AbstractAction base for action type keys, a Support\Dates date validator, and centralised outbound-URL validation in Delivery.

2026-06-14 - version 1.5.0
* Fix - A rule action that throws (a payment/shipping integration, an email, or a third-party hook) is now caught and logged, so it no longer aborts the rule's remaining actions nor stalls the rest of a time-based scan batch.
* Add - Keyboard-accessible rule reordering: move-up / move-down buttons beside each rule's drag handle, so priority can be set without a mouse (WCAG 2.1.1).
* Tweak - Security: the "set order meta" guard now matches protected keys case-insensitively and covers more WooCommerce operational keys (stock-reduced, recorded sales, email-sent flags, order version, cart hash, …).
* Tweak - The `wp osa scan` CLI command now confirms before applying actions to live orders (bypass with --yes); use `wp osa preview` to dry-run without changes.
* Tweak - Operator labels and the item-quantifier phrases in the rule builder are now translatable.
* Tweak - Failed REST calls in the admin app always surface a message instead of an occasional empty error notice.

2026-06-10 - version 1.4.2
* Fix - Security (SSRF): the webhook and Slack actions now use wp_safe_remote_post with no redirects, so a rule can't make the site POST to internal/loopback addresses.
* Fix - Security: the "set order meta" action refuses WooCommerce core financial and identity keys (order total, customer, payment method, billing/shipping address); filterable via laqi_osa_protected_meta_keys.
* Performance - Cache the customer order-count / lifetime-spend lookups during evaluation, cutting repeated queries on the time-based scan and the "run on existing orders" backfill.
* Performance - Removed unused boilerplate CSS/JS that was being loaded on every front-end and admin page.

2026-06-10 - version 1.4.1
* Add - "Run on existing orders": apply a rule (including on-entry rules) to the orders already in its trigger status, with a match preview and a confirmation before the actions run.
* Tweak - Promoted Rules / Activity / Settings to a top-level tab header; Pause automation and the Add rule / Templates actions now live within the Rules tab.
* Tweak - Clarified the on-demand scan — renamed "Run time-based scan" with a tooltip, and an honest result message, since it only runs time-based rules (on-entry rules fire when an order changes status).

2026-06-10 - version 1.4.0
* Tweak - Reorganised the header into Pause / Activity & Settings / Templates & Add rule, and moved import/export into a tabbed Settings screen (General, Time-based scan, Import / export).
* Tweak - Cleaner action editor: "Add action" sits inside the Then panel; Remove is a trash icon; fields top-align and the email/Slack/note actions stack their fields on their own rows.
* Tweak - Condition rows use trash-icon Remove buttons, a tidier nested-group connector, and an alphabetised Field dropdown.
* Tweak - Rule editor: the Enabled toggle sits above the title, a save error scrolls into view, and inputs share a consistent height.
* Tweak - The "Send a Slack message" action is now labelled "Send a Slack/Teams message".

2026-06-10 - version 1.3.0
* Add - Date-window scheduling: limit a rule to an "active from / until" date range.
* Add - Customer history conditions: customer order count and lifetime spend, for repeat-customer / VIP rules.
* Add - Per-rule "last fired" time, shown on the rules list.
* Add - Onboarding empty state with a "Browse templates" shortcut for new installs.
* Tweak - Rules list shows each rule's day-of-week / date-window schedule, and the enabled state is a hover tooltip on the toggle.
* Tweak - Row actions are compact icon buttons; the action editor and the top editor rows lay out tidily, with the email action's fields on their own rows.
* Fix - Reject a date window whose "active until" is before "active from", with a clear message instead of a silently inert rule.

2026-06-10 - version 1.2.0
* Add - Activity log: an Activity screen showing recent rule firings (rule, time, order, actions), with paging and a clear action.
* Add - Slack/Teams action: post a templated message to an incoming webhook when a rule fires.
* Add - Starter templates: one-click common automations (cancel unpaid, chase processing, auto-complete, flag high-value), opened in the editor to review before saving.
* Add - Duplicate a rule from the list.
* Add - "Run scan now" to trigger the time-based scan on demand from the Activity screen.
* Tweak - Share the {order_*} placeholder substitution between the email and Slack actions.

2026-06-10 - version 1.1.0
* Add - Webhook action: POST a signed JSON order snapshot to an external URL when a rule fires.
* Add - Email action: send an email (to a chosen address or the site admin) with {order_number}/{order_status}/{order_total}/{order_email} placeholders.
* Add - Public holidays setting: business-day rules skip listed YYYY-MM-DD dates as well as weekends.
* Add - Per-rule day-of-week scheduling: restrict a rule to chosen weekdays (Mon-Sun), for both on-entry and time-based triggers.
* Add - "Is any of" / "is none of" multi-select, so one condition can match a list of values (tags, shipping methods, categories, ...).
* Add - Type-ahead search for product and coupon condition values instead of free text.
* Tweak - Group the rules list into a collapsible section per trigger status; reorder priority within a status.
* Tweak - Enable/disable a rule inline from the list, and pause all automation from the rules screen.
* Tweak - Label the equality operators "is (=)" and "is not (≠)" for clarity.

2026-06-10 - version 1.0.0
* Add - Initial release.
* Add - Visual rule builder: nested AND/OR condition groups with a plain-English summary of each rule.
* Add - Two trigger kinds - when an order enters a status, or when it has been in a status for N days, the latter via a recurring background scan.
    * Add - Time-based thresholds can count calendar days or business days (skipping weekends; holidays via the laqi_osa_is_business_day filter).
* Add - Conditions across order and item fields - shipping/billing country, shipping/payment method, order total, currency, customer type, coupon, item count, and item-level product/category/tag/shipping class with any/all/none quantifiers - using field-aware value pickers.
* Add - Multiple actions per rule - set status, add order note, set order meta.
* Add - Priority ordering by drag-and-drop, first-match-wins with optional stop-on-match.
* Add - Three-tier settling delay (global default, per-rule override, immediate); asynchronous evaluation via Action Scheduler with a loop guard and depth cap.
* Add - Dry-run - test a rule's conditions against recent orders before saving.
* Add - Import and export rules as a JSON file, with validation on import.
* Add - Global controls - pause all automation, and toggle the per-fire audit order note; configurable scan frequency and per-status batch size.
* Add - HPOS (custom order tables) and Cart & Checkout Blocks compatibility; full internationalization.
* Add - Complete data removal on uninstall (settings, rules, order bookkeeping, scheduled jobs); orders are never touched.
