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

# Changelog

> The latest updates, improvements, and fixes to the Cernel platform.

Stay up to date with what's new in Cernel. This page lists recent platform changes, new features, and improvements. For longer write-ups on major releases, see the [Blog](/blog/overview).

<Update label="2026-08-14" description="Let a taxonomy place products in more than one category">
  ## Multiple categories per product

  When you create a custom taxonomy, you can now turn on **Allow multiple categories per product** so the AI can place each product in several categories at once instead of just one. A new **Multicategory Agent Settings** section in Classification Settings sets the most categories a product can get (1 to 5) and whether a category and one of its own subcategories can be held together. You can also tick or untick a product's categories by hand. This is a permanent choice made when the taxonomy is created, and single-category taxonomies, including the built-in Cernel Taxonomy, are unchanged.

  See [Placing products in more than one category](/features/custom-taxonomies#placing-products-in-more-than-one-category).
</Update>

<Update label="2026-08-12" description="Shift-click to select a range of attributes when starting enrichment">
  ## Select a range of attributes at once

  In the **Configure Enrichment** modal, you can now click one attribute, hold **Shift**, and click another to select every attribute between the two in one go. The range follows the list as displayed, so it respects whatever you've typed in the attribute search box. This makes picking a long run of attributes faster on categories with large attribute sets.

  See [Running enrichment](/features/jobs-and-enrichment#running-enrichment).
</Update>

<Update label="2026-08-11" description="Select across the product table to set, clear, or enrich many values at once">
  ## Bulk edit values from the product table

  A new **Bulk select** mode turns the product table into a grid you can select across. Pick individual values, whole rows, or whole columns (drag or hold **Shift** to take a block), then set a shared value, clear the field, or send the whole selection to enrichment in one action. Manual edits ask you to confirm the count first, and a **Send for review** option lets the changes wait for approval instead of writing straight to your products. The same bulk selection works on the Review surface.

  See [Editing values in bulk](/features/jobs-and-enrichment#editing-values-in-bulk).
</Update>

<Update label="2026-08-11" description="Poll product completeness through the changes API">
  ## Track product completeness over the API

  The product changes endpoint can now return a per-product **completeness summary**. Pass `include_summary=true` and each change carries how many attributes the product's category defines, how many of those an AI agent can fill, and how many are populated in each enabled language. This lets a custom pipeline show enrichment progress or gate a downstream publish without a separate lookup.

  See [Tracking product completeness](/integrations/public-api#tracking-product-completeness).
</Update>

<Update label="2026-08-06" description="Rename a job from the Jobs list at any time">
  ## Rename a job

  You can now rename any job from the **Jobs** page, in any status. Enrichment setup has several steps and the job title is easy to skip past, so the **Rename job** action in a job's **Actions** column lets you give a run a clearer name after it has started, or even once it has finished. The new name shows everywhere the job appears, including the header job-status list.

  See [Renaming a job](/features/jobs-and-enrichment#renaming-a-job).
</Update>

<Update label="2026-08-06" description="Delete an automation straight from the Automations list">
  ## Delete an automation from the list

  You can now delete an automation directly from the **Automations** list through its row menu, without opening the automation first. Deleting is permanent and asks you to confirm, and the built-in Cernel Classification Automation can't be removed. Previously delete was only available on an automation's detail page.

  See [List-view actions](/features/automations#list-view-actions).
</Update>

<Update label="2026-07-31" description="Shopify import now brings in each product's storefront URL and handle, plus per-variant URLs and IDs">
  ## Shopify import adds store URLs, handles, and variant IDs

  The Shopify integration now imports a few more identifiers alongside the existing product data. For each product you get its **online store URL** and its **URL handle** (the storefront slug), and for each variant you get the variant's **Shopify ID** and its **online store URL** (the storefront link with that variant preselected). The online store URL is populated for products published to your Online Store sales channel; products that aren't published there import without a URL until you publish them.

  See [What data syncs](/integrations/shopify#from-shopify-into-cernel).
</Update>

<Update label="2026-07-29" description="CSV import reads Excel 'CSV UTF-8' files, including UTF-16 and UTF-32 with a byte-order mark">
  ## CSV import handles more file encodings

  CSV import now reads an Excel **CSV UTF-8** export exactly as saved. Previously the file's leading byte-order mark attached to the first column header, so that column matched nothing and silently dropped from the import. UTF-16 and UTF-32 files that start with a byte-order mark are also read correctly. When a file's encoding can't be determined, Cernel stops the import and asks you to re-save as **CSV UTF-8**, rather than importing scrambled text.

  See [the CSV import FAQ](/integrations/csv-import-export#frequently-asked-questions).
</Update>

<Update label="2026-07-29" description="Variant values now appear in the Review queue under a category or filter">
  ## Variants show up in Review

  Proposed values for product variants now appear on the **Review** surface whenever you select a category in the sidebar or apply a search or filter, alongside their parent products. Previously these variant values dropped out of view as soon as a category or filter was applied, leaving that enrichment work with no way to reach it. Each variant now lists as its own row and is approved, edited, or rejected like any product, and the header **select all** includes variant values when you decide a whole category or job at once.

  See [the enrichment FAQ](/features/jobs-and-enrichment#frequently-asked-questions).
</Update>

<Update label="2026-07-24" description="See a product's own activity log on its new Events tab">
  ## Events tab on the product detail page

  The product detail page gains an **Events** tab that lists the system activity Cernel has recorded for that specific product, such as when it was enriched, classified, or synced with an integration. Each entry is graded **Info** or **Error**, so you can filter by minimum severity to focus on problems, and expand a row for the full details. The feed is scoped to the product you're viewing, so it never mixes in another product's activity.

  See [Working with a product](/features/product-detail#working-with-a-product).
</Update>

<Update label="2026-07-22" description="A single unusable product image no longer fails the whole enrichment">
  ## Enrichment tolerates unusable images

  When one of a product's images can't be processed (it can't be fetched, isn't a valid image, or is unusually large), Cernel now skips just that image and generates the value from the product's remaining inputs, instead of failing the enrichment. A run only fails when no usable input is left. The agent also records a short note in its **Reasoning** when it leaves an image out, so you can tell exactly what was skipped and why.

  See [the enrichment FAQ](/features/jobs-and-enrichment#frequently-asked-questions).
</Update>

<Update label="2026-07-22" description="Select all in Review now decides every matching value, not just the loaded page">
  ## Select all covers the whole review queue

  Using **select all** on the Review surface now approves or rejects every in-review value that matches your current filters, including products beyond the ones loaded on screen. In a single-job review, it covers that job's entire pending set. Previously select all only reached the rows already loaded, so a large queue needed scrolling to the bottom before you could decide it in one action. You can still deselect individual products to leave them out, and the confirmation dialog notes how many you excluded.

  See [Approving, rejecting, and dismissing](/features/jobs-and-enrichment#approving-rejecting-and-dismissing).
</Update>

<Update label="2026-07-18" description="Translated content keeps the original prompt's length, tone, and format rules">
  ## Higher-quality translations

  When a language is set to **Translate**, Cernel now follows the same length, tone, and format rules that the original prompt used when it generated the source value. A value written to a 150-word limit, for example, stays within that limit after translation instead of drifting. Every translated value also passes the same quality check Cernel applies to generated content, so output that comes back corrupted is rejected and retried automatically.

  See [Languages](/features/languages#frequently-asked-questions).
</Update>

<Update label="2026-07-17" description="Search and filter your product table down to individual variants">
  ## Search within child products

  The product table's search and filters now reach child products, not just parents. Turn on the new **Search within children** toggle in the toolbar (available once you've entered a search or applied a filter) and matching variants appear under their parent product, with columns for the properties that set each one apart and the matched text highlighted. This makes it easy to find and act on individual variants, which previously the table's search and filters could not target.

  See [the variant search FAQ](/features/jobs-and-enrichment#frequently-asked-questions).
</Update>

<Update label="2026-07-15" description="Exclude products by value with the new Does not contain filter">
  ## New "Does not contain" product filter

  The product list gains a **Does not contain** operator, so you can filter to the products whose attribute value does *not* include a term you enter. It joins the existing operators (Equals, Contains, Has data, Has no data, and more) for building enrichment batches and finding the products you want to work on.

  See [Filtering the product list](/features/jobs-and-enrichment#filtering-the-product-list).
</Update>

<Update label="2026-07-14" description="The enrichment modal now includes child products by default">
  ## Enrichment includes variants by default

  When you open the enrichment modal, **Product Scope** now starts on **Include child products**, so a master product and its variants are enriched together. Variant-heavy catalogs no longer need to change the scope on every run. You can still narrow it to the selected products only, or to only child products, per run.

  See [Running enrichment](/features/jobs-and-enrichment#running-enrichment).
</Update>

<Update label="2026-07-14" description="Automations now carry the full set of enrichment options">
  ## Enrichment options for automations

  Automations now offer the same controls as a manual enrichment run. Set the **Product Scope** to reach child products, toggle **Review** to decide whether results wait for approval or apply automatically, turn on **Only enrich missing fields** to backfill without overwriting, and use **Language Configuration** to generate, translate, or skip each language. The options are saved with the automation and applied to every run it triggers.

  See [Enrichment options](/features/automations#enrichment-options).
</Update>

<Update label="2026-07-10" description="Shopify measurement metafields now import with their units">
  ## Fuller Shopify metafield import

  The Shopify integration now imports every metafield value type. **Measurement** metafields (weight, dimensions, volume, temperature, and similar) import as a numeric value together with its unit, and their multi-value list variants come through as lists. Value types Cernel doesn't model natively import as plain text so nothing is dropped.

  See [What data syncs](/integrations/shopify#what-data-syncs).
</Update>

<Update label="2026-07-09" description="A rebuilt product detail page with completeness, per-language editing, variants, and integration data">
  ## A richer product detail page

  Opening a product now gives you everything Cernel holds for it in one place. A **Completeness** ring shows how much of the category's attribute set is filled in, and the **Attributes** tab lists every value with its language coverage and its origin (enriched, manual, or imported). Edit a value inline, fill in a missing one, or open **Edit translations** to update every language at once. Each value keeps a version history you can restore from.

  Products with variants get a **Variants** tab showing what makes each one distinct, and every connected integration gets its own tab with the raw properties it sends and how they map to your attributes.

  See [Product detail](/features/product-detail) for the full guide.
</Update>

<Update label="2026-07-08" description="Name, search, filter, and cancel your enrichment jobs">
  ## Manage your jobs more easily

  You can now give an enrichment run a **Title** when you start it, so it's easy to find on the Jobs page later. Leave it blank and Cernel names the job for you from the attributes and category you picked. The Jobs page also gained a search box and filters (status, trigger, who started it, product, and date range) to narrow a long history, and you can now **cancel** a job that's still pending or running straight from its row.

  See [The Jobs page](/features/jobs-and-enrichment#the-jobs-page).
</Update>

<Update label="2026-07-08" description="Reuse an existing CSV import as a template, even when the new file's columns differ">
  ## Reuse a CSV import as a template

  You can now start a new CSV import from an existing one with **Use as template for new import**, even when the file you upload doesn't line up with the original column for column. Cernel matches columns by name: columns that match keep their original mapping, and anything new starts in **Skipped columns**, ready for you to map. A vendor changing or reordering their columns no longer blocks the reuse.

  See [Importing products from a CSV](/integrations/csv-import-export#importing-products-from-a-csv).
</Update>

<Update label="2026-06-28" description="A reworked Jobs experience and a dedicated Review surface for AI-proposed values">
  ## Jobs & Review

  Enrichment now cleanly separates running a job from deciding what goes live. The **Jobs** page tracks every run (status, progress, and who started it) while the new **Review** surface is where you approve, edit, or reject the values your agents propose. Work through one product at a time or decide in bulk; open a job to review just its values, or switch to **Review** on the Products area to handle everything waiting for a decision. Each proposed value shows the prompt, the agent's reasoning, and the inputs behind it, so you can decide with full context.

  See [Jobs & Review](/features/jobs-and-enrichment#reviewing-proposed-values) for the full guide, or read the story behind it on the [blog](/blog/jobs-and-review).
</Update>

<Update label="2026-06-23" description="A new agent type that selects the best value from a set of candidates">
  ## Picker agent (Preview)

  A new **Picker** agent type *selects* the best value (or values) from a set of candidates, instead of generating new content: the cleanest packshot, the strongest tagline, or the top few options. It runs in two phases: find candidates (from your prompt, your catalog, or your Data Sources), then pick from them by letting the AI rank against a rubric or by choosing at random.

  Picker is an early-access **Preview** feature whose behavior may change.

  See [Picker agent](/features/ai-agents#picker-agent).
</Update>

<Update label="2026-06-22" description="A rebuilt CSV import and export experience">
  ## Redesigned CSV import and export

  CSV import and export now have a dedicated home in the sidebar. Open **CSV** under **Tools**. Importing walks you through where your file comes from (a **catalog** you manage in one place, or **vendor** files that arrive in many shapes), suggests how each column maps to your attributes and product identifiers, and shows a preview of exactly what will be created or updated before the import runs.

  Exporting is now template-based: save a reusable column layout as a **CSV export template**, then run it from the Products page whenever you need a file. You can still pick columns ad hoc at export time.

  See [CSV Import & Export](/integrations/csv-import-export) for the full guide, or read the story behind the redesign on the [blog](/blog/an-improved-csv-experience).
</Update>

<Update label="2026-06-19" description="Re-run property mappings on API integrations without re-sending products">
  ## Reapply mappings for API integrations

  After you change an attribute, an agent, or a property mapping, you can now re-run the current mappings across every product in an **API integration**. Open the integration's **Settings** menu and choose **Reset Integration → Reapply mappings**. Because API integrations receive products directly, there's nothing to re-import; reapplying mappings re-processes your existing products in place, much faster than a full restart.

  See [Managing the product lifecycle](/integrations/public-api#managing-the-product-lifecycle).
</Update>

<Update label="2026-06-17" description="Pin the agent type when creating an agent from a description">
  ## Choose the agent type up front

  When you create an agent by describing what it should do, you can now optionally pin the type of content it generates (Text, HTML, Single Select, Multi Select, External Data, or Media) before Cernel writes the prompt. Leave it unset and Cernel detects the type from your description, or select one to lock it in when you already know what you need (for example, **Single Select** for a gender classifier).

  See [Creating an agent](/features/ai-agents#creating-an-agent).
</Update>

<Update label="2026-06-08" description="Replace generated image backgrounds with a single exact color">
  ## Recolor image backgrounds on Media agents

  Media agents that generate images can now replace the background of every image with one solid color, ideal for product and studio shots that need a clean, consistent backdrop. Open the Media agent's **Advanced Settings** tab and switch on **Recolor background** to set the target color, choose how shadows are handled (**Replace background**, **Preserve shadows**, or **Hybrid**), and pick the edge-processing engine.

  See [Advanced configuration](/features/ai-agents#advanced-configuration).
</Update>

<Update label="2026-06-08" description="Control the automatic language instruction per language">
  ## Per-language enrichment toggle

  Each language's detail page (**Tools > Languages** → click a language) now has a **Use translation prompt for all language enrichments** toggle. While it's on - the default - Cernel automatically instructs your agents to write that language's enriched content *in* that language, so output always comes back correctly localised. Turn it off when you'd rather control the output language entirely through your own prompts.

  See [Setting up languages](/features/languages#setting-up-languages).
</Update>

<Update label="2026-06-04" description="Control the alt text and file names of AI-generated images">
  ## Alt text and file name instructions for Media agents

  Media agents that generate images now have **Alt Text Instructions** and **File Name Instructions** fields in the **Advanced Settings** tab. Tell the AI how to describe each image (for accessibility and SEO) and how to name the generated file, and reference product data like the title or color by typing `/`. Leave a field empty to keep Cernel's defaults.

  See [Media agents: image output, alt text, and file names](/features/ai-agents#advanced-configuration).
</Update>

<Update label="2026-06-03" description="Watch the agent sandbox generate results live">
  ## Live streaming in the agent sandbox

  The agent sandbox's **Review & Test** step now streams results live. Each product's card updates with a rotating status as the agent works and shows its output the moment that product finishes, so early results appear while the rest are still running, instead of everything landing at the end. Click **View live agent thinking** on a card to watch the agent's reasoning stream in real time; it stays available afterward, including for products that errored, so you can see what the agent did before a failure.

  See [Run the agent](/features/sandbox#step-by-step-guide).
</Update>

<Update label="2026-06-01" description="Faster prompt picker and live progress on CSV exports">
  ## Breadcrumb navigation in the prompt reference picker

  The `/` reference picker in the agent prompt editor now shows a clickable breadcrumb trail at the top of each submenu (for example, `Data Sources > Models > ToV`), so you can jump back to a parent level instead of starting over. Search inside the picker is also space-tolerant: type `Specifications type 1` and it matches entries named `specifications_type_1`.

  See [Referencing Data Sources in your prompt](/features/ai-agents#configure-the-prompt).

  ## Live counter on CSV exports

  The **Export to CSV** modal now shows a live **Exported N products** count on the button while the file streams, replacing the previous spinner. Large exports finally show their progress instead of looking stuck.

  See [Download the CSV](/integrations/csv-import-export#on-demand-export-from-the-products-table).
</Update>

<Update label="2026-05-30" description="Push and pull product data in several languages from one API integration">
  ## Multiple languages per API integration

  An API integration is no longer locked to a single language. Pick any number of languages when you create or edit the integration; the first one becomes **Primary** and acts as the fallback when a property is pushed without a language. Properties carry an optional `locale` field, and Cernel stores each localized variant separately and surfaces it to enrichment, the product UI, and the `/changes` endpoint.

  The new `PATCH /products` and `GET /products` endpoints (see [Patching products](/integrations/public-api#patching-products-partial-updates) and [Listing products](/integrations/public-api#listing-products)) shipped alongside, so you can update individual localized values and look products up by identifier without re-sending full payloads.

  See [Setting up the API integration](/integrations/public-api#setting-up-the-api-integration) and [Working with multiple languages](/integrations/public-api#working-with-multiple-languages).
</Update>

<Update label="2026-05-28" description="Enrich only the attributes that are currently empty">
  ## Only enrich missing fields

  The enrichment modal has a new **Only enrich missing fields** toggle. Turn it on and the AI only generates values for attributes that are currently empty; existing values you've reviewed or hand-edited are left alone. Turn it off to re-enrich every selected attribute and overwrite current values. Use it to backfill a newly-added attribute across a large catalog without touching products you've already finished.

  See [Running enrichment](/features/jobs-and-enrichment#running-enrichment).
</Update>

<Update label="2026-05-27" description="Cancel a sandbox run, no more auto-runs">
  ## Sandbox stays put until you tell it to run

  The agent sandbox no longer auto-runs when you open the **Review & Test** step, switch attribute types, or send a chat refinement. The 5 random products are still pre-selected for you, but Cernel waits for an explicit **Run** click before calling the LLM. Chat refinements still rewrite the prompt and save a new version in history. You click **Re-run** when you want to see the new output. This puts you in control of when the (potentially slow) enrichment pass actually fires.

  ## Cancel an in-progress sandbox run

  While a sandbox run is in flight, the **Run** button becomes **Cancel**. Click it to abort the request immediately. Any results that already came back are kept, you get a *Run cancelled* toast, and the button returns to a startable state so you can adjust and try again. Especially useful for External Data agents in Agentic mode, where a single pass can take a couple of minutes.

  See [Run the agent](/features/sandbox#step-by-step-guide).
</Update>

<Update label="2026-05-26" description="Web research without writing search queries by hand">
  ## Agentic mode for External Data web research

  External Data agents that pull text data from the web now have a **Mode** selector with two options:

  * **Classic**: you define the exact search queries and trusted sources; Cernel searches them and combines the results.
  * **Agentic**: Cernel plans and runs the searches itself, one product at a time, based on each product's details. You don't write search queries; you control scope through **Block these domains** and **Restrict to these domains**, and accuracy through **Match by** (a product identifier such as SKU or GTIN, or **Broad search** on the title).

  Use Agentic mode when your products vary too much for one query template to cover: for example, sourcing technical specs across thousands of SKUs from manufacturers you don't enumerate up front. The **What to Extract** prompt (renamed from Synthesis Instructions) tells the agent what to pull out of the matched results.

  Agentic external data also works end-to-end inside the [Agent Sandbox](/features/sandbox): you can preview a run, refine the prompt through chat, and re-run on the same products, just like every other agent type.

  See [External Data agents: Classic vs Agentic mode](/features/ai-agents#advanced-configuration).
</Update>

<Update label="2026-05-08" description="Enable Shopify product variants from the integration detail panel">
  ## Shopify product variants

  Shopify integrations now have a **Variants** control on the integration detail panel. Click **Enable**, confirm the dialog, and Cernel starts importing each Shopify variant as its own variant record under the parent product. Enabling variants is a one-way action, so the dialog warns up front before you commit.

  See [Working with product variants](/integrations/shopify#working-with-product-variants).
</Update>

<Update label="2026-05-07" description="Connect Struct PIM workspaces with two-way sync">
  ## Struct PIM is now a supported integration

  Connect a Struct PIM workspace directly from **Tools > Integrations > Add integration**. Both Struct PIM v3 and v4 are supported, and you can optionally target a specific dimension when Cernel pushes enriched content back to Struct PIM.

  See [Struct PIM integration](/integrations/struct).
</Update>

<Update label="2026-05-06" description="New Automations page, sentence builder, and multi-taxonomy support">
  ## Redesigned Automations with multi-taxonomy support

  Automations now live on dedicated pages, `/automations` for the list and `/automations/new` (or `/automations/{id}`) for the detail view, instead of a four-step modal. Each automation is configured through a single editable **sentence builder** that reads as one line: *"New and updated products in \[category] will automatically enrich \[attributes] narrowed to only products matching \[filters]"*.

  Each automation is now scoped to one taxonomy explicitly, so you can run independent automations on different taxonomies for the same product. You can also pick **Unclassified products** as the target, which limits the automation to setting the taxonomy's classifying attribute, useful for getting unclassified products into the right category before further enrichment runs.

  Run history has moved to a dedicated **Run history** tab on the automation detail page.

  See [Creating an automation](/features/automations#creating-an-automation) and [Multi-taxonomy and Unclassified products](/features/automations#multi-taxonomy-and-unclassified-products).
</Update>

<Update label="2026-05-03" description="Add any locale by code, including regional variants">
  ## Free-text locale codes when adding a language

  The **Add Language** modal in **Tools > Languages** now accepts any valid locale code as free text instead of picking from a fixed dropdown. Type a code like `en`, `da`, or a region-specific variant such as `sv_FI` or `pt_BR` and the platform validates it on submit. This unlocks locales that weren't in the previous list and gives you region-specific content where you need it.

  See [Add a new language](/features/languages#setting-up-languages).
</Update>

<Update label="2026-04-23" description="On-demand CSV export and dedicated Jobs page">
  ## On-demand CSV product export

  Export products to CSV directly from the products table, no integration setup required. Pick any combination of attributes, identifiers, product fields, child products and integration data, drag to reorder columns, and customise headers before downloading.

  See [On-demand export from the products table](/integrations/csv-import-export#on-demand-export-from-the-products-table).

  ## Dedicated Jobs page

  Job tracking now lives on its own [Jobs page](/features/jobs-and-enrichment#the-jobs-page) with stats (Elements Run Total, Total Jobs, Avg Elements Per Job, Elements Run Today), a By user activity widget, and a filterable jobs table. The Dashboard keeps a Recent jobs widget for at-a-glance access.
</Update>

<Update label="2026-04-20" description="Tools section in main sidebar">
  ## Automations, Data Sources, Integrations and Languages moved to Tools

  These four areas now live under a new top-level **Tools** section in the main sidebar instead of inside Settings. Direct URLs are now `/automations`, `/data-sources`, `/integrations`, and `/languages`.

  Settings continues to host Platform, Global Prompts, Usage, Users, API, and Webhooks. See the [Settings overview](/features/settings#tools-overview) for the new split.
</Update>

<Update label="2026-04-15" description="Event Log in Settings">
  ## Event Log in Settings

  A new **Events** tab in Settings surfaces recent system events and integration activity in one place. Filter by severity, domain, event kind, or resource type to drill into a specific run.

  See [Event Log](/features/settings#event-log) for details.
</Update>

<Update label="2026-03-31" description="Documentation site launch">
  ## Documentation site is live

  The Cernel Knowledge Platform at docs.cernel.com is now available. Browse feature guides, integration setup instructions, and use-case workflows to get the most out of Cernel.

  * Full documentation for all platform features
  * Step-by-step guides for Shopify, CSV, Feed, and API integrations
  * Use-case workflows for hands-free enrichment, image sourcing, and more
</Update>
