Skip to content

--timeout semantics silently changed from "compile-only" to "whole command", breaking existing runs without any error output (3.0.63 → 3.0.64) #2247

Description

@descampsk

Summary

Between 3.0.63 and 3.0.64, the --timeout flag on dataform run was redefined without a major version bump:

  • 3.0.63: "Duration to allow project compilation to complete." — only bounded the compile phase.
  • 3.0.64: "Wall-clock deadline for the entire command. When it fires, in-flight work (including any running JiT compilation worker) is cancelled." — now bounds compile and the full execution of every action in the run.

This change appears to have shipped as part of #2211 ("Integrate JiT compilation into CLI runtime"), which introduced the new per-model --jit-timeout flag alongside a silent redefinition of the pre-existing --timeout flag.

Any project that was passing --timeout to dataform run under the old (compile-only) semantics — a very reasonable thing to do, since a short timeout is sensible for compilation but not for execution — now has that same value applied as a hard deadline for the whole run. Once it fires, in-flight actions are cancelled and all not-yet-started actions are marked "skipped", with no error message printed at all: no exception, no stack trace, just a silent early exit (exit code 1) partway through the action graph.

Impact

  • Runs that used to complete now stop partway through with zero explanation, unless you already know to compare the last completed action against elapsed wall-clock time.
  • This can affect production runs equally — a scheduled dataform run --timeout 30s (fine when --timeout was compile-only) will now truncate any real run that takes longer than 30s end-to-end, silently dropping tables/assertions that were never
    reached.
  • No deprecation warning, no changelog entry we could find calling out this behavior change, and no major version bump despite it being a breaking change in flag semantics.

Steps to reproduce

  1. On 3.0.63, run a project with dataform run --timeout 30s where full execution (compile + all BigQuery jobs) takes longer than 30 seconds. Run completes successfully.
  2. Upgrade to 3.0.64 only (no other changes). Run the exact same command.
  3. Once 30s of wall-clock time elapses, the run stops: the in-flight action is dropped, all remaining pending actions are logged as Skipping dataset creation / Skipping assertion execution, and the process exits with code 1 — with no error, warning, or timeout message printed anywhere in the output.

Expected behavior

  • This should have been called out explicitly as a breaking change (changelog + version bump), since it changes what a previously-passed flag value does to already-shipped automation.
  • When the wall-clock deadline fires and cancels in-flight/pending work, the CLI should print a clear message (e.g. Run cancelled: --timeout of 30s exceeded) rather than exiting silently with skipped actions and no explanation. Right now nothing in run.ts's cancellation path surfaces this to the console — it looks like the parent CLI simply doesn't log anything when CANCEL_EVENT/onCancel fires the way it does when an action genuinely fails.

Version

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions