> ## Documentation Index
> Fetch the complete documentation index at: https://docs.lexq.io/llms.txt
> Use this file to discover all available pages before exploring further.

# Changelog

> New features and changes that affect how you use LexQ, newest first.

New features and changes that affect how you use LexQ, newest first. Where a guide explains a change, its entry links there.

**October 2026**

Rollback checks, more domain templates, type checks before execution, read-only deleted groups, and fewer 500 errors

## Inputs over their length limit get a 400

Fact keys and display names over 100 characters and fact descriptions over 500 are rejected with `400` (`C-001`) instead of `409` (`C-006`). Bulk fact registration skips a key that is too long as `INVALID_KEY` and creates the rest. Passwords over 72 characters and profile names over 255 are rejected with `400` (`C-001`) instead of failing with `500`, and the console stops a password that is too long before you submit it. Phone numbers are limited to 50 characters, and sign-up accepts email addresses up to 254 characters. If you set a password longer than 72 characters before, reset it to sign in.

## Dataset files from the local MCP server

The local MCP server uploads a CSV or JSON file by its path with `lexq_dataset_upload_file`, so the file's content never passes through the conversation. Datasets must be UTF-8. A file in another encoding is rejected with `AN-040`. See [Dataset files](https://docs.lexq.io/cli/mcp-server.md#dataset-files) and [Supported Formats](https://docs.lexq.io/guides/simulation.md#supported-formats).

## Limits on the hosted MCP server

The hosted MCP server at `mcp.lexq.io` now caps a JSON-RPC batch at 100 messages and a tool argument at 10,000 elements. It rejects compressed request bodies (`Content-Encoding`) with `415`, and request bodies stay limited to 100 KiB. See [Dataset files](https://docs.lexq.io/cli/mcp-server.md#dataset-files) for larger uploads.

## Rollback checks what you read

A rollback can now include the version and deployment you read from the group. If anyone deployed, rolled back, or undeployed after that, the rollback is rejected with `409` (`P-062` or `P-063`) and nothing changes. The console's rollback dialog shows the version it restores and sends both values, and CLI 2.0.0 adds `--expected-current-version-id` and `--expected-current-deployment-id`. The `lexq_deploy_rollback` MCP tool on the local and hosted servers requires both values, so a call without them fails validation. See [Rollback](https://docs.lexq.io/guides/deployments.md#rollback).

## A/B tests use versions from the same group

Starting an A/B test with a version from another policy group is rejected with `P-016`. See [A/B Testing](https://docs.lexq.io/guides/ab-testing.md).

## Fact updates report rules outside a new value domain

When a fact update changes the value domain, the response lists, in `meta.valueDomainMismatch`, the rules whose conditions use values outside the new domain. The console shows them in a dialog, the CLI prints them to stderr from 1.1.6, and the MCP tool adds them to the end of its result. The update is still saved. A changed domain reaches execution only in a version you publish after the change; deploying or rolling back to an existing version does not apply it, although the docs said redeploying was enough. Leaving out `name` or `description` now keeps the current value; send an empty `description` to clear it. See [Rules outside a changed domain](https://docs.lexq.io/guides/fact-definitions.md#rules-outside-a-changed-domain) and [Changing a domain later](https://docs.lexq.io/guides/fact-definitions.md#changing-a-domain-later).

## The simulation list returns pageNo and pageSize

The simulation list now returns the same page fields as other lists. `pageNo` and `pageSize` replace `number`, `size`, `pageable`, `sort`, `first`, `numberOfElements`, and `empty`; `content`, `totalElements`, `totalPages`, and `last` are unchanged. The JSON output of `lexq analytics simulation list` and the result of `lexq_simulation_list` change the same way. To request a page from any list, send `page` and `size`. The docs named `pageNo` and `pageSize`, which the API ignores, so those requests always got the first page at the default size. See [Pagination](https://docs.lexq.io/api/introduction.md#pagination).

## More domain templates, and apply stops on a conflicting fact

Fintech Transfer Approval, SaaS Plan Limits, Insurance Claim Triage, and AI Agent Action Approval join a reworked E-Commerce Checkout Pricing. Applying a template stores value domains on its input facts, and the preview shows rule descriptions, value domains, and any of your facts that conflict. If you already have a fact with the same key but a different type or value domain, apply fails with `409` (`P-061`) and creates nothing, and the console disables **Apply**. Until now, apply kept your fact and ran the template's rules on it. Templates you applied before are unchanged. See [Domain Templates](https://docs.lexq.io/domain-templates.md).

## Fact values are checked before execution

A request that sends a value of another type for a registered fact the version reads, such as `"85"` for a `NUMBER`, now fails with `400` (`P-060`) before any rule runs. Earlier, the request returned `200` and that rule's condition quietly did not match. `null` is not a mismatch, keys you have not registered are not checked, and the check uses the declarations copied when the version was published. Every key that an active rule reads must be sent, whether or not the fact is marked required, or the request fails with `400` (`P-015`). The docs said optional facts could be left out. See [Unregistered Facts](https://docs.lexq.io/guides/fact-definitions.md#unregistered-facts) and [Required vs Optional Facts](https://docs.lexq.io/guides/fact-definitions.md#required-vs-optional-facts).

## Fewer 500 errors

These requests failed with `500` and now get an answer that names the cause:

* A fact whose value is `null` no longer fails the request with `C-004`. Conditions on it do not match, the other rules run, and `inputFacts` keeps the order you sent.
* A missing or non-JSON `Content-Type` returns `415` (`C-010`).
* A missing required parameter or header, an unknown sort field, an out-of-range page number, or a `null` list item returns `400` (`C-001`).
* In a batch, an item's `P-015`, `P-052`, or `P-060` returns `400` with that code. A failed batch returns the first failing item's error, without its position.

Other answers changed too. A batch item without `facts` is now rejected with `400` (`C-001`). Search filters that cannot be converted return `C-005` instead of `C-001`, and reorder requests with a priority of 0 or an empty ID return `C-001` instead of `P-034`, `P-025`, or `P-010`. `P-003` is a `500`, as it always was; the docs listed it as `400`. See the [error reference](https://docs.lexq.io/api/errors.md).

## isBlocked and blockReason are pre-registered facts

Every organization now has `isBlocked` (`BOOLEAN`) and `blockReason` (`STRING`), the two keys `BLOCK` writes, as pre-registered facts. A `SET_FACT` or `MUTATE_FACT` that targets either key is rejected on save and publish with `400` (`ACT-033`), so a later rule can no longer clear a block that an earlier rule set. Their type cannot be changed (`403`, `FD-003`). `BLOCK` records the block, and the remaining actions and rules still run; your application decides whether to stop. The console used to say that it stopped execution. See [Pre-registered Facts](https://docs.lexq.io/guides/fact-definitions.md#pre-registered-facts) and [How a request runs](https://docs.lexq.io/guides/policy-rules.md#how-a-request-runs).

## Deleted groups are read-only records

A deleted group now stays as a read-only record. Changing its settings, versions, or rules, publishing, deploying, scheduling a deployment, starting an A/B test, or deleting one of its versions returns `409` (`P-059`). Its rows carry a **Deleted** badge, the group filter in Deployments and Executions lists **Deleted groups**, and the CLI's table output marks them `(deleted)`. Their decisions can still be replayed. Rules in deleted groups no longer stop you from deleting a fact or changing its type, so to remove a template, delete its group and then its facts. See [Deleting a Group](https://docs.lexq.io/guides/policy-groups.md#deleting-a-group) and [Records of a Deleted Group](https://docs.lexq.io/guides/policy-groups.md#records-of-a-deleted-group).

## Disabled groups can still be tested

Dry runs, dry-run comparisons, and simulations now run on a disabled group, so you can check a fix before you enable it again. Live executions still need an active group. The console asks before it disables a group and shows a banner with **Re-enable** while it is disabled. A composite execution that includes a disabled group is rejected as a whole; to leave one group out of composite executions, undeploy it instead. See [Disabling a Group](https://docs.lexq.io/guides/policy-groups.md#disabling-a-group).

## Action targets must be registered facts

Saving or publishing a rule whose `SET_FACT` or `MUTATE_FACT` targets a key that is not a registered fact now fails with `400` (`ACT-032`), which lists the missing keys. Register the fact first. Versions you published before still deploy, but a draft cloned from one needs its targets registered before you publish it. An empty or non-string `targetVar` fails with `400` (`ACT-016`). See [Action Types](https://docs.lexq.io/guides/policy-rules.md#action-types).

## Cancelling a replay or simulation stops it

Cancelling a replay or a simulation now stops the job, and you are billed only for the records it processed. Failed jobs are not billed. Pending and running jobs count toward your plan's record limit when you submit another, so a submission past the limit fails with `403` (`B-008`). A replay's `capped` is `true` only when the window held more records than `maxRecords`. See the record limits for [replays](https://docs.lexq.io/guides/decision-replay.md#record-limits) and [simulations](https://docs.lexq.io/guides/simulation.md#record-limits).

## Versions past their effective period are rejected

Publishing, deploying, or rolling back a version whose effective period has ended now fails with `400` (`P-058`). A version update that leaves out an end of the period keeps it. To clear an end, send `clearEffectiveFrom` or `clearEffectiveTo`, pass `--clear-effective-from` or `--clear-effective-to` from CLI 1.1.0, or click **✕** in the console. Before this change, an update without them erased both ends. In the console, an end picked as 23:59 now covers that whole minute. An end you saved before stops at 23:59:00 until you pick it again. See [Effective Date Range](https://docs.lexq.io/guides/policy-versions.md#effective-date-range).

## Fixed CLI options

From CLI 1.1.0, `lexq profile <groupId> --version-id <id>` profiles that version, and `lexq analytics simulation start --file request.json` sends the file as the request body. Both failed in earlier versions, and `--version` only printed the CLI version number. From CLI 1.1.6, `lexq facts update --pii` and `--no-pii` change the fact's PII setting; earlier versions never sent them. See [Profile](https://docs.lexq.io/cli/commands.md#profile) and [PII Facts](https://docs.lexq.io/guides/fact-definitions.md#pii-facts).

## Any IANA time zone for your organization

The console's organization settings now offer every IANA time zone, searchable by city, region, or offset, instead of a list of 33 that were mostly in the US. The Performance tab now draws its reference time and latency chart in the organization's time zone. From CLI 1.0.2, a `yyyy-MM-dd` date filter covers that whole day in the organization's time zone, table output shows times in UTC with `Z`, and `lexq status` prints `tenantTimezone`. The CLI's help did not say which time zone date filters used.

## Corrections to the docs

* The execution response carries changed facts in `mutatedFacts` and new values, including `__delta` keys, in `generatedVariables`. There is no `outputVariables` field. See [How a request runs](https://docs.lexq.io/guides/policy-rules.md#how-a-request-runs).
* To compare the two versions of an A/B test, run `lexq history list --version-id` for each. `lexq history stats` combines both. See [Monitoring Results](https://docs.lexq.io/guides/ab-testing.md#monitoring-results).
* The Performance tab measures only executions that do not name a version. Specific-version executions, dry runs, simulations, and replays are not measured. Specific-version execution also skips the compiled rule cache, so split traffic with an A/B test instead. See [How measurement works](https://docs.lexq.io/guides/performance-profiling.md#how-measurement-works).
* Resolving or ignoring failure logs is console-only: an organization admin does it under **Management → Failure Logs**. API keys can only read failure logs, so `lexq logs action`, `lexq logs bulk-action`, and the matching MCP tools are rejected with `403` (`A-002`). See [Logs](https://docs.lexq.io/cli/commands.md#logs).
* The CLI needs Node.js 22 or later. See [Requirements](https://docs.lexq.io/cli/installation.md#requirements).


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.