<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <id>https://docs.tenzir.com/changelog</id>
    <title>Tenzir Changelog</title>
    <updated>2026-04-09T00:00:00.000Z</updated>
    <generator>Tenzir Changelog</generator>
    <author>
        <name>Tenzir</name>
        <uri>https://tenzir.com</uri>
    </author>
    <link rel="alternate" href="https://docs.tenzir.com/changelog"/>
    <link rel="self" href="https://docs.tenzir.com/changelog/feed.xml"/>
    <subtitle>Release notes across all Tenzir projects</subtitle>
    <icon>https://docs.tenzir.com/favicon.svg</icon>
    <entry>
        <title type="html"><![CDATA[Tenzir Platform v1.30.3]]></title>
        <id>https://docs.tenzir.com/changelog/platform/v1-30-3</id>
        <link href="https://docs.tenzir.com/changelog/platform/v1-30-3"/>
        <updated>2026-04-09T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This patch release fixes an issue with the container build of the bundled seaweedFS image.]]></summary>
        <content type="html"><![CDATA[<p>This patch release fixes an issue with the container build of the bundled seaweedFS image.</p>
]]></content>
        <category label="Tenzir Platform"/>
        <published>2026-04-09T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[Tenzir Platform v1.30.2]]></title>
        <id>https://docs.tenzir.com/changelog/platform/v1-30-2</id>
        <link href="https://docs.tenzir.com/changelog/platform/v1-30-2"/>
        <updated>2026-04-09T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This release fixes an issue where the pipeline table stayed filtered after navigating away from a pipeline's detail page. It adds thousands separators to numeric values in the Insights tab for better readability. It also updates dependencies to address security issues.]]></summary>
        <content type="html"><![CDATA[<p>This release fixes an issue where the pipeline table stayed filtered after navigating away from a pipeline's detail page. It adds thousands separators to numeric values in the Insights tab for better readability. It also updates dependencies to address security issues.</p>

<h2>Changes</h2>

<h3>Readable numbers in the Insights tab</h3>
<p><small>Apr 7, 2026 · <a href="https://github.com/gitryder">@gitryder</a></small></p>
<p>We added thousands separators to numeric values in the pipeline Insights tab, making large numbers easier to read at a glance.</p>

<h2>Bug Fixes</h2>

<h3>Fix pipeline table filter not clearing</h3>
<p><small>Apr 7, 2026 · <a href="https://github.com/gitryder">@gitryder</a></small></p>
<p>We fixed an issue where the pipeline table stayed filtered after viewing a pipeline's detail page and navigating away to another tab. Returning to the Pipelines page would show only the previously viewed pipeline, and clearing the search had no effect.</p>
]]></content>
        <category label="Tenzir Platform"/>
        <published>2026-04-09T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[Tenzir Node v5.30.1-rc.1]]></title>
        <id>https://docs.tenzir.com/changelog/tenzir/v5-30-1-rc-1</id>
        <link href="https://docs.tenzir.com/changelog/tenzir/v5-30-1-rc-1"/>
        <updated>2026-04-08T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This release candidate improves correctness for export workloads by preventing missing or partially populated events while partitions are rebuilt or flushed under load. It also fixes HTTP requests to non-standard ports by including the port in the Host header, restoring compatibility with strict servers such as pre-signed URL endpoints.]]></summary>
        <content type="html"><![CDATA[<p>This release candidate improves correctness for export workloads by preventing missing or partially populated events while partitions are rebuilt or flushed under load. It also fixes HTTP requests to non-standard ports by including the port in the Host header, restoring compatibility with strict servers such as pre-signed URL endpoints.</p>

<h2>Bug Fixes</h2>

<h3>Reliable export for null rows in rebuilt partitions</h3>
<p><small>Apr 7, 2026 · <a href="https://github.com/tobim">@tobim</a>, <a href="https://github.com/codex">@codex</a> · <a href="https://github.com/tenzir/tenzir/pull/5988">#5988</a></small></p>
<p>The <code>export</code> operator no longer emits partially populated events from rebuilt partitions when a row is null at the record level. Previously, some events could appear with most fields set to <code>null</code> while a few values, such as <code>event_type</code> or interface fields, were still present.</p>
<p>This makes exports from rebuilt data more reliable when investigating sparse or malformed-looking events.</p>

<h3>Fix HTTP Host header missing port for non-standard ports</h3>
<p><small>Mar 31, 2026</small></p>
<p>The <code>from_http</code> and <code>http</code> operators now include the port in the <code>Host</code> header
when the URL uses a non-standard port. Previously, the port was omitted, which
caused requests to fail with HTTP 403 when the server validates the <code>Host</code>
header against the full authority, such as for pre-signed URL signature
verification.</p>

<h3>Reliable recent exports during partition flushes</h3>
<p><small>Mar 30, 2026 · <a href="https://github.com/tobim">@tobim</a>, <a href="https://github.com/codex">@codex</a></small></p>
<p>The <code>export</code> command no longer fails or misses recent events when a node is flushing active partitions to disk under heavy load. Recent exports now keep the in-memory partitions they depend on alive until the snapshot completes, which preserves correctness for concurrent import and export workloads.</p>
]]></content>
        <category label="Tenzir Node"/>
        <published>2026-04-08T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[Tenzir Ship v1.7.0]]></title>
        <id>https://docs.tenzir.com/changelog/tenzir-ship/v1-7-0</id>
        <link href="https://docs.tenzir.com/changelog/tenzir-ship/v1-7-0"/>
        <updated>2026-04-03T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[The reusable release workflow now works out of the box in external repositories without requiring Tenzir-org-specific secrets.]]></summary>
        <content type="html"><![CDATA[<p>The reusable release workflow now works out of the box in external repositories without requiring Tenzir-org-specific secrets.</p>

<h2>Changes</h2>

<h3>Simplify reusable release workflow and decouple Tenzir org secrets</h3>
<p><small>Mar 12, 2026 · <a href="https://github.com/mavam">@mavam</a>, <a href="https://github.com/codex">@codex</a></small></p>
<p>The reusable GitHub Actions release workflow now works in external repositories by default. It falls back to the caller repository's <code>GITHUB_TOKEN</code>, makes GitHub App authentication optional, and only enables GPG signing when a caller provides a signing key and opts into commit and/or tag signing. The single <code>release.yaml</code> workflow now also exposes the advanced hooks and release controls directly, including <code>skip-publish</code> for dry runs and smoke tests. Tenzir repositories can still opt into the existing bot identity, GitHub App token flow, and signed commits and tags by passing those settings explicitly.</p>
]]></content>
        <category label="Tenzir Ship"/>
        <published>2026-04-03T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[Tenzir Platform v1.30.1]]></title>
        <id>https://docs.tenzir.com/changelog/platform/v1-30-1</id>
        <link href="https://docs.tenzir.com/changelog/platform/v1-30-1"/>
        <updated>2026-04-02T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This release fixes an issue that prevented users from accessing the public Tenzir Platform instance at app.tenzir.com.]]></summary>
        <content type="html"><![CDATA[<p>This release fixes an issue that prevented users from accessing the public Tenzir Platform instance at app.tenzir.com.</p>
]]></content>
        <category label="Tenzir Platform"/>
        <published>2026-04-02T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[Tenzir Platform v1.30.0]]></title>
        <id>https://docs.tenzir.com/changelog/platform/v1-30-0</id>
        <link href="https://docs.tenzir.com/changelog/platform/v1-30-0"/>
        <updated>2026-04-02T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This release introduces a new Stream view in the Explorer that displays pipeline results as a continuous, expandable event list. It also adds a time range selector, sortable table columns, and copyable inspector values, alongside several bug fixes for package management and the library view.]]></summary>
        <content type="html"><![CDATA[<p>This release introduces a new Stream view in the Explorer that displays pipeline results as a continuous, expandable event list. It also adds a time range selector, sortable table columns, and copyable inspector values, alongside several bug fixes for package management and the library view.</p>

<h2>Features</h2>

<h3>Stream view in the Explorer</h3>
<p><small>Mar 26, 2026 · <a href="https://github.com/gitryder">@gitryder</a></small></p>
<p>We added a new Stream view to the Explorer that shows all pipeline results as a continuous list of expandable events. You can switch between the Table, Chart, and Stream views using the view selector in the toolbar. The Stream view displays events from all schemas together, with color-coded badges to distinguish between them. Each row shows a one-line preview that you can expand to inspect the full event. The view remembers your selection across pipeline runs, and the event list scrolls horizontally as a whole, with schema badges staying pinned on the left.</p>

<h3>Sortable columns in the Explorer table</h3>
<p><small>Mar 13, 2026 · <a href="https://github.com/gitryder">@gitryder</a></small></p>
<p>You can now sort the Explorer table by clicking column headers. Sortable columns show a sort indicator, and clicking cycles through ascending, descending, and unsorted states. Sorting works for both top-level and nested fields.</p>

<h3>Copyable field names and values in the inspector</h3>
<p><small>Mar 12, 2026 · <a href="https://github.com/gitryder">@gitryder</a></small></p>
<p>You can now click on field names and values in the Explorer inspector to copy them to the clipboard. Field names copy the full dot-separated path, and values copy their TQL representation.</p>

<h3>Time range selector in the Explorer</h3>
<p><small>Mar 12, 2026 · <a href="https://github.com/gitryder">@gitryder</a></small></p>
<p>You can now select a time range directly from the Explorer header. Choose from quick presets like 5 minutes or 12 hours, or open the custom popover to pick from a grid of relative durations or set an absolute date range. The selector is currently available for pipelines that start with the <code>export</code> operator.</p>

<h2>Changes</h2>

<h3>Unified package detail view in the library</h3>
<p><small>Mar 12, 2026 · <a href="https://github.com/gitryder">@gitryder</a></small></p>
<p>We combined the 'About' and 'Install' tabs in the package detail drawer into a single scrollable view. Package information, examples, and configuration options are now shown on one page instead of requiring tab switches.</p>

<h2>Bug Fixes</h2>

<h3>Show custom packages in the library view</h3>
<p><small>Mar 24, 2026 · <a href="https://github.com/gitryder">@gitryder</a></small></p>
<p>We fixed an issue where custom packages installed on a node were not visible in the library view. Previously, only packages from the official Tenzir library were shown. Custom packages are now included alongside library packages.</p>

<h3>Fix rotated text in package detail accordion</h3>
<p><small>Mar 24, 2026 · <a href="https://github.com/gitryder">@gitryder</a></small></p>
<p>We fixed a bug where operator description text on the package detail page appeared rotated 90 degrees, overlapping other content.</p>

<h3>Package installs for packages with user-defined operators</h3>
<p><small>Mar 17, 2026 · <a href="https://github.com/gitryder">@gitryder</a></small></p>
<p>Packages containing user-defined operators can again be installed through the
platform. Previously, installing such packages failed because the operator
arguments were serialized incorrectly. This only affected installs through the
platform UI—command-line package installs were not impacted.</p>
]]></content>
        <category label="Tenzir Platform"/>
        <published>2026-04-02T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[Tenzir Node v5.30.0]]></title>
        <id>https://docs.tenzir.com/changelog/tenzir/v5-30-0</id>
        <link href="https://docs.tenzir.com/changelog/tenzir/v5-30-0"/>
        <updated>2026-03-31T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This release adds OIDC web identity authentication for AWS operators, so you can assume AWS roles from external identity providers without long-lived credentials. It also speeds up logical and conditional expression evaluation and fixes several crashes and configuration diagnostics.]]></summary>
        <content type="html"><![CDATA[<p>This release adds OIDC web identity authentication for AWS operators, so you can assume AWS roles from external identity providers without long-lived credentials. It also speeds up logical and conditional expression evaluation and fixes several crashes and configuration diagnostics.</p>

<h2>Features</h2>

<h3>OIDC web identity authentication for AWS operators</h3>
<p><small>Feb 4, 2026 · <a href="https://github.com/tobim">@tobim</a>, <a href="https://github.com/codex">@codex</a> · <a href="https://github.com/tenzir/tenzir/pull/5703">#5703</a></small></p>
<p>AWS operators now support OIDC-based authentication via the <code>AssumeRoleWithWebIdentity</code> API.</p>
<p>You can authenticate with AWS resources using OpenID Connect tokens from external identity providers like Azure, Google Cloud, or custom endpoints. This enables secure cross-cloud authentication without sharing long-lived AWS credentials.</p>
<p>Configure web identity authentication in any AWS operator by specifying a token source and target role:</p>
<pre><code>from_s3 "s3://bucket/path", aws_iam={
  region: "us-east-1",
  assume_role: "arn:aws:iam::123456789012:role/cross-cloud-role",
  web_identity: {
    token_file: "/path/to/oidc/token"
  }
}
</code></pre>
<p>The <code>web_identity</code> option accepts three token sources: <code>token_file</code> (path to a token file), <code>token_endpoint</code> (HTTP endpoint that returns a token), or <code>token</code> (direct token value). For HTTP endpoints, you can extract tokens from JSON responses using <code>path</code>.</p>
<p>Credentials automatically refresh before expiration, with exponential backoff retry logic for transient failures. This is especially useful for long-running pipelines that need persistent authentication.</p>

<h2>Changes</h2>

<h3>Faster evaluation of logical and conditional expressions</h3>
<p><small>Mar 30, 2026 · <a href="https://github.com/jachris">@jachris</a> · <a href="https://github.com/tenzir/tenzir/pull/5954">#5954</a></small></p>
<p>Pipelines that use <code>and</code>, <code>or</code>, or <code>if</code>-<code>else</code> expressions run significantly faster in certain cases — up to <strong>30×</strong> in our benchmarks. The improvement is most noticeable in pipelines with complex filtering or branching logic. No pipeline changes are needed to benefit.</p>

<h3>OCSF 1.8.0 support in ocsf::derive</h3>
<p><small>Mar 23, 2026 · <a href="https://github.com/mavam">@mavam</a>, <a href="https://github.com/codex">@codex</a> · <a href="https://github.com/tenzir/tenzir/pull/5939">#5939</a></small></p>
<p>The <code>ocsf::derive</code> operator now supports OCSF <code>1.8.0</code> events.</p>
<p>For example, you can now derive enum and sibling fields for events that declare
<code>metadata.version: "1.8.0"</code>:</p>
<pre><code class="language-tql">from {metadata: {version: "1.8.0"}, class_uid: 1007}
ocsf::derive
</code></pre>
<p>This keeps OCSF normalization pipelines working when producers emit <code>1.8.0</code>
events.</p>

<h3>Platform configuration error message</h3>
<p><small>Feb 10, 2026 · <a href="https://github.com/lava">@lava</a> · <a href="https://github.com/tenzir/tenzir/pull/5341">#5341</a></small></p>
<p>Platform configuration validation now provides clearer error messages when an invalid configuration is encountered, helping you quickly diagnose and fix configuration issues.</p>

<h2>Bug Fixes</h2>

<h3>Fix crash when connecting to unresolvable host</h3>
<p><small>Mar 26, 2026 · <a href="https://github.com/lava">@lava</a> · <a href="https://github.com/tenzir/tenzir/pull/5827">#5827</a></small></p>
<p>Setting <code>TENZIR_ENDPOINT</code> to an unresolvable hostname no longer crashes the pipeline with a segfault.</p>

<h3>Spurious warning for Other (99) enum sibling in ocsf::derive</h3>
<p><small>Mar 25, 2026 · <a href="https://github.com/mavam">@mavam</a>, <a href="https://github.com/claude">@claude</a> · <a href="https://github.com/tenzir/tenzir/pull/5949">#5949</a></small></p>
<p><code>ocsf::derive</code> no longer emits a false warning when an <code>_id</code> field is set
to <code>99</code> (Other) and the sibling string contains a source-specific value.</p>
<p>Per the OCSF specification, <code>99</code>/Other is an explicit escape hatch: the
integer signals that the value is not in the schema's enumeration and the
companion string <strong>must</strong> hold the raw value from the data source. For
example, the following is now accepted silently:</p>
<pre><code class="language-tql">from {
  metadata: { version: "1.7.0" },
  type_uid: 300201,
  class_uid: 3002,
  auth_protocol_id: 99,
  auth_protocol: "Negotiate",
}
ocsf::derive
</code></pre>
<p>Previously this produced a spurious <code>warning: found invalid value for 'auth_protocol'</code> because <code>"Negotiate"</code> is not a named enum caption.</p>

<h3>Fix crash on Azure SSL/transport errors</h3>
<p><small>Mar 24, 2026 · <a href="https://github.com/lava">@lava</a></small></p>
<p>The Azure Blob Storage connector now handles <code>Azure::Core::Http::TransportException</code>
(e.g., SSL certificate errors) gracefully instead of crashing. Previously, a
self-signed certificate in the certificate chain would cause an unhandled
exception and terminate the node.</p>
]]></content>
        <category label="Tenzir Node"/>
        <published>2026-03-31T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[Tenzir Node v5.29.4]]></title>
        <id>https://docs.tenzir.com/changelog/tenzir/v5-29-4</id>
        <link href="https://docs.tenzir.com/changelog/tenzir/v5-29-4"/>
        <updated>2026-03-21T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This patch release hardens container manifest publishing in GitHub Actions by switching the reusable manifest workflow to the workflow token with correctly paired registry credentials. It also avoids exposing registry secrets on the command line by using stdin-based Docker logins.]]></summary>
        <content type="html"><![CDATA[<p>This patch release hardens container manifest publishing in GitHub Actions by switching the reusable manifest workflow to the workflow token with correctly paired registry credentials. It also avoids exposing registry secrets on the command line by using stdin-based Docker logins.</p>
]]></content>
        <category label="Tenzir Node"/>
        <published>2026-03-21T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[Tenzir Node v5.29.3]]></title>
        <id>https://docs.tenzir.com/changelog/tenzir/v5-29-3</id>
        <link href="https://docs.tenzir.com/changelog/tenzir/v5-29-3"/>
        <updated>2026-03-20T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This patch release keeps the 5.29 line moving with a small maintenance update and validates the refreshed release automation. It ships as a clean follow-up release without additional user-facing changes.]]></summary>
        <content type="html"><![CDATA[<p>This patch release keeps the 5.29 line moving with a small maintenance update and validates the refreshed release automation. It ships as a clean follow-up release without additional user-facing changes.</p>
]]></content>
        <category label="Tenzir Node"/>
        <published>2026-03-20T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[Tenzir Ship v1.6.1]]></title>
        <id>https://docs.tenzir.com/changelog/tenzir-ship/v1-6-1</id>
        <link href="https://docs.tenzir.com/changelog/tenzir-ship/v1-6-1"/>
        <updated>2026-03-20T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This release fixes the release candidate workflow so that superseded release candidates are properly removed from changelog history after promotion to a stable release.]]></summary>
        <content type="html"><![CDATA[<p>This release fixes the release candidate workflow so that superseded release candidates are properly removed from changelog history after promotion to a stable release.</p>

<h2>Bug Fixes</h2>

<h3>Release candidate cleanup after promotion</h3>
<p><small>Mar 20, 2026 · <a href="https://github.com/mavam">@mavam</a>, <a href="https://github.com/codex">@codex</a> · <a href="https://github.com/tenzir/ship/pull/20">#20</a></small></p>
<p>This fixes the release candidate workflow so RCs no longer remain in changelog history after they have been superseded. Creating a new <code>-rc.N</code> now replaces the previous RC for that cycle, and creating a stable release closes the RC cycle and removes its RC manifests from <code>releases/</code>.</p>
<p>For example:</p>
<pre><code class="language-sh"># Start an RC cycle for a later stable release.
tenzir-ship release create v1.2.3 --rc --yes
tenzir-ship release create v1.3.0 --yes

# Or promote the active RC to its matching stable release.
tenzir-ship release create v1.2.3 --rc --yes
tenzir-ship release create --yes
</code></pre>
<p>After the stable release is created, the RC is no longer kept in release history. Release candidates are also cumulative, so each new RC includes the previous RC's entries plus any newly added unreleased entries, while stable releases remain incremental.</p>
]]></content>
        <category label="Tenzir Ship"/>
        <published>2026-03-20T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[Tenzir Node v5.29.2]]></title>
        <id>https://docs.tenzir.com/changelog/tenzir/v5-29-2</id>
        <link href="https://docs.tenzir.com/changelog/tenzir/v5-29-2"/>
        <updated>2026-03-19T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This patch release fixes several correctness and performance issues across parsing, querying, and storage, and completes Suricata 8 schema coverage.]]></summary>
        <content type="html"><![CDATA[<p>This patch release fixes several correctness and performance issues across parsing, querying, and storage, and completes Suricata 8 schema coverage.</p>

<h2>Features</h2>

<h3>Add store origin metadata to feather files</h3>
<p><small>Mar 17, 2026 · <a href="https://github.com/tobim">@tobim</a></small></p>
<p>Feather store files now include a <code>TENZIR:store:origin</code> key in the Arrow table
schema metadata. The value is <code>"ingest"</code> for freshly ingested data, <code>"rebuild"</code>
for partitions created by the rebuild command, and <code>"compaction"</code> for partitions
created by the compaction plugin. This allows external tooling such as <code>pyarrow</code>
to distinguish how a partition was produced.</p>

<h3>Improved Clickhouse Usability</h3>
<p><small>Mar 11, 2026 · <a href="https://github.com/IyeOnline">@IyeOnline</a>, <a href="https://github.com/codex">@codex</a>, <a href="https://github.com/mavam">@mavam</a>, <a href="https://github.com/raxyte">@raxyte</a> · <a href="https://github.com/tenzir/tenzir/pull/5897">#5897</a></small></p>
<p>The <code>to_clickhouse</code> operator now supports dynamic table names via an expression
<code>table=...</code>, which must evaluate to a <code>string</code>. If the value is not a valid
table name, the events will be dropped with a warning.</p>
<p>With this change, the operator will also create a database if it does not exist.</p>
<p>The prime use-case for this are OCSF event streams:</p>
<pre><code class="language-tql">subscribe "ocsf"
ocsf::cast encode_variants=true, null_fill=true
to_clickhouse table=f"ocsf.{class_name.replace(" ","_")}", ...
</code></pre>

<h3>Install Tenzir via Homebrew on macOS</h3>
<p><small>Mar 8, 2026 · <a href="https://github.com/mavam">@mavam</a> · <a href="https://github.com/tenzir/tenzir/pull/5876">#5876</a></small></p>
<p>You can now install Tenzir on Apple Silicon macOS via Homebrew:</p>
<pre><code class="language-sh">brew tap tenzir/tenzir
brew install --cask tenzir
</code></pre>
<p>You can also install directly without tapping first:</p>
<pre><code class="language-sh">brew install --cask tenzir/tenzir/tenzir
</code></pre>
<p>The release workflow keeps the Homebrew cask in sync with the signed macOS
package so installs and uninstalls stay current across releases.</p>

<h2>Changes</h2>

<h3>Correct AWS Marketplace container image</h3>
<p><small>Mar 19, 2026 · <a href="https://github.com/lava">@lava</a> · <a href="https://github.com/tenzir/tenzir/pull/5925">#5925</a></small></p>
<p>The AWS Marketplace ECR repository <code>tenzir-node</code> was incorrectly populated with
the <code>tenzir</code> image. It now correctly ships <code>tenzir-node</code>, which runs a Tenzir
node by default.</p>
<p>If you relied on the previous behavior, you can restore it by setting <code>tenzir</code>
as a custom entrypoint in your ECS task definition.</p>

<h3>Add Suricata schema types for IKE, HTTP2, PGSQL, and Modbus</h3>
<p><small>Mar 17, 2026 · <a href="https://github.com/tobim">@tobim</a> · <a href="https://github.com/tenzir/tenzir/pull/5914">#5914</a></small></p>
<p>The bundled Suricata schema now covers the remaining event types listed in the
Suricata 8.0.3 EVE JSON format documentation: IKE (IKEv1/IKEv2), HTTP/2,
PostgreSQL, and Modbus. This completes Suricata 8 schema coverage for Tenzir.</p>

<h2>Bug Fixes</h2>

<h3>Support long syslog structured-data parameter names</h3>
<p><small>Mar 19, 2026 · <a href="https://github.com/mavam">@mavam</a>, <a href="https://github.com/codex">@codex</a></small></p>
<p>The <code>read_syslog</code> operator and <code>parse_syslog</code> function now accept RFC 5424 structured-data parameter names longer than 32 characters, which some vendors emit despite the specification limit.</p>
<p>For example, this message now parses successfully instead of being rejected:</p>
<pre><code class="language-text">&#x3C;134>1 2026-03-18T11:00:51.194137+01:00 HOSTNAME abc 9043 23003147 [F5@12276 thx_f5_for_ignoring_the_32_char_limit_in_structured_data="thx"] broken example
</code></pre>
<p>This improves interoperability with vendor syslog implementations that exceed the RFC limit for structured-data parameter names.</p>

<h3>Fix batch timeout to flush asynchronously</h3>
<p><small>Mar 14, 2026 · <a href="https://github.com/aljazerzen">@aljazerzen</a> · <a href="https://github.com/tenzir/tenzir/pull/5906">#5906</a></small></p>
<p>The batch timeout was only checked when a new event arrived, so a single event
followed by an idle stream would never be emitted. The timeout now fires
independently of upstream activity.</p>

<h3>Fix parse_winlog batch splitting</h3>
<p><small>Mar 13, 2026 · <a href="https://github.com/jachris">@jachris</a> · <a href="https://github.com/tenzir/tenzir/pull/5901">#5901</a></small></p>
<p>The <code>parse_winlog</code> function could fragment output into thousands of tiny
batches due to type conflicts in <code>RenderingInfo/Keywords</code>, where events with
one <code>&#x3C;Keyword></code> emitted a string but events with multiple emitted a list.
Additionally, <code>EventData</code> with unnamed <code>&#x3C;Data></code> elements is now always emitted
as a record with <code>_0</code>, <code>_1</code>, etc. as field names instead of a list.</p>

<h3>Optimize `in` operator and fix eq/neq null semantics</h3>
<p><small>Mar 12, 2026 · <a href="https://github.com/jachris">@jachris</a> · <a href="https://github.com/tenzir/tenzir/pull/5899">#5899</a></small></p>
<p>The <code>in</code> operator for list expressions is up to 33x faster. Previously it
created and finalized entire Arrow arrays for every element comparison, causing
severe overhead for expressions like <code>EventID in [5447, 4661, ...]</code>.</p>
<p>Additionally, comparing a typed null value with <code>==</code> now returns <code>false</code> instead
of <code>null</code>, and <code>!=</code> returns <code>true</code>, fixing a correctness issue with null
handling in equality comparisons.</p>

<h3>Fix secret comparison bypass in `in` operator fast path</h3>
<p><small>Mar 12, 2026 · <a href="https://github.com/jachris">@jachris</a> · <a href="https://github.com/tenzir/tenzir/pull/5899">#5899</a></small></p>
<p>The <code>in</code> operator fast path now correctly prevents comparison of secret values.
Previously, <code>secret_value in [...]</code> would silently compare instead of returning
null with a warning, bypassing the established secret comparison policy.</p>

<h3>Fix pattern equality ignoring case-insensitive flag</h3>
<p><small>Mar 12, 2026 · <a href="https://github.com/jachris">@jachris</a> · <a href="https://github.com/tenzir/tenzir/pull/5900">#5900</a></small></p>
<p>Pattern equality checks now correctly consider the case-insensitive flag.
Previously, two patterns that differed only in case sensitivity were treated as
equal, violating the hash/equality contract.</p>

<h3>Fix over-reservation in partition_array for string/blob types</h3>
<p><small>Mar 12, 2026 · <a href="https://github.com/jachris">@jachris</a> · <a href="https://github.com/tenzir/tenzir/pull/5899">#5899</a></small></p>
<p>Splitting Arrow arrays for string and blob types no longer over-reserves memory.
Previously both output builders reserved the full input size each, using up to
twice the necessary memory.</p>
]]></content>
        <category label="Tenzir Node"/>
        <published>2026-03-19T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[Tenzir Ship v1.6.0]]></title>
        <id>https://docs.tenzir.com/changelog/tenzir-ship/v1-6-0</id>
        <link href="https://docs.tenzir.com/changelog/tenzir-ship/v1-6-0"/>
        <updated>2026-03-19T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[tenzir-ship now supports release candidates via release create --rc, letting you iterate on -rc.N builds before promoting one to the final stable release. The new flag works across both the CLI and the bundled GitHub Actions workflows.]]></summary>
        <content type="html"><![CDATA[<p>tenzir-ship now supports release candidates via release create --rc, letting you iterate on -rc.N builds before promoting one to the final stable release. The new flag works across both the CLI and the bundled GitHub Actions workflows.</p>

<h2>Features</h2>

<h3>Release candidate workflow</h3>
<p><small>Mar 12, 2026 · <a href="https://github.com/mavam">@mavam</a>, <a href="https://github.com/codex">@codex</a></small></p>
<p><code>tenzir-ship</code> now supports release candidates via <code>release create --rc</code>. Creating a release candidate snapshots the current unreleased entries without consuming them, so you can iterate on <code>-rc.N</code> releases before promoting one to the final stable release. The stable base is inferred automatically, and rerunning the command continues the matching RC series when one already exists.</p>
<p>When you are ready to ship the stable release, rerun <code>tenzir-ship release create</code> without <code>--rc</code> and the latest outstanding release candidate becomes the matching stable release automatically. Once an RC series exists, you either continue it with <code>release create --rc</code> or promote the latest candidate with the normal stable command.</p>
<p>Publishing a release candidate now automatically creates a GitHub prerelease and prevents it from being marked as latest. <code>release version</code> and <code>show latest</code> continue to resolve the latest stable release, while <code>release publish</code> without an explicit version now targets the latest release manifest, including RCs. The bundled GitHub Actions release workflows accept <code>rc</code> so you can keep creating RCs from CI, and the default stable workflow promotes the latest outstanding candidate automatically.</p>
]]></content>
        <category label="Tenzir Ship"/>
        <published>2026-03-19T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[Tenzir Node v5.29.1]]></title>
        <id>https://docs.tenzir.com/changelog/tenzir/v5-29-1</id>
        <link href="https://docs.tenzir.com/changelog/tenzir/v5-29-1"/>
        <updated>2026-03-16T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This release fixes a scheduling issue introduced in v5.24.0 that could cause the node to become unresponsive when too many pipelines using detached operators were deployed simultaneously.]]></summary>
        <content type="html"><![CDATA[<p>This release fixes a scheduling issue introduced in v5.24.0 that could cause the node to become unresponsive when too many pipelines using detached operators were deployed simultaneously.</p>

<h2>Bug Fixes</h2>

<h3>Scheduling issue with detached operators</h3>
<p><small>Mar 16, 2026 · <a href="https://github.com/lava">@lava</a> · <a href="https://github.com/tenzir/tenzir/pull/5895">#5895</a></small></p>
<p>Fixed a scheduling issue introduced in v5.24.0 that could cause the node to
become unresponsive when too many pipelines using detached operators like
<code>from_udp</code> were deployed simultaneously.</p>
]]></content>
        <category label="Tenzir Node"/>
        <published>2026-03-16T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[Tenzir Node v5.29.0]]></title>
        <id>https://docs.tenzir.com/changelog/tenzir/v5-29-0</id>
        <link href="https://docs.tenzir.com/changelog/tenzir/v5-29-0"/>
        <updated>2026-03-16T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This release improves log ingestion by extracting structured data from legacy syslog messages and aligning the bundled schema with Suricata 8. It also republishes the previous release after an error in the earlier release process.]]></summary>
        <content type="html"><![CDATA[<p>This release improves log ingestion by extracting structured data from legacy syslog messages and aligning the bundled schema with Suricata 8. It also republishes the previous release after an error in the earlier release process.</p>

<h2>Features</h2>

<h3>Add Suricata schema types for IKE, HTTP2, PGSQL, and Modbus</h3>
<p><small>Mar 17, 2026 · <a href="https://github.com/tobim">@tobim</a> · <a href="https://github.com/tenzir/tenzir/pull/5914">#5914</a></small></p>
<p>The bundled Suricata schema now includes types for four previously missing event types: <code>ike</code>, <code>http2</code>, <code>pgsql</code>, and <code>modbus</code>.</p>
<p>The <code>ike</code> type supports both IKEv1 and IKEv2 traffic. Version-specific fields are contained within dedicated <code>ikev1</code> and <code>ikev2</code> sub-objects, covering key exchange payloads, nonce payloads, client proposals, vendor IDs, and IKEv2 role/notify information.</p>
<p>The <code>http2</code> type models HTTP/2 request and response streams including settings frames, header lists, error codes, and stream priority.</p>
<p>The <code>pgsql</code> type covers PostgreSQL session events with full request fields (simple queries, startup parameters, SASL authentication) and response fields (row counts, command completion, parameter status).</p>
<p>The <code>modbus</code> type captures industrial Modbus protocol transactions including function codes, access types, exception responses, diagnostic subfunctions, and MEI encapsulated interface data.</p>

<h3>Extract structured data from legacy syslog content</h3>
<p><small>Mar 13, 2026 · <a href="https://github.com/mavam">@mavam</a>, <a href="https://github.com/codex">@codex</a> · <a href="https://github.com/tenzir/tenzir/pull/5902">#5902</a></small></p>
<p><code>read_syslog</code> and <code>parse_syslog</code> now extract a leading RFC 5424-style
structured-data block from RFC 3164 message content.</p>
<p>This pattern occurs in practice with some VMware ESXi messages, where
components such as <code>Hostd</code> emit a legacy syslog record and prepend structured
metadata before the human-readable message text.</p>
<p>For example, this raw syslog line:</p>
<pre><code class="language-text">&#x3C;166>2026-02-11T18:01:45.587Z esxi-01.example.invalid Hostd[2099494]: [Originator@6876 sub=Vimsvc.TaskManager opID=11111111-2222-3333-4444-555555555555] Task Completed
</code></pre>
<p>now parses as:</p>
<pre><code class="language-tql">{
  facility: 20,
  severity: 6,
  timestamp: "2026-02-11T18:01:45.587Z",
  hostname: "esxi-01.example.invalid",
  app_name: "Hostd",
  process_id: "2099494",
  structured_data: {
    "Originator@6876": {
      sub: "Vimsvc.TaskManager",
      opID: "11111111-2222-3333-4444-555555555555",
    },
  },
  content: "Task Completed",
}
</code></pre>
<p>Events without extracted structured data keep the existing <code>syslog.rfc3164</code>
schema. Events with extracted structured data use
<code>syslog.rfc3164.structured</code>.</p>

<h3>Support for Suricata 8 schema</h3>
<p><small>Mar 10, 2026 · <a href="https://github.com/IyeOnline">@IyeOnline</a>, <a href="https://github.com/satta">@satta</a> · <a href="https://github.com/tenzir/tenzir/pull/5888">#5888</a></small></p>
<p>The bundled Suricata schema now aligns with Suricata 8, enabling proper parsing and representation of events from Suricata 8 deployments.</p>
<p>This update introduces support for new event types including POP3, ARP, and BitTorrent DHT, along with enhancements to existing event types. QUIC events now include <code>ja4</code> and <code>ja4s</code> fields for fingerprinting, DHCP events include <code>vendor_class_identifier</code>, and TLS certificate timestamps now use the precise <code>time</code> type instead of string representation.</p>
<p>These schema changes ensure that Tenzir can reliably ingest and process telemetry from Suricata 8 without data loss or type mismatches.</p>

<h2>Bug Fixes</h2>

<h3>Fix pipeline startup timeouts</h3>
<p><small>Mar 11, 2026 · <a href="https://github.com/jachris">@jachris</a> · <a href="https://github.com/tenzir/tenzir/pull/5893">#5893</a></small></p>
<p>In some situations, pipelines could not be successfully started, leading to
timeouts and a non-responsive node, especially during node start.</p>

<h3>Prevent where/map assertion crash on sliced list batches</h3>
<p><small>Mar 10, 2026 · <a href="https://github.com/IyeOnline">@IyeOnline</a>, <a href="https://github.com/codex">@codex</a> · <a href="https://github.com/tenzir/tenzir/pull/5886">#5886</a></small></p>
<p>Pipelines using chained list transforms such as <code>xs.where(...).map(...).where(...)</code> no longer trigger an internal assertion on sliced input batches.</p>

<h3>Graceful handling of Google Cloud Pub/Sub authentication errors</h3>
<p><small>Mar 9, 2026 · <a href="https://github.com/mavam">@mavam</a>, <a href="https://github.com/codex">@codex</a> · <a href="https://github.com/tenzir/tenzir/pull/5877">#5877</a></small></p>
<p>Invalid Google Cloud credentials in <code>from_google_cloud_pubsub</code> no longer crash the node. Authentication errors now surface as operator diagnostics instead.</p>
]]></content>
        <category label="Tenzir Node"/>
        <published>2026-03-16T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[Tenzir Test v1.7.5]]></title>
        <id>https://docs.tenzir.com/changelog/tenzir-test/v1-7-5</id>
        <link href="https://docs.tenzir.com/changelog/tenzir-test/v1-7-5"/>
        <updated>2026-03-13T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This release establishes the correct v1.7.5 version tag. A double-bump bug in the release automation caused the v1.7.4 git tag to point to a commit where pyproject.toml already read 1.7.5, so 1.7.4 was never published to PyPI and the git tag was misaligned with the actual package version. The automation has been fixed by removing a redundant post-create version bump that became a double-bump once tenzir-ship v1.3.0 added automatic version-file updates.]]></summary>
        <content type="html"><![CDATA[<p>This release establishes the correct v1.7.5 version tag. A double-bump bug in the release automation caused the v1.7.4 git tag to point to a commit where pyproject.toml already read 1.7.5, so 1.7.4 was never published to PyPI and the git tag was misaligned with the actual package version. The automation has been fixed by removing a redundant post-create version bump that became a double-bump once tenzir-ship v1.3.0 added automatic version-file updates.</p>
]]></content>
        <category label="Tenzir Test"/>
        <published>2026-03-13T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[Tenzir Platform v1.29.2]]></title>
        <id>https://docs.tenzir.com/changelog/platform/v1-29-2</id>
        <link href="https://docs.tenzir.com/changelog/platform/v1-29-2"/>
        <updated>2026-03-12T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This release upgrades dependencies to address known security vulnerabilities and fixes an issue where the Insights tab selection could get stuck in an invalid state.]]></summary>
        <content type="html"><![CDATA[<p>This release upgrades dependencies to address known security vulnerabilities and fixes an issue where the Insights tab selection could get stuck in an invalid state.</p>

<h2>Bug Fixes</h2>

<h3>Upgrade dependencies to fix known vulnerabilities</h3>
<p><small>Mar 12, 2026 · <a href="https://github.com/lava">@lava</a></small></p>
<p>We upgraded Python dependencies and added system-level package upgrades to the Docker images to address known vulnerabilities.</p>

<h3>Fix Insights tab guard not resetting tab selection</h3>
<p><small>Mar 11, 2026 · <a href="https://github.com/realllydan">@realllydan</a></small></p>
<p>We fixed an issue where switching away from a pipeline that has the Insights tab available to one that does not could leave the tab selection in an invalid state.</p>
]]></content>
        <category label="Tenzir Platform"/>
        <published>2026-03-12T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[Tenzir Ship v1.5.0]]></title>
        <id>https://docs.tenzir.com/changelog/tenzir-ship/v1-5-0</id>
        <link href="https://docs.tenzir.com/changelog/tenzir-ship/v1-5-0"/>
        <updated>2026-03-12T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Release commands now handle mixed version formats consistently, making changelog automation more robust. The bundled GitHub Actions workflows are updated to Node 24-compatible action versions, keeping CI aligned with GitHub's runtime transition.]]></summary>
        <content type="html"><![CDATA[<p>Release commands now handle mixed version formats consistently, making changelog automation more robust. The bundled GitHub Actions workflows are updated to Node 24-compatible action versions, keeping CI aligned with GitHub's runtime transition.</p>

<h2>Changes</h2>

<h3>Node 24-ready GitHub Actions workflows</h3>
<p><small>Mar 11, 2026 · <a href="https://github.com/mavam">@mavam</a>, <a href="https://github.com/pi">@pi</a></small></p>
<p>The bundled GitHub Actions workflows now use Node 24-compatible action versions, which keeps CI, release, and publishing automation aligned with GitHub's runtime transition. The release and sync workflows also mint GitHub App installation tokens without relying on a deprecated JavaScript action.</p>

<h2>Bug Fixes</h2>

<h3>More robust release version normalization</h3>
<p><small>Mar 11, 2026 · <a href="https://github.com/mavam">@mavam</a>, <a href="https://github.com/pi">@pi</a></small></p>
<p>Release commands and the Python API now handle release versions more consistently when changelog data mixes tag-style versions such as <code>v1.2.3</code> with bare semantic versions such as <code>1.2.3</code>. This improves compatibility with existing changelog histories and makes release automation more reliable across commands that inspect, create, show, and publish releases.</p>
]]></content>
        <category label="Tenzir Ship"/>
        <published>2026-03-12T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[Tenzir Test v1.7.4]]></title>
        <id>https://docs.tenzir.com/changelog/tenzir-test/v1-7-4</id>
        <link href="https://docs.tenzir.com/changelog/tenzir-test/v1-7-4"/>
        <updated>2026-03-11T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This release fixes how skipped tests interact with baseline files. Existing baselines now stay untouched when you skip tests, which prevents unrelated baseline churn and avoids false failures when you toggle skip conditions.]]></summary>
        <content type="html"><![CDATA[<p>This release fixes how skipped tests interact with baseline files. Existing baselines now stay untouched when you skip tests, which prevents unrelated baseline churn and avoids false failures when you toggle skip conditions.</p>

<h2>Bug Fixes</h2>

<h3>Skipped tests preserve existing baseline files</h3>
<p><small>Mar 10, 2026 · <a href="https://github.com/mavam">@mavam</a>, <a href="https://github.com/codex">@codex</a></small></p>
<p>Skipping a test no longer modifies its baseline file. Previously, running
with <code>--update</code> would overwrite the baseline of a skipped test with an empty
file, and running without <code>--update</code> would fail if the baseline was non-empty.
Skipped tests now leave existing baselines untouched, so toggling a skip
condition no longer causes unrelated baseline churn.</p>
]]></content>
        <category label="Tenzir Test"/>
        <published>2026-03-11T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[Tenzir Ship v1.4.0]]></title>
        <id>https://docs.tenzir.com/changelog/tenzir-ship/v1-4-0</id>
        <link href="https://docs.tenzir.com/changelog/tenzir-ship/v1-4-0"/>
        <updated>2026-03-11T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[The new `init` command scaffolds changelog projects interactively or non-interactively, so you can set up a standalone or package-based project in less time. It also protects existing projects from accidental overwrites.]]></summary>
        <content type="html"><![CDATA[<p>The new <code>init</code> command scaffolds changelog projects interactively or non-interactively, so you can set up a standalone or package-based project in less time. It also protects existing projects from accidental overwrites.</p>

<h2>Features</h2>

<h3>Init command for changelog setup</h3>
<p><small>Mar 11, 2026 · <a href="https://github.com/mavam">@mavam</a>, <a href="https://github.com/pi">@pi</a></small></p>
<p>A new <code>init</code> command allows for scaffolding a new changelog project interactively or with the <code>--yes</code> flag. It supports both standalone and package modes, and prevents accidental overwriting of existing projects.</p>
<pre><code class="language-sh">tenzir-ship init
</code></pre>
<p>This reduces the manual effort required to set up a new changelog.</p>
]]></content>
        <category label="Tenzir Ship"/>
        <published>2026-03-11T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[Tenzir Platform v1.29.1]]></title>
        <id>https://docs.tenzir.com/changelog/platform/v1-29-1</id>
        <link href="https://docs.tenzir.com/changelog/platform/v1-29-1"/>
        <updated>2026-03-10T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This release fixes an issue where ephemeral nodes were causing the frontend to display a 500 error message or be displayed with incorrect connection status.]]></summary>
        <content type="html"><![CDATA[<p>This release fixes an issue where ephemeral nodes were causing the frontend to display a 500 error message or be displayed with incorrect connection status.</p>

<h2>Features</h2>

<h3>Add PRIVATE_WEBSOCKET_GATEWAY_ENDPOINT environment variable</h3>
<p><small>Mar 10, 2026 · <a href="https://github.com/lava">@lava</a></small></p>
<p>The app container now supports a <code>PRIVATE_WEBSOCKET_GATEWAY_ENDPOINT</code> environment variable that overrides the existing <code>PUBLIC_WEBSOCKET_GATEWAY_ENDPOINT</code> for calls in the app backend. This allows configuring different endpoints when the frontend and backend live in different networks.</p>

<h3>Add experimental Insights tab to pipeline detail view</h3>
<p><small>Mar 10, 2026 · <a href="https://github.com/realllydan">@realllydan</a></small></p>
<p>The pipeline detail modal now includes an experimental Insights tab that visualizes per-operator backpressure, helping users identify bottlenecks in their pipelines. This tab is only available for pipelines running on the experimental new executor.</p>

<h2>Bug Fixes</h2>

<h3>Fix ephemeral nodes not showing correctly in the UI</h3>
<p><small>Mar 10, 2026 · <a href="https://github.com/lava">@lava</a></small></p>
<p>We fixed an issue where ephemeral nodes were causing the frontend to fail to render or be displayed with incorrect connection status.</p>
]]></content>
        <category label="Tenzir Platform"/>
        <published>2026-03-10T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[Tenzir Node v5.28.0]]></title>
        <id>https://docs.tenzir.com/changelog/tenzir/v5-28-0</id>
        <link href="https://docs.tenzir.com/changelog/tenzir/v5-28-0"/>
        <updated>2026-03-06T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This release adds support for parsing Check Point syslog structured-data dialects that deviate from RFC 5424, improving out-of-the-box interoperability with Check Point exports. It also makes DNS hostname resolution in the load_tcp operator opt-in and fixes several parser bugs related to schema changes between events.]]></summary>
        <content type="html"><![CDATA[<p>This release adds support for parsing Check Point syslog structured-data dialects that deviate from RFC 5424, improving out-of-the-box interoperability with Check Point exports. It also makes DNS hostname resolution in the load_tcp operator opt-in and fixes several parser bugs related to schema changes between events.</p>

<h2>Features</h2>

<h3>Check Point syslog structured-data dialect parsing</h3>
<p><small>Mar 2, 2026 · <a href="https://github.com/mavam">@mavam</a>, <a href="https://github.com/codex">@codex</a> · <a href="https://github.com/tenzir/tenzir/pull/5851">#5851</a></small></p>
<p><code>parse_syslog()</code> and <code>read_syslog</code> now accept common Check Point structured-data variants that are not strictly RFC 5424 compliant. This includes <code>key:"value"</code> parameters, semicolon-separated parameters, and records that omit an SD-ID entirely.</p>
<p>For records without an SD-ID, Tenzir now normalizes the structured data under <code>checkpoint_2620</code>, so downstream pipelines can use a stable field path.</p>
<p>For example, the message <code>&#x3C;134>1 ... - [action:"Accept"; conn_direction:"Incoming"]</code> now parses successfully and maps to <code>structured_data.checkpoint_2620</code>. This improves interoperability with Check Point exports and reduces ingestion-time preprocessing.</p>

<h2>Changes</h2>

<h3>JSON parse error context</h3>
<p><small>Mar 6, 2026 · <a href="https://github.com/IyeOnline">@IyeOnline</a> · <a href="https://github.com/tenzir/tenzir/pull/5805">#5805</a></small></p>
<p>JSON parsing errors now display the surrounding bytes at the error location. This
makes it easier to diagnose malformed JSON in your data pipelines.</p>
<p>For example, if your JSON is missing a closing bracket, the error message shows
you the bytes around that location and marks where the parser stopped expecting
more input.</p>

<h3>DNS hostname resolution opt-in for load_tcp operator</h3>
<p><small>Mar 4, 2026 · <a href="https://github.com/tobim">@tobim</a>, <a href="https://github.com/codex">@codex</a> · <a href="https://github.com/tenzir/tenzir/pull/5865">#5865</a></small></p>
<p>The <code>load_tcp</code> operator now makes DNS hostname resolution opt-in with the <code>resolve_hostnames</code> parameter (defaults to <code>false</code>).</p>
<p>Previously, the operator always attempted reverse DNS lookups for peer endpoints, which could fail in environments without working reverse DNS configurations. Now you can enable this behavior by setting <code>resolve_hostnames</code> to <code>true</code>:</p>
<pre><code class="language-tql">load_tcp endpoint="0.0.0.0:5555" resolve_hostnames=true {
  read_json
}
</code></pre>
<p>When enabled and DNS resolution fails, the operator emits a warning diagnostic (once) instead of failing. This allows the operator to continue functioning in environments where reverse DNS is unavailable or unreliable.</p>

<h2>Bug Fixes</h2>

<h3>Uncaught exception reporting</h3>
<p><small>Mar 6, 2026 · <a href="https://github.com/IyeOnline">@IyeOnline</a> · <a href="https://github.com/tenzir/tenzir/pull/5805">#5805</a></small></p>
<p>We improved the reporting for unexpected diagnostics outside of operator execution,
such as during startup. In these cases you will now get the diagnostic message.</p>

<h3>Parser bug fixes for schema changes</h3>
<p><small>Mar 6, 2026 · <a href="https://github.com/IyeOnline">@IyeOnline</a> · <a href="https://github.com/tenzir/tenzir/pull/5805">#5805</a></small></p>
<p>Fixed multiple issues that could cause errors or incorrect behavior when the
schema of parsed events changes between records. This is particularly important
when ingesting data from sources that may add, remove, or modify fields over time.</p>
<p>Schema mismatch warnings for repeated fields in JSON objects (which Tenzir
interprets as lists) now include an explanatory hint, making it clearer what's
happening when a field appears multiple times where a single value was expected.</p>
]]></content>
        <category label="Tenzir Node"/>
        <published>2026-03-06T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[Tenzir Platform v1.29.0]]></title>
        <id>https://docs.tenzir.com/changelog/platform/v1-29-0</id>
        <link href="https://docs.tenzir.com/changelog/platform/v1-29-0"/>
        <updated>2026-03-05T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[With this release, the Tenzir Platform preserves deep links through the login flow, so users are redirected to their original destination after signing in. It also includes several bug fixes and a performance improvement for loading across the platform.]]></summary>
        <content type="html"><![CDATA[<p>With this release, the Tenzir Platform preserves deep links through the login flow, so users are redirected to their original destination after signing in. It also includes several bug fixes and a performance improvement for loading across the platform.</p>

<h2>Features</h2>

<h3>Preserve deep links through login flow</h3>
<p><small>Mar 5, 2026 · <a href="https://github.com/lava">@lava</a></small></p>
<p>When you click a deep link in Tenzir Platform but aren't logged in, you're now redirected to your original destination after signing in, instead of landing on the home page.</p>

<h2>Changes</h2>

<h3>Faster loading across the platform</h3>
<p><small>Feb 18, 2026 · <a href="https://github.com/gitryder">@gitryder</a></small></p>
<p>We improved how the nodes list loads, making dependent views feel faster and more responsive across the platform.</p>

<h2>Bug Fixes</h2>

<h3>Fix blocked profile images for some login providers</h3>
<p><small>Feb 27, 2026 · <a href="https://github.com/gitryder">@gitryder</a></small></p>
<p>We fixed an issue where profile images from Gravatar and Microsoft accounts were blocked by the content security policy, causing broken or missing avatars.</p>

<h3>Fix diagnostics showing data from the wrong pipeline</h3>
<p><small>Feb 27, 2026 · <a href="https://github.com/gitryder">@gitryder</a></small></p>
<p>We fixed an issue where the diagnostics pane could show diagnostics from a different pipeline than the one currently open in the detail modal.</p>

<h3>Fix unstable context list order</h3>
<p><small>Feb 18, 2026 · <a href="https://github.com/gitryder">@gitryder</a></small></p>
<p>We fixed an issue where the context list could appear in a random order when no search was active, causing items to jump around. The list now uses a stable alphabetical order so it stays consistent and easier to interact with.</p>

<h3>Fix unintended logout on inaccessible workspace links</h3>
<p><small>Feb 18, 2026 · <a href="https://github.com/gitryder">@gitryder</a></small></p>
<p>We fixed an issue where opening a pipeline link for a workspace you don’t have access to would log you out. You are now redirected to the access page where you can open the link in your default workspace.</p>
]]></content>
        <category label="Tenzir Platform"/>
        <published>2026-03-05T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[Tenzir Ship v1.3.1]]></title>
        <id>https://docs.tenzir.com/changelog/tenzir-ship/v1-3-1</id>
        <link href="https://docs.tenzir.com/changelog/tenzir-ship/v1-3-1"/>
        <updated>2026-03-04T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This release improves clarity and efficacy of the releasing process in the tenzir-ship agent skill.]]></summary>
        <content type="html"><![CDATA[<p>This release improves clarity and efficacy of the releasing process in the tenzir-ship agent skill.</p>

<h2>Bug Fixes</h2>

<h3>Clarity and efficacy fixes in skill</h3>
<p><small>Mar 4, 2026 · <a href="https://github.com/mavam">@mavam</a>, <a href="https://github.com/claude">@claude</a>, <a href="https://github.com/codex">@codex</a></small></p>
<p>We improved clarity and efficacy of the releasing process in the <code>tenzir-ship</code> agent skill.</p>
]]></content>
        <category label="Tenzir Ship"/>
        <published>2026-03-04T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[Tenzir Node v5.27.3]]></title>
        <id>https://docs.tenzir.com/changelog/tenzir/v5-27-3</id>
        <link href="https://docs.tenzir.com/changelog/tenzir/v5-27-3"/>
        <updated>2026-03-03T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This release fixes a crash that could occur when reading JSON data. It also improves CEF parsing to handle non-conforming unescaped equals characters.]]></summary>
        <content type="html"><![CDATA[<p>This release fixes a crash that could occur when reading JSON data. It also improves CEF parsing to handle non-conforming unescaped equals characters.</p>

<h2>Bug Fixes</h2>

<h3>JSON reading crash fix</h3>
<p><small>Mar 2, 2026 · <a href="https://github.com/IyeOnline">@IyeOnline</a> · <a href="https://github.com/tenzir/tenzir/pull/5855">#5855</a></small></p>
<p>We fixed a bug that could cause a crash when reading JSON data.</p>

<h3>Fix CEF parsing for unescaped equals</h3>
<p><small>Mar 2, 2026 · <a href="https://github.com/jachris">@jachris</a> · <a href="https://github.com/tenzir/tenzir/pull/5841">#5841</a></small></p>
<p>The CEF parser now handles unescaped <code>=</code> characters (which are not conforming to
the specification) by using a heuristic.</p>
]]></content>
        <category label="Tenzir Node"/>
        <published>2026-03-03T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[Tenzir Ship v1.3.0]]></title>
        <id>https://docs.tenzir.com/changelog/tenzir-ship/v1-3-0</id>
        <link href="https://docs.tenzir.com/changelog/tenzir-ship/v1-3-0"/>
        <updated>2026-03-02T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This release adds automatic version file updates during release creation and introduces tooling to keep release manifests in sync across package types.]]></summary>
        <content type="html"><![CDATA[<p>This release adds automatic version file updates during release creation and introduces tooling to keep release manifests in sync across package types.</p>

<h2>Features</h2>

<h3>Pi package and skill for release engineering</h3>
<p><small>Mar 1, 2026 · <a href="https://github.com/mavam">@mavam</a>, <a href="https://github.com/claude">@claude</a>, <a href="https://github.com/codex">@codex</a> · <a href="https://github.com/tenzir/ship/pull/11">#11</a></small></p>
<p>The <code>pi-tenzir-ship</code> package provides a skill for AI coding agents to perform
release engineering tasks. Install it in Pi with:</p>
<pre><code class="language-sh">pi install npm:pi-tenzir-ship
</code></pre>
<p>Then activate it with <code>/skill:tenzir-ship</code>.</p>
<p>The skill covers adding changelog entries, cutting standard and module releases,
triggering GitHub Actions release workflows, and publishing releases to GitHub.</p>

<h3>Automatic version file updates during release creation</h3>
<p><small>Feb 28, 2026 · <a href="https://github.com/mavam">@mavam</a>, <a href="https://github.com/codex">@codex</a> · <a href="https://github.com/tenzir/ship/pull/10">#10</a></small></p>
<p>The release creation command now automatically updates version fields in package manifest files during release. When creating a release, <code>tenzir-ship</code> detects and updates <code>package.json</code>, <code>pyproject.toml</code>, <code>project.toml</code>, and <code>Cargo.toml</code> files in your project, including support for dynamic version files in monorepo workspaces.</p>
<p>You can control this behavior with the <code>release.version_bump_mode</code> configuration option in your <code>config.yaml</code>:</p>
<ul>
<li><code>auto</code> (default): Automatically detect and update version files</li>
<li><code>off</code>: Skip version file updates</li>
</ul>
<p>For more granular control, use the <code>release.version_files</code> option to explicitly specify which files to update. Auto-detection searches the project root and parent directory (for nested changelog projects) and gracefully skips files without static version fields.</p>
<p>Release version selection now defaults to automatic bumping when you run
<code>release create</code> without an explicit version and without <code>--patch</code>, <code>--minor</code>,
or <code>--major</code>. The next version is inferred from unreleased entry types:</p>
<ul>
<li>bugfix -> patch</li>
<li>feature or change -> minor</li>
<li>breaking -> major</li>
</ul>
<p>If no unreleased changelog entries exist, automatic bumping is not available.
In that case, provide an explicit version or a manual bump flag to create an
intro-only release.</p>
<p>The <code>stats</code> command now reports the computed next release version (or no value
when no automatic bump can be inferred), including in <code>stats --json</code>.</p>
]]></content>
        <category label="Tenzir Ship"/>
        <published>2026-03-02T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[Tenzir Ship v1.2.0]]></title>
        <id>https://docs.tenzir.com/changelog/tenzir-ship/v1-2-0</id>
        <link href="https://docs.tenzir.com/changelog/tenzir-ship/v1-2-0"/>
        <updated>2026-02-28T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This release adds support for creating releases with only introductory text and no changelog entries, and splits the reusable release workflow into minimal and advanced variants. It also fixes changelog structure validation and release progress panel display issues.]]></summary>
        <content type="html"><![CDATA[<p>This release adds support for creating releases with only introductory text and no changelog entries, and splits the reusable release workflow into minimal and advanced variants. It also fixes changelog structure validation and release progress panel display issues.</p>

<h2>Features</h2>

<h3>Allow intro-only releases</h3>
<p><small>Feb 28, 2026 · <a href="https://github.com/mavam">@mavam</a>, <a href="https://github.com/codex">@codex</a> · <a href="https://github.com/tenzir/ship/pull/9">#9</a></small></p>
<p>Create releases with only introductory text and no changelog entries by using the <code>--intro</code> or <code>--intro-file</code> flags with <code>release create</code>. This is useful when re-publishing a package after yanking a previous artifact or retrying a failed publish workflow—scenarios where you want to create a new release version without adding changelog entries.</p>
<p>Previously, you had to provide at least one changelog entry to create a release. Now the release creation allows you to skip the entries entirely if you supply intro text. The <code>--intro</code> flag accepts text directly, while <code>--intro-file</code> reads from a Markdown file.</p>

<h3>Split reusable release workflow into minimal and advanced variants</h3>
<p><small>Feb 16, 2026 · <a href="https://github.com/mavam">@mavam</a>, <a href="https://github.com/codex">@codex</a></small></p>
<p><code>reusable-release.yaml</code> now acts as a minimal opinionated wrapper around a new
<code>reusable-release-advanced.yaml</code> workflow.</p>
<p>The advanced workflow adds optional hooks and release controls for complex
consumers: pre/post publish scripts, non-main <code>--no-latest</code> publishing,
optional copy of release directories to <code>main</code>, <code>latest</code> branch updates, a
<code>skip-publish</code> dry-run mode, and workflow outputs for <code>version</code> and
<code>is_latest</code>.</p>

<h2>Bug Fixes</h2>

<h3>Enforce changelog structure for releases and command warnings</h3>
<p><small>Feb 28, 2026 · <a href="https://github.com/mavam">@mavam</a>, <a href="https://github.com/codex">@codex</a></small></p>
<p>Release commands now validate changelog directory structure before they run and fail fast when it is invalid.</p>
<p><code>release create</code> and <code>release publish</code> now stop with explicit errors when stray files or directories are detected (for example, an unexpected <code>changelog/next/</code> directory). Other commands (<code>show</code>, <code>add</code>, <code>stats</code>, and <code>release version</code>) emit warnings so layout problems are visible earlier, while <code>validate</code> reports full structural issues as regular validation errors.</p>

<h3>Fix release progress panel truncating failed commands</h3>
<p><small>Feb 15, 2026 · <a href="https://github.com/mavam">@mavam</a>, <a href="https://github.com/claude">@claude</a> · <a href="https://github.com/tenzir/ship/pull/7">#7</a></small></p>
<p>When a release step fails, the full command now prints below the progress panel so you can copy-paste it for manual recovery.</p>
<p>Previously, long commands would get truncated in the release progress panel, making it difficult to reproduce the failure manually. Now when a step fails, the complete command is displayed in full below the panel, giving you what you need to debug and retry the operation.</p>
]]></content>
        <category label="Tenzir Ship"/>
        <published>2026-02-28T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[Tenzir Node v5.27.2]]></title>
        <id>https://docs.tenzir.com/changelog/tenzir/v5-27-2</id>
        <link href="https://docs.tenzir.com/changelog/tenzir/v5-27-2"/>
        <updated>2026-02-27T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This release adds the hmac function for computing Hash-based Message Authentication Codes over strings and blobs. It also fixes an assertion failure in array slicing that was introduced in v5.27.0.]]></summary>
        <content type="html"><![CDATA[<p>This release adds the hmac function for computing Hash-based Message Authentication Codes over strings and blobs. It also fixes an assertion failure in array slicing that was introduced in v5.27.0.</p>

<h2>Features</h2>

<h3>Add `hmac` function</h3>
<p><small>Feb 27, 2026 · <a href="https://github.com/mavam">@mavam</a>, <a href="https://github.com/codex">@codex</a> · <a href="https://github.com/tenzir/tenzir/pull/5846">#5846</a></small></p>
<p>The new experimental <code>hmac</code> function computes Hash-based Message
Authentication Codes (HMAC) for strings and blobs. It supports SHA-256
(default), SHA-512, SHA-384, SHA-1, and MD5 algorithms.</p>
<p>Note: The <code>key</code> parameter is currently a plain string because function
arguments cannot be secrets yet. We plan to change this in the future.</p>
<pre><code class="language-tql">from {
  signature: hmac("hello world", "my-secret-key"),
}
</code></pre>
<pre><code class="language-tql">{
  signature: "90eb182d8396f16d4341d582047f45c0a97d73388c5377d9ced478a2212295ad",
}
</code></pre>
<p>Specify a different algorithm with the <code>algorithm</code> parameter:</p>
<pre><code class="language-tql">from {
  signature: hmac("hello world", "my-secret-key", algorithm="sha512"),
}
</code></pre>

<h2>Bug Fixes</h2>

<h3>Fixed an assertion failure in slicing</h3>
<p><small>Feb 27, 2026 · <a href="https://github.com/IyeOnline">@IyeOnline</a> · <a href="https://github.com/tenzir/tenzir/pull/5842">#5842</a></small></p>
<p>We fixed a bug that would cause an assertion failure <em>"Index error: array slice would exceed array length"</em>.
This was introduced as part of an optimization in Tenzir Node v5.27.0.</p>
]]></content>
        <category label="Tenzir Node"/>
        <published>2026-02-27T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[Tenzir Test v1.7.3]]></title>
        <id>https://docs.tenzir.com/changelog/tenzir-test/v1-7-3</id>
        <link href="https://docs.tenzir.com/changelog/tenzir-test/v1-7-3"/>
        <updated>2026-02-27T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This release improves parallel suite scheduling reliability and adds correctness guards via suite.min_jobs in test.yaml.]]></summary>
        <content type="html"><![CDATA[<p>This release improves parallel suite scheduling reliability and adds correctness guards via suite.min_jobs in test.yaml.</p>

<h2>Bug Fixes</h2>

<h3>Improve parallel suite scheduling and correctness checks</h3>
<p><small>Feb 26, 2026 · <a href="https://github.com/mavam">@mavam</a>, <a href="https://github.com/codex">@codex</a></small></p>
<p>Parallel suites are now scheduled more reliably when running with <code>--jobs > 1</code>, so interdependent tests (for example publisher/subscriber pairs) start together sooner instead of being delayed behind large backlogs of unrelated tests.</p>
<p>This update also adds an explicit correctness guard for parallel suites: you can set <code>suite.min_jobs</code> in <code>test.yaml</code> to declare the minimum job count required for valid execution. The run now fails fast if <code>--jobs</code> is lower than <code>suite.min_jobs</code>, and it also fails hard when a parallel suite cannot reserve at least <code>min_jobs</code> workers at runtime (for example under slot contention), instead of proceeding under-provisioned.</p>
<p>In addition, the harness now warns when a parallel suite has more tests than available jobs, making it easier to spot cases where effective suite parallelism is capped by worker count.</p>
]]></content>
        <category label="Tenzir Test"/>
        <published>2026-02-27T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[Tenzir Node v5.27.1]]></title>
        <id>https://docs.tenzir.com/changelog/tenzir/v5-27-1</id>
        <link href="https://docs.tenzir.com/changelog/tenzir/v5-27-1"/>
        <updated>2026-02-25T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This release fixes an issue where the platform plugin did not correctly use the configured certfile, keyfile, and cafile options for client certificate authentication.]]></summary>
        <content type="html"><![CDATA[<p>This release fixes an issue where the platform plugin did not correctly use the configured certfile, keyfile, and cafile options for client certificate authentication.</p>

<h2>Bug Fixes</h2>

<h3>Fix platform plugin not respecting `certfile` and `keyfile` options</h3>
<p><small>Feb 24, 2026 · <a href="https://github.com/lava">@lava</a></small></p>
<p>Fixed in issue where the platform plugin did not correctly use the
configured <code>certfile</code>, <code>keyfile</code> and <code>cafile</code> options for client
certificate authentication, and improved the error messages for TLS
issues during platform connection.</p>
]]></content>
        <category label="Tenzir Node"/>
        <published>2026-02-25T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[Tenzir Test v1.7.2]]></title>
        <id>https://docs.tenzir.com/changelog/tenzir-test/v1-7-2</id>
        <link href="https://docs.tenzir.com/changelog/tenzir-test/v1-7-2"/>
        <updated>2026-02-25T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This release fixes enum serialization errors when Python fixture tests use configuration values like mode: sequential in test.yaml.]]></summary>
        <content type="html"><![CDATA[<p>This release fixes enum serialization errors when Python fixture tests use configuration values like mode: sequential in test.yaml.</p>

<h2>Bug Fixes</h2>

<h3>Enum serialization in Python fixture config</h3>
<p><small>Feb 25, 2026 · <a href="https://github.com/mavam">@mavam</a>, <a href="https://github.com/codex">@codex</a> · <a href="https://github.com/tenzir/test/pull/32">#32</a></small></p>
<p>Python fixture tests could fail with serialization errors when the test
configuration included enum values like <code>mode: sequential</code> in <code>test.yaml</code>.
These values are now properly converted to strings before being passed to
test scripts.</p>
]]></content>
        <category label="Tenzir Test"/>
        <published>2026-02-25T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[Tenzir Test v1.7.1]]></title>
        <id>https://docs.tenzir.com/changelog/tenzir-test/v1-7-1</id>
        <link href="https://docs.tenzir.com/changelog/tenzir-test/v1-7-1"/>
        <updated>2026-02-25T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This release adds parallel suite execution and fixes several bugs, including clean Ctrl+C handling, consistent default fixture options, and reliable shell runner defaults for .sh test files.]]></summary>
        <content type="html"><![CDATA[<p>This release adds parallel suite execution and fixes several bugs, including clean Ctrl+C handling, consistent default fixture options, and reliable shell runner defaults for .sh test files.</p>

<h2>Features</h2>

<h3>Parallel suite execution</h3>
<p><small>Feb 24, 2026 · <a href="https://github.com/mavam">@mavam</a>, <a href="https://github.com/codex">@codex</a> · <a href="https://github.com/tenzir/test/pull/29">#29</a></small></p>
<p>Test suites can now execute their members in parallel by specifying <code>mode: parallel</code> in the suite configuration. By default, suites continue to run tests sequentially for stability and predictability.</p>
<p>To enable parallel execution, set <code>mode: parallel</code> in the <code>test.yaml</code> file alongside the <code>suite</code> configuration:</p>
<pre><code class="language-yaml">suite:
  name: my-suite
  mode: parallel
fixtures:
  - node
</code></pre>
<p>Parallel suite execution is useful when tests within a suite are independent and can safely run concurrently. All suite members share the same fixtures and execute within the same fixture lifecycle, while test execution itself happens on separate threads. The suite thread pool is bounded by <code>--jobs</code>, so suite-level concurrency stays within the configured worker budget and does not scale unbounded with suite size.</p>
<p>Suite-level constraints like timeouts, fixture requirements, and capability checks still apply uniformly across all members, whether running sequentially or in parallel.</p>

<h2>Bug Fixes</h2>

<h3>Avoid Python backtraces on Ctrl+C interrupts</h3>
<p><small>Feb 25, 2026 · <a href="https://github.com/mavam">@mavam</a>, <a href="https://github.com/codex">@codex</a> · <a href="https://github.com/tenzir/test/pull/31">#31</a></small></p>
<p>Interrupting test runs with Ctrl+C now exits cleanly without leaking Python tracebacks from subprocess or fixture startup/teardown paths. Interrupt-shaped errors (including nested causes with signal-style return codes such as 130) are treated as graceful cancellation so the CLI reports interrupted tests instead of crashing.</p>

<h3>Shell test files default to shell runner</h3>
<p><small>Feb 24, 2026 · <a href="https://github.com/mavam">@mavam</a>, <a href="https://github.com/codex">@codex</a> · <a href="https://github.com/tenzir/test/pull/30">#30</a></small></p>
<p>Shell test files (<code>.sh</code>) now always default to the "shell" runner, even when a directory-level <code>test.yaml</code> file specifies a different runner (for example, <code>runner: tenzir</code>). This makes shell scripts work reliably in mixed-runner directories without requiring explicit <code>runner:</code> frontmatter in each file. Explicit <code>runner:</code> declarations in test file frontmatter still take precedence and can override this behavior if needed.</p>

<h3>Fix default fixture options in manual fixture control</h3>
<p><small>Feb 24, 2026 · <a href="https://github.com/mavam">@mavam</a>, <a href="https://github.com/codex">@codex</a></small></p>
<p>Manual fixture control now behaves consistently for fixtures that declare dataclass
options.</p>
<p>Previously, starting a fixture with <code>acquire_fixture(...)</code> could fail when no
explicit options were provided, even if the fixture defined defaults.</p>
<p>With this fix, <code>current_options(...)</code> returns default typed options in the
manual fixture-control path, so fixtures started manually and fixtures started
through normal test activation behave the same way.</p>
]]></content>
        <category label="Tenzir Test"/>
        <published>2026-02-25T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[Tenzir Node v5.27.0]]></title>
        <id>https://docs.tenzir.com/changelog/tenzir/v5-27-0</id>
        <link href="https://docs.tenzir.com/changelog/tenzir/v5-27-0"/>
        <updated>2026-02-24T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This release enhances the sort function with custom comparators and descending order support, and extends the slice function to work with lists.]]></summary>
        <content type="html"><![CDATA[<p>This release enhances the sort function with custom comparators and descending order support, and extends the slice function to work with lists.</p>

<h2>Features</h2>

<h3>Slice function extended to support lists</h3>
<p><small>Feb 22, 2026 · <a href="https://github.com/mavam">@mavam</a>, <a href="https://github.com/codex">@codex</a> · <a href="https://github.com/tenzir/tenzir/pull/5819">#5819</a></small></p>
<p>The <code>slice</code> function now supports <code>list</code> types in addition to <code>string</code>. You can slice lists using the same <code>begin</code>, <code>end</code>, and <code>stride</code> parameters. Negative stride values are now supported for lists, letting you reverse or step backward through list data. String slicing continues to require a positive <code>stride</code>.</p>
<p>Example usage with lists:</p>
<ul>
<li><code>[1, 2, 3, 4, 5].slice(begin=1, end=4)</code> returns <code>[2, 3, 4]</code></li>
<li><code>[1, 2, 3, 4, 5].slice(stride=-1)</code> returns the list in reverse order</li>
<li><code>[1, 2, 3, 4, 5].slice(begin=1, end=5, stride=-2)</code> returns <code>[5, 3]</code></li>
</ul>

<h3>Enhance `sort` function with `desc` and `cmp` parameters</h3>
<p><small>Feb 17, 2026 · <a href="https://github.com/mavam">@mavam</a>, <a href="https://github.com/codex">@codex</a> · <a href="https://github.com/tenzir/tenzir/pull/5767">#5767</a></small></p>
<p>The <code>sort</code> function now supports two new parameters: <code>desc</code> for controlling
sort direction and <code>cmp</code> for custom comparison logic via binary lambdas.</p>
<p><strong>Sort in descending order:</strong></p>
<pre><code class="language-tql">from {xs: [3, 1, 2]}
select ys = sort(xs, desc=true)
</code></pre>
<pre><code class="language-tql">{ys: [3, 2, 1]}
</code></pre>
<p><strong>Sort records by a specific field using a custom comparator:</strong></p>
<pre><code class="language-tql">from {xs: [{v: 2, id: "b"}, {v: 1, id: "a"}, {v: 2, id: "c"}]}
select ys = sort(xs, cmp=(left, right) => left.v &#x3C; right.v)
</code></pre>
<pre><code class="language-tql">{
  ys: [
    {v: 1, id: "a"},
    {v: 2, id: "b"},
    {v: 2, id: "c"},
  ],
}
</code></pre>
<p>The <code>cmp</code> lambda receives two elements and returns a boolean indicating whether
the first element should come before the second. Both parameters can be combined
to reverse a custom comparison.</p>

<h2>Bug Fixes</h2>

<h3>Fix `read_lines` operator for old executor</h3>
<p><small>Feb 17, 2026 · <a href="https://github.com/tobim">@tobim</a></small></p>
<p>The <code>read_lines</code> operator was accidently broken while it was ported
to the new execution API. This change restores its functionality.</p>

<h3>HTTP header values can contain colons</h3>
<p><small>Jan 28, 2026 · <a href="https://github.com/lava">@lava</a> · <a href="https://github.com/tenzir/tenzir/pull/5693">#5693</a></small></p>
<p>HTTP header values containing colons are now parsed correctly.</p>
]]></content>
        <category label="Tenzir Node"/>
        <published>2026-02-24T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[Tenzir Platform v1.28.3]]></title>
        <id>https://docs.tenzir.com/changelog/platform/v1-28-3</id>
        <link href="https://docs.tenzir.com/changelog/platform/v1-28-3"/>
        <updated>2026-02-24T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This release improves the clarity and usability of Explorer charts with better legends, tooltips, and an expanded color palette. It also fixes several UI bugs including unresponsive pipeline lists and stale workspace cleanup.]]></summary>
        <content type="html"><![CDATA[<p>This release improves the clarity and usability of Explorer charts with better legends, tooltips, and an expanded color palette. It also fixes several UI bugs including unresponsive pipeline lists and stale workspace cleanup.</p>

<h2>Changes</h2>

<h3>Improved Chart Legends, Tooltips, and Colors</h3>
<p><small>Feb 18, 2026 · <a href="https://github.com/gitryder">@gitryder</a></small></p>
<p>We improved the clarity and usability of Explorer charts. Legends are now collapsible, easier to read, and support filtering series directly. Pie chart legends adapt better to available space, and tooltips provide clearer information.</p>
<p>We also expanded the chart color palette for better visual distinction between series, fixed bar chart x-axis labels overlapping when there are many data points, and refined chart layout and behavior for a smoother overall experience.</p>

<h2>Bug Fixes</h2>

<h3>Fix workspace switcher not displaying Google profile pictures</h3>
<p><small>Feb 18, 2026 · <a href="https://github.com/gitryder">@gitryder</a></small></p>
<p>Resolved an issue where your Google profile picture did not appear in the workspace switcher. The image now loads and displays correctly.</p>

<h3>Fix stale loop variables in static workspace cleanup</h3>
<p><small>Feb 17, 2026 · <a href="https://github.com/lava">@lava</a></small></p>
<p>Fixed a bug where the static workspace synchronization used stale loop
variables during cleanup, causing stale workspaces to persist and the last
configured workspace to be incorrectly deleted.</p>

<h3>Fix pipeline list not responding after pressing ESC</h3>
<p><small>Feb 17, 2026 · <a href="https://github.com/gitryder">@gitryder</a></small></p>
<p>We fixed an issue where pressing ESC to close a pipeline detail view caused the pipeline list to stop responding to clicks.</p>
]]></content>
        <category label="Tenzir Platform"/>
        <published>2026-02-24T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[Tenzir Test v1.7.0]]></title>
        <id>https://docs.tenzir.com/changelog/tenzir-test/v1-7-0</id>
        <link href="https://docs.tenzir.com/changelog/tenzir-test/v1-7-0"/>
        <updated>2026-02-22T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This release adds suite-level capability requirements, letting test suites declare required operators and skip gracefully when those capabilities are unavailable in the target build.]]></summary>
        <content type="html"><![CDATA[<p>This release adds suite-level capability requirements, letting test suites declare required operators and skip gracefully when those capabilities are unavailable in the target build.</p>

<h2>Features</h2>

<h3>Suite-level capability requirements and conditional skipping</h3>
<p><small>Feb 22, 2026 · <a href="https://github.com/mavam">@mavam</a>, <a href="https://github.com/codex">@codex</a> · <a href="https://github.com/tenzir/test/pull/28">#28</a></small></p>
<p>Test suites can now declare operator dependencies with a <code>requires</code> configuration key in <code>test.yaml</code>. When a required operator is unavailable in the target Tenzir build, you can gracefully skip the suite by pairing <code>requires</code> with <code>skip: {on: capability-unavailable}</code>.</p>
<p>The <code>skip.on</code> key now accepts either a single condition as a string or a list of conditions, letting you skip on either <code>fixture-unavailable</code> or <code>capability-unavailable</code> (or both). When a capability is unavailable and the suite doesn't opt into skipping, the test run fails with a clear error message listing the missing operators.</p>
<p>Example configuration in <code>test.yaml</code>:</p>
<pre><code class="language-yaml">requires:
  operators: [from_gcs, to_s3]
skip:
  on: capability-unavailable
  reason: requires from_gcs and to_s3 operators
</code></pre>
<p>This ensures test suites targeting specific capabilities only run when those capabilities are present, improving test reliability in heterogeneous build environments.</p>
]]></content>
        <category label="Tenzir Test"/>
        <published>2026-02-22T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[Tenzir Test v1.6.0]]></title>
        <id>https://docs.tenzir.com/changelog/tenzir-test/v1-6-0</id>
        <link href="https://docs.tenzir.com/changelog/tenzir-test/v1-6-0"/>
        <updated>2026-02-19T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This release adds fixture assertion hooks that enable post-test validation of side effects while fixtures remain active. Assertion results are tracked separately in the run summary.]]></summary>
        <content type="html"><![CDATA[<p>This release adds fixture assertion hooks that enable post-test validation of side effects while fixtures remain active. Assertion results are tracked separately in the run summary.</p>

<h2>Features</h2>

<h3>Fixture assertion hooks for post-test validation</h3>
<p><small>Feb 18, 2026 · <a href="https://github.com/mavam">@mavam</a>, <a href="https://github.com/codex">@codex</a> · <a href="https://github.com/tenzir/test/pull/27">#27</a></small></p>
<p>Fixtures can now define assertion hooks that run after test execution completes while fixtures remain active. Define assertions using the <code>assertions</code> parameter with a frozen dataclass type, then pass fixture-specific assertion payloads under <code>assertions.fixtures.&#x3C;name></code> in test frontmatter. The framework automatically invokes the <code>assert_test</code> hook with assertion data before tearing down fixtures, letting you validate side effects like HTTP requests or log output.</p>
<p>Example usage with an HTTP fixture:</p>
<pre><code class="language-yaml">fixtures: [http]
assertions:
  fixtures:
    http:
      count: 1
      method: POST
      path: /api/endpoint
      body: '{"key":"value"}'
</code></pre>
<p>The HTTP fixture receives the typed assertion payload and validates that the expected request was received. Payload structure is fixture-defined, so fixtures can choose flat fields or nested schemas as needed.</p>
<p>Assertion checks are tracked separately from test counts in the run summary as pass/fail check metrics, so fixture-level validations are visible without changing total test counts.</p>
]]></content>
        <category label="Tenzir Test"/>
        <published>2026-02-19T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[Tenzir Platform v1.28.2]]></title>
        <id>https://docs.tenzir.com/changelog/platform/v1-28-2</id>
        <link href="https://docs.tenzir.com/changelog/platform/v1-28-2"/>
        <updated>2026-02-17T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This release brings the Platform's dependencies up to date with the latest CVE fixes.]]></summary>
        <content type="html"><![CDATA[<p>This release brings the Platform's dependencies up to date with the latest CVE fixes.</p>

<h2>Bug Fixes</h2>

<h3>Patch security vulnerabilities</h3>
<p><small>Feb 17, 2026 · <a href="https://github.com/gitryder">@gitryder</a></small></p>
<p>We updated the Platform's underlying framework dependencies to include their latest security fixes.</p>
]]></content>
        <category label="Tenzir Platform"/>
        <published>2026-02-17T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[Tenzir Test v1.5.1]]></title>
        <id>https://docs.tenzir.com/changelog/tenzir-test/v1-5-1</id>
        <link href="https://docs.tenzir.com/changelog/tenzir-test/v1-5-1"/>
        <updated>2026-02-16T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This release improves error handling by showing clean messages for unavailable fixtures and avoids unnecessary fixture initialization for fully skipped test suites.]]></summary>
        <content type="html"><![CDATA[<p>This release improves error handling by showing clean messages for unavailable fixtures and avoids unnecessary fixture initialization for fully skipped test suites.</p>

<h2>Bug Fixes</h2>

<h3>Skip fixture initialization for suites with all static skips</h3>
<p><small>Feb 16, 2026 · <a href="https://github.com/mavam">@mavam</a>, <a href="https://github.com/codex">@codex</a> · <a href="https://github.com/tenzir/test/pull/26">#26</a></small></p>
<p>The test harness no longer initializes fixtures for suites where all tests are statically skipped. Previously, fixtures were activated even when no tests would run, causing unnecessary startup overhead and potential errors.</p>

<h3>Clean error messages for unavailable fixtures</h3>
<p><small>Feb 16, 2026 · <a href="https://github.com/mavam">@mavam</a>, <a href="https://github.com/codex">@codex</a> · <a href="https://github.com/tenzir/test/pull/25">#25</a></small></p>
<p>When a fixture becomes unavailable during test execution, the test harness now provides a clean error message instead of a Python traceback.</p>
]]></content>
        <category label="Tenzir Test"/>
        <published>2026-02-16T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[Tenzir Test v1.5.0]]></title>
        <id>https://docs.tenzir.com/changelog/tenzir-test/v1-5-0</id>
        <link href="https://docs.tenzir.com/changelog/tenzir-test/v1-5-0"/>
        <updated>2026-02-16T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This release adds fine-grained controls for running skipped tests, including a new --run-skipped-reason flag with substring and glob matching semantics.]]></summary>
        <content type="html"><![CDATA[<p>This release adds fine-grained controls for running skipped tests, including a new --run-skipped-reason flag with substring and glob matching semantics.</p>

<h2>Features</h2>

<h3>Add fine-grained run-skipped selectors</h3>
<p><small>Feb 15, 2026 · <a href="https://github.com/mavam">@mavam</a>, <a href="https://github.com/codex">@codex</a> · <a href="https://github.com/tenzir/test/pull/23">#23</a>, <a href="https://github.com/tenzir/test/pull/24">#24</a></small></p>
<p><code>tenzir-test</code> now supports both coarse and fine-grained controls for running skipped tests.</p>
<p>Use <code>--run-skipped</code> as a sledgehammer, or <code>--run-skipped-reason</code> with the same matching semantics as <code>--match</code> (bare substring or glob):</p>
<pre><code class="language-sh">tenzir-test --run-skipped
tenzir-test --run-skipped-reason 'maintenance'
tenzir-test --run-skipped-reason '*docker*'
</code></pre>
<p>If both options are provided, <code>--run-skipped</code> takes precedence.</p>
]]></content>
        <category label="Tenzir Test"/>
        <published>2026-02-16T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[Tenzir Test v1.4.0]]></title>
        <id>https://docs.tenzir.com/changelog/tenzir-test/v1-4-0</id>
        <link href="https://docs.tenzir.com/changelog/tenzir-test/v1-4-0"/>
        <updated>2026-02-15T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This release introduces a standalone fixture mode for starting fixtures without running tests, adds a built-in docker-compose fixture with structured options, and provides shared container runtime helpers for writing custom fixtures.]]></summary>
        <content type="html"><![CDATA[<p>This release introduces a standalone fixture mode for starting fixtures without running tests, adds a built-in docker-compose fixture with structured options, and provides shared container runtime helpers for writing custom fixtures.</p>

<h2>Features</h2>

<h3>Shared container runtime helpers for fixtures</h3>
<p><small>Feb 15, 2026 · <a href="https://github.com/mavam">@mavam</a>, <a href="https://github.com/codex">@codex</a> · <a href="https://github.com/tenzir/test/pull/22">#22</a></small></p>
<p>Writing container-based fixtures no longer requires duplicating boilerplate for
runtime detection, process management, and readiness polling.</p>
<p>The new <code>container_runtime</code> module provides reusable building blocks that handle
the common plumbing: detecting whether Docker or Podman is available, launching
containers in detached mode, polling for service readiness, and tearing down
cleanly. Custom fixtures can import these helpers and focus on their
service-specific logic instead.</p>
<p>The built-in <code>docker-compose</code> fixture and the example project now use these
shared helpers internally.</p>

<h3>Native docker-compose fixture with structured options</h3>
<p><small>Feb 14, 2026 · <a href="https://github.com/mavam">@mavam</a> · <a href="https://github.com/tenzir/test/pull/21">#21</a></small></p>
<p>Adds a built-in <code>docker-compose</code> fixture that starts and tears down Docker Compose services from structured fixture options.</p>
<p>The fixture validates Docker Compose availability, waits for service readiness (health-check first, running-state fallback), and exports deterministic service environment variables (including host-published ports).</p>

<h3>Standalone fixture mode with --fixture CLI option</h3>
<p><small>Feb 14, 2026 · <a href="https://github.com/mavam">@mavam</a>, <a href="https://github.com/claude">@claude</a> · <a href="https://github.com/tenzir/test/pull/20">#20</a></small></p>
<p>You can now start fixtures in foreground mode without running any tests by using the <code>--fixture</code> option. This lets you provision services (like a database or message broker) and use them in your workflow.</p>
<p>Specify fixture names or YAML-style configuration:</p>
<pre><code class="language-sh">uvx tenzir-test --fixture mysql
uvx tenzir-test --fixture 'kafka: {port: 9092}' --debug
</code></pre>
<p>The harness prints fixture-provided environment variables like <code>HOST</code>, <code>PORT</code>, and <code>DATABASE</code>, then keeps services running until you press <code>Ctrl+C</code>. You can repeat <code>--fixture</code> to activate multiple fixtures. The option is mutually exclusive with positional TEST arguments.</p>
]]></content>
        <category label="Tenzir Test"/>
        <published>2026-02-15T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[Tenzir Node v5.26.0]]></title>
        <id>https://docs.tenzir.com/changelog/tenzir/v5-26-0</id>
        <link href="https://docs.tenzir.com/changelog/tenzir/v5-26-0"/>
        <updated>2026-02-13T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This release introduces the from_mysql operator for reading data directly from MySQL databases, with support for live streaming, custom SQL queries, and TLS connections. It also adds link-based HTTP pagination and optional field parameters for user-defined operators.]]></summary>
        <content type="html"><![CDATA[<p>This release introduces the from_mysql operator for reading data directly from MySQL databases, with support for live streaming, custom SQL queries, and TLS connections. It also adds link-based HTTP pagination and optional field parameters for user-defined operators.</p>

<h2>Features</h2>

<h3>Optional field parameters for user-defined operators</h3>
<p><small>Feb 12, 2026 · <a href="https://github.com/mavam">@mavam</a>, <a href="https://github.com/claude">@claude</a> · <a href="https://github.com/tenzir/tenzir/pull/5753">#5753</a></small></p>
<p>User-defined operators in packages can now declare optional field-type parameters with <code>null</code> as the default value. This allows operators to accept field selectors that are not required to be provided.</p>
<p>When a field parameter is declared with <code>type: field</code> and <code>default: null</code>, you can omit the argument when calling the operator, and the parameter will receive a <code>null</code> value instead. You can then check whether a field was provided by comparing the parameter to <code>null</code> within the operator definition.</p>
<p>Example:</p>
<p>In your package's operator definition, declare an optional field parameter:</p>
<pre><code class="language-yaml">args:
  named:
    - name: selector
      type: field
      default: null
</code></pre>
<p>In the operator implementation, check if the field was provided:</p>
<pre><code class="language-tql">set result = if $selector != null then "field provided" else "field omitted"
</code></pre>
<p>When calling the operator, the field argument becomes optional:</p>
<pre><code class="language-tql">my_operator                    # field is null
my_operator selector=x.y       # field is x.y
</code></pre>
<p>Only <code>null</code> is allowed as the default value for field parameters. Non-null defaults are rejected with an error during package loading.</p>

<h3>Link header pagination for HTTP operators</h3>
<p><small>Feb 11, 2026 · <a href="https://github.com/mavam">@mavam</a>, <a href="https://github.com/claude">@claude</a></small></p>
<p>The <code>paginate</code> parameter for the <code>from_http</code> and <code>http</code> operators now supports link-based pagination via the <code>Link</code> HTTP header.</p>
<p>Previously, pagination was only available through a lambda function that extracted the next URL from response data. Now you can use <code>paginate="link"</code> to automatically follow pagination links specified in the response's <code>Link</code> header, following RFC 8288. This is useful for APIs that use HTTP header-based pagination instead of embedding next URLs in the response body.</p>
<p>The operator parses the <code>Link</code> header and follows the <code>rel=next</code> relation to automatically fetch the next page of results.</p>
<p>Example:</p>
<pre><code>from_http "https://api.example.com/data", paginate="link"
</code></pre>
<p>If an invalid pagination mode is provided (neither a lambda nor <code>"link"</code>), the operator now reports a clear error message.</p>

<h3>MySQL source operator</h3>
<p><small>Feb 6, 2026 · <a href="https://github.com/mavam">@mavam</a>, <a href="https://github.com/claude">@claude</a> · <a href="https://github.com/tenzir/tenzir/pull/5721">#5721</a>, <a href="https://github.com/tenzir/tenzir/pull/5738">#5738</a></small></p>
<p>The <code>from_mysql</code> operator lets you read data directly from MySQL databases.</p>
<p>Read a table:</p>
<pre><code class="language-tql">from_mysql table="users", host="localhost", port=3306, user="admin", password="secret", database="mydb"
</code></pre>
<p>List tables:</p>
<pre><code class="language-tql">from_mysql show="tables", host="localhost", port=3306, user="admin", password="secret", database="mydb"
</code></pre>
<p>Show columns:</p>
<pre><code class="language-tql">from_mysql table="users", show="columns", host="localhost", port=3306, user="admin", password="secret", database="mydb"
</code></pre>
<p>And ultimately execute a custom SQL query:</p>
<pre><code class="language-tql">from_mysql sql="SELECT id, name FROM users WHERE active = 1",
           host="localhost",
           port=3306,
           user="admin",
           password="secret",
           database="mydb"
</code></pre>
<p>The operator supports TLS/SSL connections for secure communication with MySQL
servers. Use <code>tls=true</code> for default TLS settings, or pass a record for
fine-grained control:</p>
<pre><code class="language-tql">from_mysql table="users", host="db.example.com", database="prod", tls={
  cacert: "/path/to/ca.pem",
  certfile: "/path/to/client-cert.pem",
  keyfile: "/path/to/client-key.pem",
}
</code></pre>
<p>The operator supports MySQL's <code>caching_sha2_password</code> authentication method and automatically maps MySQL data types to Tenzir types.</p>
<p>Use <code>live=true</code> to continuously stream new rows from a table. The operator
tracks progress using a watermark on an integer column, polling for rows above
the last-seen value:</p>
<pre><code class="language-tql">from_mysql table="events", live=true, host="localhost", database="mydb"
</code></pre>
<p>By default, the tracking column is auto-detected from the table's
auto-increment primary key. To specify one explicitly:</p>
<pre><code class="language-tql">from_mysql table="events", live=true, tracking_column="event_id",
           host="localhost", database="mydb"
</code></pre>

<h2>Bug Fixes</h2>

<h3>Improve write_lines operator performance</h3>
<p><small>Feb 12, 2026 · <a href="https://github.com/IyeOnline">@IyeOnline</a></small></p>
<p>We have significantly improved the performance of the <code>write_lines</code> operator.</p>

<h3>Secret type support for user-defined operator parameters</h3>
<p><small>Feb 12, 2026 · <a href="https://github.com/mavam">@mavam</a>, <a href="https://github.com/claude">@claude</a> · <a href="https://github.com/tenzir/tenzir/pull/5752">#5752</a></small></p>
<p>User-defined operators in packages can now declare parameters with the <code>secret</code> type to ensure that secret values are properly handled as secret expressions:</p>
<pre><code>args:
  positional:
    - name: api_key
      type: secret
      description: "API key to use for authentication"
</code></pre>

<h3>merge() function recursive deep merge for nested records</h3>
<p><small>Feb 5, 2026 · <a href="https://github.com/mavam">@mavam</a>, <a href="https://github.com/claude">@claude</a> · <a href="https://github.com/tenzir/tenzir/pull/5728">#5728</a></small></p>
<p>The <code>merge()</code> function now performs a recursive deep merge when merging two records. Previously, nested fields were dropped when merging, so <code>merge({hw: {sn: "XYZ123"}}, {hw: {model: "foobar"}})</code> would incorrectly produce <code>{hw: {model: "foobar"}}</code> instead of recursively merging the nested fields. The function now correctly produces <code>{hw: {sn: "XYZ123", model: "foobar"}}</code> by materializing both input records and performing a deep merge on them.</p>
]]></content>
        <category label="Tenzir Node"/>
        <published>2026-02-13T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[Tenzir Test v1.3.2]]></title>
        <id>https://docs.tenzir.com/changelog/tenzir-test/v1-3-2</id>
        <link href="https://docs.tenzir.com/changelog/tenzir-test/v1-3-2"/>
        <updated>2026-02-13T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This release improves the readability of configuration override log messages by using relative paths and human-friendly formatting.]]></summary>
        <content type="html"><![CDATA[<p>This release improves the readability of configuration override log messages by using relative paths and human-friendly formatting.</p>

<h2>Bug Fixes</h2>

<h3>Improved config override log readability</h3>
<p><small>Feb 13, 2026 · <a href="https://github.com/mavam">@mavam</a>, <a href="https://github.com/claude">@claude</a> · <a href="https://github.com/tenzir/test/pull/19">#19</a></small></p>
<p>Configuration override log messages now use relative paths and human-friendly formatting instead of absolute paths and raw Python repr output, making debug output easier to read.</p>
]]></content>
        <category label="Tenzir Test"/>
        <published>2026-02-13T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[Tenzir Test v1.3.1]]></title>
        <id>https://docs.tenzir.com/changelog/tenzir-test/v1-3-1</id>
        <link href="https://docs.tenzir.com/changelog/tenzir-test/v1-3-1"/>
        <updated>2026-02-11T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This release adds support for nested dataclass hierarchies in fixture options, enabling multi-level structured configurations in test frontmatter.]]></summary>
        <content type="html"><![CDATA[<p>This release adds support for nested dataclass hierarchies in fixture options, enabling multi-level structured configurations in test frontmatter.</p>

<h2>Features</h2>

<h3>Nested dataclass options for fixtures</h3>
<p><small>Feb 11, 2026 · <a href="https://github.com/mavam">@mavam</a>, <a href="https://github.com/claude">@claude</a> · <a href="https://github.com/tenzir/test/pull/18">#18</a></small></p>
<p>Fixture options now support nested dataclass hierarchies, allowing you to structure complex configurations with multiple levels of organization.</p>
<p>Previously, fixture options were limited to flat fields. Now you can declare nested dataclasses as field types, and tests can pass deeply structured options through frontmatter:</p>
<pre><code class="language-yaml">fixtures:
  - node:
      server:
        message:
          greeting: world
</code></pre>
<p>Type safety is preserved across all nesting levels. Optional nested fields (declared with <code>Optional[T]</code> or <code>T | None</code>) are supported, and omitted nested records use their default values. The example server fixture demonstrates this capability with a <code>message.greeting</code> field that flows through to environment variables.</p>
]]></content>
        <category label="Tenzir Test"/>
        <published>2026-02-11T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[Tenzir Platform v1.28.1]]></title>
        <id>https://docs.tenzir.com/changelog/platform/v1-28-1</id>
        <link href="https://docs.tenzir.com/changelog/platform/v1-28-1"/>
        <updated>2026-02-10T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This release upgrades pnpm to 9.15.0 in the frontend Docker image to address CVE-2024-53866.]]></summary>
        <content type="html"><![CDATA[<p>This release upgrades pnpm to 9.15.0 in the frontend Docker image to address CVE-2024-53866.</p>

<h2>Bug Fixes</h2>

<h3>Security update for pnpm CVE-2024-53866</h3>
<p><small>Feb 10, 2026 · <a href="https://github.com/lava">@lava</a></small></p>
<p>We upgraded pnpm to 9.15.0 in the frontend Docker image to address CVE-2024-53866.</p>
]]></content>
        <category label="Tenzir Platform"/>
        <published>2026-02-10T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[Tenzir Test v1.3.0]]></title>
        <id>https://docs.tenzir.com/changelog/tenzir-test/v1-3-0</id>
        <link href="https://docs.tenzir.com/changelog/tenzir-test/v1-3-0"/>
        <updated>2026-02-10T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This release adds structured configuration options for fixtures, letting tests
pass typed parameters through YAML frontmatter using frozen dataclasses.]]></summary>
        <content type="html"><![CDATA[<p>This release adds structured configuration options for fixtures, letting tests
pass typed parameters through YAML frontmatter using frozen dataclasses.</p>

<h2>Features</h2>

<h3>Structured options for fixtures</h3>
<p><small>Feb 10, 2026 · <a href="https://github.com/mavam">@mavam</a>, <a href="https://github.com/claude">@claude</a> · <a href="https://github.com/tenzir/test/pull/17">#17</a></small></p>
<p>Fixtures can now receive typed configuration options passed from test YAML files.</p>
<p>Declare options on a fixture with <code>@fixture(options=MyDataclass)</code>, where <code>MyDataclass</code> is a frozen dataclass. Tests can then provide structured options in their frontmatter using either compact syntax (for simple cases) or expanded syntax (for clarity):</p>
<pre><code class="language-yaml">fixtures:
  - node:
      tls: true
      port: 8443
  - http:
      port: 9090
</code></pre>
<p>The <code>@fixture</code> decorator validates that option keys match the dataclass fields, and the fixture retrieves its typed instance using <code>current_options(name)</code>. When options aren't provided, fixtures receive a default-constructed instance of their options class.</p>
<p>The feature maintains backward compatibility with the existing <code>fixtures: [node, http]</code> syntax for fixtures without options.</p>
]]></content>
        <category label="Tenzir Test"/>
        <published>2026-02-10T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[Tenzir Node v5.25.2]]></title>
        <id>https://docs.tenzir.com/changelog/tenzir/v5-25-2</id>
        <link href="https://docs.tenzir.com/changelog/tenzir/v5-25-2"/>
        <updated>2026-02-09T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This release fixes the sigma operator to correctly load all rule files from a directory.]]></summary>
        <content type="html"><![CDATA[<p>This release fixes the sigma operator to correctly load all rule files from a directory.</p>

<h2>Bug Fixes</h2>

<h3>Fix sigma operator directory handling to load all rules</h3>
<p><small>Feb 3, 2026 · <a href="https://github.com/mavam">@mavam</a>, <a href="https://github.com/claude">@claude</a> · <a href="https://github.com/tenzir/tenzir/pull/5715">#5715</a></small></p>
<p>The <code>sigma</code> operator now correctly loads all rules when given a directory containing multiple Sigma rule files. Previously, only the last processed rule file would be retained because the rules collection was being cleared on every recursive directory traversal.</p>
<pre><code class="language-tql">sigma "/path/to/sigma/rules"
</code></pre>
<p>All rules found in the directory and its subdirectories will now be loaded and used to match against input events.</p>
]]></content>
        <category label="Tenzir Node"/>
        <published>2026-02-09T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[Tenzir Platform v1.28.0]]></title>
        <id>https://docs.tenzir.com/changelog/platform/v1-28-0</id>
        <link href="https://docs.tenzir.com/changelog/platform/v1-28-0"/>
        <updated>2026-02-09T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This release unifies the library's Available and Installed tabs into a single view, making package management more streamlined. It also adds pipeline activity sorting, series isolation in activity charts, a line wrap toggle in the Inspector, platform version display, and a backslash escaping fix.]]></summary>
        <content type="html"><![CDATA[<p>This release unifies the library's Available and Installed tabs into a single view, making package management more streamlined. It also adds pipeline activity sorting, series isolation in activity charts, a line wrap toggle in the Inspector, platform version display, and a backslash escaping fix.</p>

<h2>Features</h2>

<h3>Isolate series in pipeline activity chart</h3>
<p><small>Feb 6, 2026 · <a href="https://github.com/gitryder">@gitryder</a> · <a href="https://github.com/tenzir/platform/pull/64">#64</a></small></p>
<p>You can now click on the Ingress or Egress legend item to isolate that series in the activity chart. Clicking again shows both series, making it easier to analyze each metric when lines overlap.</p>

<h3>Wrap lines in the Inspector</h3>
<p><small>Feb 6, 2026 · <a href="https://github.com/gitryder">@gitryder</a></small></p>
<p>We added a toggle in the Explorer table Inspector that lets you wrap lines for easier reading.</p>

<h3>View the current platform version</h3>
<p><small>Feb 3, 2026 · <a href="https://github.com/gitryder">@gitryder</a> · <a href="https://github.com/tenzir/platform/pull/42">#42</a></small></p>
<p>We now display the current platform version at the bottom of the workspace switcher dropdown,️ making it easier to always see which version you’re on.</p>

<h3>Sort pipelines by activity</h3>
<p><small>Jan 28, 2026 · <a href="https://github.com/gitryder">@gitryder</a> · <a href="https://github.com/tenzir/platform/pull/38">#38</a></small></p>
<p>We added sorting for the Live Activity column in the pipelines table, so you can easily order pipelines by their activity level.</p>

<h2>Changes</h2>

<h3>Unified library tabs</h3>
<p><small>Jan 28, 2026 · <a href="https://github.com/gitryder">@gitryder</a> · <a href="https://github.com/tenzir/platform/pull/29">#29</a></small></p>
<p>We unified the Available and Installed library tabs into a single view, so you can see which packages are installed without switching tabs. You can also uninstall packages directly from the same page.</p>

<h2>Bug Fixes</h2>

<h3>Fixed backslash escaping in TQL string rendering</h3>
<p><small>Feb 9, 2026 · <a href="https://github.com/lava">@lava</a></small></p>
<p>We fixed a bug in the Inspector where strings containing backslashes were not displayed correctly. Backslashes were not being escaped in TQL string rendering. For example, a string like <code>Hello \World\</code> was previously rendered as <code>"Hello \World\"</code> instead of <code>"Hello \\World\\"</code>. The fix ensures backslashes are properly escaped when displayed.</p>
]]></content>
        <category label="Tenzir Platform"/>
        <published>2026-02-09T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[Tenzir Test v1.2.2]]></title>
        <id>https://docs.tenzir.com/changelog/tenzir-test/v1-2-2</id>
        <link href="https://docs.tenzir.com/changelog/tenzir-test/v1-2-2"/>
        <updated>2026-02-09T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This release fixes a serialization bug where Python fixture tests with `skip`
configurations in `test.yaml` failed with a JSON serialization error.]]></summary>
        <content type="html"><![CDATA[<p>This release fixes a serialization bug where Python fixture tests with <code>skip</code>
configurations in <code>test.yaml</code> failed with a JSON serialization error.</p>

<h2>Bug Fixes</h2>

<h3>Dataclass serialization in Python fixture configurations</h3>
<p><small>Feb 9, 2026 · <a href="https://github.com/mavam">@mavam</a>, <a href="https://github.com/claude">@claude</a></small></p>
<p>Python fixture tests that use <code>skip</code> in their <code>test.yaml</code> no longer fail with
<code>Object of type SkipConfig is not JSON serializable</code>.</p>
]]></content>
        <category label="Tenzir Test"/>
        <published>2026-02-09T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[Tenzir Test v1.2.1]]></title>
        <id>https://docs.tenzir.com/changelog/tenzir-test/v1-2-1</id>
        <link href="https://docs.tenzir.com/changelog/tenzir-test/v1-2-1"/>
        <updated>2026-02-06T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This patch release improves the `-m`/`--match` flag with automatic substring matching and centralizes skip handling in the engine for more consistent test reporting.]]></summary>
        <content type="html"><![CDATA[<p>This patch release improves the <code>-m</code>/<code>--match</code> flag with automatic substring matching and centralizes skip handling in the engine for more consistent test reporting.</p>

<h2>Changes</h2>

<h3>Simpler substring matching for -m/--match flag</h3>
<p><small>Feb 6, 2026 · <a href="https://github.com/mavam">@mavam</a>, <a href="https://github.com/claude">@claude</a> · <a href="https://github.com/tenzir/test/pull/16">#16</a></small></p>
<p>The <code>-m</code>/<code>--match</code> flag now treats bare strings as substring matches automatically.</p>
<p>Previously, you had to use glob syntax like <code>tenzir-test -m '*mysql*'</code> to match tests by name. Now you can write <code>tenzir-test -m mysql</code> and it automatically matches any test path containing "mysql". This makes the common case of substring matching simpler and more intuitive.</p>
<p>Patterns that contain glob metacharacters (<code>*</code>, <code>?</code>, <code>[</code>) still use fnmatch syntax as before, so existing patterns with wildcards continue to work exactly as they did. This change is fully backwards-compatible.</p>

<h3>Centralize skip-handling logic in engine</h3>
<p><small>Feb 6, 2026 · <a href="https://github.com/mavam">@mavam</a>, <a href="https://github.com/claude">@claude</a> · <a href="https://github.com/tenzir/test/pull/15">#15</a></small></p>
<p>Skip handling now lives in the engine instead of individual runners. Skipped
tests are recorded consistently in summary stats regardless of which runner
executes them, so skip counts and paths in the test report are always accurate.</p>
<p>Previously, each runner duplicated the same skip-config parsing, which could
lead to inconsistent skip tracking. Custom runners no longer need to implement
skip logic because the engine evaluates the <code>skip</code> configuration before
dispatching to any runner.</p>
]]></content>
        <category label="Tenzir Test"/>
        <published>2026-02-06T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[Tenzir Test v1.2.0]]></title>
        <id>https://docs.tenzir.com/changelog/tenzir-test/v1-2-0</id>
        <link href="https://docs.tenzir.com/changelog/tenzir-test/v1-2-0"/>
        <updated>2026-02-06T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This release adds support for selecting tests by name using glob patterns via the new `-m`/`--match` CLI option.]]></summary>
        <content type="html"><![CDATA[<p>This release adds support for selecting tests by name using glob patterns via the new <code>-m</code>/<code>--match</code> CLI option.</p>

<h2>Features</h2>

<h3>Test selection by name pattern matching</h3>
<p><small>Feb 6, 2026 · <a href="https://github.com/mavam">@mavam</a>, <a href="https://github.com/claude">@claude</a> · <a href="https://github.com/tenzir/test/pull/13">#13</a></small></p>
<p>Select tests by relative path using the new <code>-m</code>/<code>--match</code> option with fnmatch glob patterns. You can repeat the option to match multiple patterns, and tests matching any pattern are selected. When you combine TEST paths with <code>-m</code> patterns, the framework runs only tests matching both (intersection). If a matched test belongs to a suite configured via <code>test.yaml</code>, all tests in that suite are included automatically. Empty or whitespace-only patterns are silently ignored.</p>
<p>Example: <code>tenzir-test -m '*context*' -m '*create*'</code> runs all tests whose paths contain "context" or "create" anywhere in the name.</p>
]]></content>
        <category label="Tenzir Test"/>
        <published>2026-02-06T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[Tenzir Test v1.1.1]]></title>
        <id>https://docs.tenzir.com/changelog/tenzir-test/v1-1-1</id>
        <link href="https://docs.tenzir.com/changelog/tenzir-test/v1-1-1"/>
        <updated>2026-02-06T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This release improves the CLI help text with usage examples and a link to the documentation.]]></summary>
        <content type="html"><![CDATA[<p>This release improves the CLI help text with usage examples and a link to the documentation.</p>

<h2>Changes</h2>

<h3>Improved CLI help with examples and documentation</h3>
<p><small>Feb 2, 2026 · <a href="https://github.com/mavam">@mavam</a>, <a href="https://github.com/claude">@claude</a> · <a href="https://github.com/tenzir/test/pull/12">#12</a></small></p>
<p>The help text for the <code>tenzir-test</code> command now provides more context and guidance.</p>
<p>The command description now explains the baseline comparison behavior and shows how to regenerate baselines with the <code>--update</code> flag.</p>
]]></content>
        <category label="Tenzir Test"/>
        <published>2026-02-06T00:00:00.000Z</published>
    </entry>
</feed>