Meltano v4.4.0 - Empty State and Hub Lock Refresh


Meltano published v4.4.0 on 29 September 2026. The change that matters on a production ELT schedule is state handling. A target that crashes before it emits a complete state message no longer leaves an empty payload in the state backend, so the next meltano run does not start a full refresh from that crash.

The full release notes and downloads are on the GitHub release page. v4.4.0 is a stable tag. It is not a prerelease, release candidate, beta, or alpha.

#10366 stops Meltano from persisting an empty state payload from a target. Before this tag, a crash before a complete state message still wrote that empty payload. The next meltano run started from empty state and did a full refresh sync. Nothing on the command line had requested the reload.

Meltano still stores a real state message when the target emits one. It only refuses to replace the last stored state with an empty body. The notes list no new flag and no migration of existing rows. An empty payload already written by an older build stays empty. Check the state backend before the next scheduled run if that row has to be repaired by hand.

A missing state body is no longer a reset. An intentional full refresh still has to come from the pipeline.

meltano add <plugin> --variant <variant> used to keep the old lock file when the plugin was already installed. #10352 refreshes that plugin from the Hub instead. The old lock file is not kept.

Meltano contacts the Hub when the plugin is not custom and not inherited. Custom plugins and inherited plugins stay on the local definition. For a normal Hub plugin, a second meltano add with --variant fetches the definition the Hub serves at that moment. The lock can change even when the variant name did not. Read the diff and commit it on purpose. A scheduled meltano add in a deploy job will rewrite locks unless that rewrite is the point of the job.

The Cloud hint in the next section only reports that a definition looks newer. It does not rewrite the lock. The variant form of meltano add does.

#10360 applies to sessions logged in to Meltano Cloud. meltano plugin list adds an UPDATE column. JSON output adds an update key. meltano invoke and meltano run log a warning that names the meltano add command to run when the Hub definition is newer than the locked one. The run still executes the locked plugin. Updating stays explicit.

#10354 moves those Meltano Cloud hints to the end of the command output, out of the middle of plugin rows and run logs. Sessions that are not logged in to Meltano Cloud do not get the column or the warning. A missing UPDATE column is normal for CI and for offline runs.

#10361 prints a repeated warning from a plugin only once. Later copies of the same warning are dropped, so a count of duplicate warning lines will fall.

#10111 removes null plugin_exception and stream_name keys from structured JSON log lines. Every line used to carry both keys, even when the values were null. A parser that treated a present key as an exception, or as a stream binding, was wrong on ordinary lines. The keys now appear only when they have a value. A sink schema that requires them on every record will reject the new lines. Mark the fields optional, or fill defaults in the shipper.

#10344 logs the Meltano version at INFO, so a default capture includes it. #10350 reduces debug spam while Meltano walks the extractor catalog tree. INFO output does not change because of that walk. #10292 allows Click 8.5, so resolution can select that release instead of failing a pin. The notes do not describe a flag or output change that comes with the wider pin.

Two further code changes are internal. #10368 makes PluginNotFoundError a MeltanoError. A handler for the base type now also catches a missing plugin. #10339 deactivates a previously active environment in Snowplow tests when none is selected. That is a test flake fix, not a change to how a selected environment is applied at run time.

Documentation commits in this tag do not change commands. They record the release process (#10367), a Cloud changelog entry for 28 September 2026 (#10365), four connectors the notes do not name (#10357), the open notes entry for CLI 4.3.0 (#10347), and an IP documentation refactor (#10237).