---
schema_version: 1
route: /t/terragrunt.md
tool: "terragrunt"
---

# sincecutoff.com /t/terragrunt — Terragrunt

- name: Terragrunt
- kind: cli
- children: none
- homepage: <https://github.com/gruntwork-io/terragrunt>

Changes to the tools coding agents drive, since a model's training cutoff, each linked to its first-party source. Check installed versions and limitations before acting; a cutoff date does not establish what a model knows.
Original editorial content: [Apache 2.0](https://sincecutoff.com/v1/data-license.txt), by [0xPatrick](https://0xpatrick.dev). Preserve applicable license and [NOTICE](https://sincecutoff.com/notice.txt) attribution when redistributing. Third-party source text and examples retain their own rights. [License scope and attribution](https://sincecutoff.com/v1/license.json).
To stay current, read the changes feed: [`/v1/changes.md?tool=terragrunt`](https://sincecutoff.com/v1/changes.md?tool=terragrunt) (or `.json`), adding `since=YYYY-MM-DD` for your training cutoff. Entries for registered children are included; the registry itself is `/v1/tools.json`. How to page and save your place: [llms.txt](https://sincecutoff.com/llms.txt).

### terragrunt azure-backend assigns Azure blob data role during bootstrap (2026-09-14)
- slug: terragrunt-azure-backend-assigns-azure-blob-data-role-during-bootstrap-4b5e0b82acd6
- score: 0.94

How to use it:

When bootstrapping an Azure `azurerm` backend with Azure AD authentication, enable the `azure-backend` experiment and set `assign_blob_data_role = true` to grant Storage Blob Data Contributor to Terragrunt’s authenticated identity. Set `principal_id` to grant the role to a different identity.

Examples:

```
terragrunt --experiment azure-backend backend bootstrap
```

```
remote_state {
  backend = "azurerm"
  config = {
    storage_account_name  = "<storage-account>"
    container_name        = "<container>"
    key                   = "<state-key>"
    resource_group_name   = "<resource-group>"
    use_azuread_auth      = true
    assign_blob_data_role = true
    # Optional: principal_id = "<entra-object-id>"
  }
}
```

- why_it_matters: Bootstrap an Azure remote state backend with an Azure AD identity that needs access to the state blobs.
- before: An identity could bootstrap the backend, then require someone to grant the blob data-plane role manually before it could read state.
- sources: <https://github.com/gruntwork-io/terragrunt/releases/tag/v1.1.5>, <https://docs.terragrunt.com/features/units/state-backend/>
- gotchas: "Version: v1.1.5"; "Availability: Requires the `azure-backend` experiment."; "--experiment azure-backend (required): Enables Terragrunt’s experimental Azure backend bootstrap support."; "backend = \"azurerm\" (required): Selects the Azure Storage backend."; "storage_account_name (required): Names the Azure storage account for state."; "container_name (required): Names the blob container for state."; "key (required): Specifies the state blob key."; "resource_group_name (required): Names the resource group for the storage account."; "use_azuread_auth (required): Enables Azure AD authentication for the backend."; "assign_blob_data_role (required): When `true`, bootstrap assigns Storage Blob Data Contributor on the storage account. Opt-in; assignment creation requires `Microsoft.Authorization/roleAssignments/write`."; "principal_id: Microsoft Entra object ID receiving the role when `assign_blob_data_role` is true; defaults to the caller resolved from the access token."; "Prerequisite: Use the `azure-backend` experiment for Azure backend bootstrap."; "Prerequisite: Role assignment creation requires `Microsoft.Authorization/roleAssignments/write`; the documented roles with this permission are Owner and User Access Administrator, not Contributor."; "Prerequisite: With Azure AD authentication, reading and writing state requires Storage Blob Data Contributor on the storage account."; "The setting is opt-in."; "Creating a role assignment requires `Microsoft.Authorization/roleAssignments/write`, which Contributor does not include."; "Reruns need only read permission on role assignments."; "The authenticated identity is resolved from the access token Terragrunt already holds; it works for identities that cannot read Microsoft Entra."

### terragrunt block-iteration expands dependency, unit, and stack blocks (2026-09-14)
- slug: terragrunt-block-iteration-expands-dependency-unit-and-stack-blocks-90536fca80f9
- score: 0.94

How to use it:

When a stack configuration needs multiple units from one block, enable the `block-iteration` experiment and add an `expansion` block with `for_each` or `count`; give each unit a distinct path and address generated elements by key or index.

Examples:

```
unit "aurora" {
  expansion {
    for_each = toset(["web", "api"])
  }
  source = "../units/app"
  path   = "aurora/${each.key}"
  values = { role = each.key }
}
```

- why_it_matters: Generate multiple Terragrunt dependencies, units, or stacks from one block in a stack configuration.
- sources: <https://github.com/gruntwork-io/terragrunt/releases/tag/v1.1.5>, <https://docs.terragrunt.com/reference/hcl/blocks/>
- gotchas: "Version: v1.1.5"; "Availability: The `expansion` blocks and `enabled` attributes on `unit` and `stack` require the `block-iteration` experiment."; "expansion.for_each: Set, map, or object to iterate; each instance exposes `each.key` and `each.value`. Set exactly one of `for_each` and `count`."; "expansion.count: Non-negative whole number of instances; each instance exposes zero-based `count.index`. Set exactly one of `count` and `for_each`."; "unit.path (required): Relative generated path; each expanded unit must have a distinct path."; "unit.enabled: Defaults to true; false skips the unit during stack generation and omits it from `terragrunt stack output`."; "Prerequisite: Enable the `block-iteration` experiment with `--experiment block-iteration` or `TG_EXPERIMENT=block-iteration`; `expansion` and `unit.enabled` are gated by the experiment."; "Adding an expansion changes the block's address; references and `stack output` scripts need updating by hand."; "Shrinking a `for_each` or lowering a `count` removes addresses; Terragrunt has no `moved` equivalent, so leftover state at a removed address has to be destroyed deliberately."

### terragrunt bounded-discovery constrains filter graph traversal (2026-08-13)
- slug: terragrunt-bounded-discovery-constrains-filter-graph-traversal-393ec84e8052
- score: 0.98

How to use it:

When dependency-filter traversal in an isolated monorepo could reach sibling environments, enable `bounded-discovery` and constrain the graph search to the intended environment. Use `--discovery-boundary` for the command or an inline `(dir)` operand for one filter expression; the directory must exist.

Examples:

```
cd <environment-dir>
terragrunt run --all plan --experiment bounded-discovery --filter '...{<unit>}' --discovery-boundary .
```

```
cd <environment-dir>
terragrunt run --all plan --experiment bounded-discovery --filter '(.)...{<unit>}'
```

```
terragrunt find --experiment bounded-discovery --filter '{<unit-path>}...' --discovery-boundary <boundary-dir>
```

- why_it_matters: When traversing dependency filters in a monorepo with isolated environments, bound discovery to the intended environment so sibling configurations are not read or run.
- before: Without bounded discovery, dependent filters searched up to the Git repository root and dependency filters followed declared paths; Terragrunt read and parsed configurations it touched.
- sources: <https://github.com/gruntwork-io/terragrunt/releases/tag/v1.1.3>, <https://docs.terragrunt.com/reference/cli/commands/run/>
- gotchas: "Version: v1.1.3"; "Availability: Experiment"; "--experiment bounded-discovery (required): Enables the bounded-discovery experiment in v1.1.3."; "--filter (required): Filter expression for the units to traverse; `...{unit}` selects dependents and `{unit}...` selects dependencies."; "--discovery-boundary: Sets the directory boundary for traversal across filter expressions in the command. It must be an existing directory; relative paths resolve against the working directory. Dependent traversal requires the boundary to be the working directory or one of its parents; dependency-only traversal permits any directory, including one below the working directory."; "TG_DISCOVERY_BOUNDARY: Environment-variable alternative to `--discovery-boundary` for setting the run’s directory boundary."; "(dir) inline boundary operand: Bounds one filter expression and overrides the command boundary for that expression; the directory must exist. Parentheses are reserved for this operand, so wrap literal names or paths containing parentheses in braces."; "--all: Runs the command across discovered units."; "Prerequisite: Use Terragrunt v1.1.3 or later with the `bounded-discovery` experiment enabled using `--experiment bounded-discovery`."; "Prerequisite: The boundary must be an existing directory. Relative boundary paths resolve against the working directory."; "Boundary must be an existing directory."; "Relative boundary paths resolve against the working directory."; "Dependent traversal searches upward from the working directory; filters using it require the boundary to be the working directory or one of its parents."; "Dependency traversal follows declared paths from matched units; dependency-only filters accept any directory, including one below the working directory."; "Any configuration resolving outside the boundary, whether dependent or dependency, is not read, parsed, or returned; `find` does not list it and `run --all` does not run it."; "Reserving `(` and `)` for the boundary operand changes how `--filter` reads those characters even when the experiment is disabled; an expression such as `1...(foo | bar)` is now rejected as a malformed boundary. Wrap names or paths containing parentheses in braces to keep them literal."; "Docs conflict: Current official experiment documentation describes behavior after the experiment completed: the experiment flag is no longer needed. It also says the boundary limits discovery traversal rather than filtering results, and that dependencies outside the boundary can still be read and parsed. These statements differ from the v1.1.3 release note; use the release-note behavior for v1.1.3. https://docs.terragrunt.com/reference/experiments/active/"

### terragrunt catalog supports non-interactive JSONL and Markdown output (2026-08-13)
- slug: terragrunt-catalog-supports-non-interactive-jsonl-and-markdown-output-72bb8dfa88b2
- score: 0.96

How to use it:

When catalog results must be read without a terminal or saved for review, enable the `catalog-format` experiment and run `terragrunt catalog --experiment=catalog-format --format=jsonl` for JSON Lines or `--format=md` for Markdown; use `jq` to project or remove JSONL fields and check Markdown’s closing table and count for completeness.

Examples:

```
terragrunt catalog --experiment=catalog-format --format=jsonl | jq -c '{kind, title, component_source}'
```

```
terragrunt catalog --experiment=catalog-format --format=jsonl | jq -c 'del(.doc)'
```

```
terragrunt catalog --experiment=catalog-format --format=md > catalog.md
```

- why_it_matters: When inspecting catalog results without a terminal or saving them for review, enable `catalog-format` and select JSON Lines for processing or Markdown for reading.
- before: The catalog command used a terminal UI and required a terminal; it could not be read in a non-terminal environment.
- sources: <https://github.com/gruntwork-io/terragrunt/releases/tag/v1.1.3>, <https://docs.terragrunt.com/features/catalog/non-interactive/>
- gotchas: "Version: v1.1.3"; "Availability: Experiment"; "--experiment=catalog-format (required): Enables the experiment gating `--format` in v1.1.3. It can also be enabled with `TG_EXPERIMENT=catalog-format`."; "--format=jsonl (required): Writes one JSON object per catalog entry to standard output."; "--format=md (required): Writes one Markdown document with a section per entry; the final table and discovered count indicate completeness."; "jq projection `{kind, title, component_source}`: Selects those fields from each JSONL entry."; "jq deletion `del(.doc)`: Drops the README body from each JSONL entry; `doc` can contain substantial data."; "Prerequisite: Terragrunt `catalog` command available; `--format` requires the `catalog-format` experiment in v1.1.3."; "Prerequisite: Install `jq` to run the documented JSONL filtering examples."; "`--format=tui` remains the default and leaves the terminal user interface as it was."; "JSONL emits one object per line in discovery order, which interleaves repositories and differs between runs."; "Entries stream as discovered; a reader stopping early ends the JSONL command quietly."; "Every JSONL entry includes the complete component README in the `doc` field."; "Markdown entries stream as discovered; READMEs are fenced, and the closing table and count indicate what was discovered and whether the document was cut short."; "Docs conflict: Current active-experiments documentation describes behavior after the experiment completed in v1.2.0: `--format` is available by default and piping `catalog` defaults to JSONL. That newer behavior does not apply to the v1.1.3 instructions."

### terragrunt run can skip dependency output resolution (2026-08-13)
- slug: terragrunt-run-can-skip-dependency-output-resolution-91c0c53a0e8a
- score: 0.91

How to use it:

When you need to initialize without resolving dependency outputs, set `TG_EXPERIMENT=optional-dependency-outputs` and run `terragrunt run --no-dependency-outputs -- init`. The flag requires the experiment; without it, the command returns an error.

Examples:

```
TG_EXPERIMENT=optional-dependency-outputs terragrunt run --no-dependency-outputs -- init
```

- why_it_matters: When running initialization without resolving dependency outputs, enable the experiment and skip output resolution for the run.
- before: Use `skip_outputs = true` on individual `dependency` blocks to skip their output resolution.
- sources: <https://github.com/gruntwork-io/terragrunt/releases/tag/v1.1.3>
- gotchas: "Version: v1.1.3"; "Availability: Experiment"; "TG_EXPERIMENT=optional-dependency-outputs (required): Enables the experiment required for `--no-dependency-outputs`."; "--no-dependency-outputs (required): Skips all dependency output resolution globally."; "init (required): Command passed through to run after `--`."; "Using `--no-dependency-outputs` without enabling the experiment returns an error."

### terragrunt azure-backend experiment manages azurerm remote state (2026-07-29)
- slug: terragrunt-azure-backend-experiment-manages-azurerm-remote-state-55d6a75f59d0
- score: 0.93

How to use it:

When an Azure Storage remote-state configuration uses `azurerm`, enable the `azure-backend` experiment and run `terragrunt --experiment azure-backend run -- plan` to manage backend resources and state blobs. [Release v1.1.2](https://github.com/gruntwork-io/terragrunt/releases/tag/v1.1.2)

Examples:

```
terragrunt --experiment azure-backend run -- plan
```

- why_it_matters: When maintaining a Terragrunt configuration that uses Azure Storage remote state, enable Terragrunt management of its backend resources and state blobs.
- sources: <https://github.com/gruntwork-io/terragrunt/releases/tag/v1.1.2>
- gotchas: "Version: v1.1.2"; "Availability: opt-in while the experiment is active"; "--experiment azure-backend (required): Enables the Azure Storage (`azurerm`) remote-state experiment."; "run -- plan (required): Runs the underlying `plan` command through Terragrunt."; "location: Terragrunt-only Azure backend setting; release notes do not document its value semantics."; "storage account SKU options: Terragrunt-only settings; specific option names and semantics are not documented in the release notes."; "skip_* flags: Terragrunt-only flags; specific names and semantics are not documented in the release notes."; "enable_soft_delete: Terragrunt-only Azure backend setting; release notes do not document allowed values or details."; "soft_delete_retention_days: Terragrunt-only Azure backend setting; release notes do not document allowed values or range."; "msi_resource_id: Terragrunt-only setting that also selects the managed identity used for delete and migrate operations."; "Prerequisite: Enable the `azure-backend` experiment for this feature."; "Prerequisite: Use an Azure Storage `azurerm` remote-state backend."; "The `azure-backend` experiment must be enabled."; "State blob migration is within the same storage account."

### terragrunt oci experiment downloads modules from OCI registries (2026-07-29)
- slug: terragrunt-oci-experiment-downloads-modules-from-oci-registries-cbbfa977386f
- score: 0.95

How to use it:

When using Terragrunt v1.1.2 to fetch an OpenTofu module from an OCI registry, enable the `oci` experiment and set `terraform.source` to an `oci://` URL. Pin it with `tag` or `digest`; omitting both selects `latest`.

Examples:

```
terraform {
  source = "oci://<registry>/<repository>/<module>?tag=<tag>"
}
```

```
terragrunt --experiment oci run -- init
```

- why_it_matters: When configuring an OpenTofu module from an OCI registry, set its OCI source in the Terragrunt configuration and fetch it with the `oci` experiment enabled.
- sources: <https://github.com/gruntwork-io/terragrunt/releases/tag/v1.1.2>, <https://docs.terragrunt.com/reference/experiments/active/>
- gotchas: "Version: v1.1.2"; "Availability: experiment"; "`--experiment oci` (required): Enables the OCI experiment; v1.1.2 leaves `oci://` sources unsupported when it is disabled."; "`terraform.source` (required): Accepts an `oci://` source URL."; "`tag`: Pins the artifact to a tag. Use `tag` or `digest`; the release note does not say they may be combined."; "`digest`: Pins the artifact to a digest. Use `tag` or `digest`; the release note does not say they may be combined."; "`//subdir` selector: Selects a subdirectory within the artifact."; "`TG_TMP_OCI_*`: Interim environment-variable family for static OCI credentials; the release note does not document individual variable names or values."; "`TG_TMP_OCI_REGISTRY`: Limits static credentials to one registry; without it, configured credentials may be offered to any registry contacted by the process."; "Prerequisite: Use Terragrunt v1.1.2 or later for the described change; enable the `oci` experiment for the source to work."; "Prerequisite: For authentication, v1.1.2 supports static credentials through interim environment variables and read-only discovery of Docker and containers auth files. Credential helpers are not invoked; a registry needing per-run token minting requires an externally obtained login in an ambient file."; "When the experiment is disabled, `oci://` sources remain unsupported."; "Static credentials can be limited to one registry with `TG_TMP_OCI_REGISTRY`; without it, configured credentials may be offered to any registry the process contacts."; "Credential helpers are not invoked yet; registries that need per-run token minting only work while an externally obtained login is present in an ambient file."; "Artifacts follow the publishing contract OpenTofu 1.10 consumes natively."; "Docs conflict: Current active-experiment docs describe later behavior: OCI sources work by default, and configured credential helpers may be invoked. Those statements differ from v1.1.2; the release-specific behavior above follows the v1.1.2 release note."

### terragrunt `terraform.version` resolves `tfr://` modules from a constraint (2026-07-14)
- slug: terragrunt-terraform-version-resolves-tfr-modules-from-a-constraint-f3a065c959c3
- score: 0.93

How to use it:

For a `tfr://` registry module in Terragrunt v1.1.1, enable the `version-attribute` experiment and set `version` to a constraint; Terragrunt resolves the highest published match before downloading. Do not also set `?version=` on that source.

Examples:

```
terraform {
  source  = "tfr://registry.opentofu.org/terraform-aws-modules/vpc/aws"
  version = "~> 3.3"
}
```

```
terragrunt --experiment version-attribute run -- init
```

- why_it_matters: Pin a registry module in a Terragrunt configuration using a version constraint.
- sources: <https://github.com/gruntwork-io/terragrunt/releases/tag/v1.1.1>, <https://docs.terragrunt.com/reference/hcl/blocks/>
- gotchas: "Version: v1.1.1"; "Availability: Experimental; gated by the `version-attribute` experiment."; "--experiment version-attribute (required): Enables the `version` attribute experiment in v1.1.1."; "terraform.source (required): The module source; the `version` attribute applies only to `tfr://` sources."; "terraform.version (required): A version constraint for resolving a `tfr://` module. Do not combine it with inline `?version=` on the same source; the docs say this combination is an error."; "Prerequisite: Use Terragrunt v1.1.1 or later; in v1.1.1 the `version-attribute` experiment must be enabled with `--experiment version-attribute` or `TG_EXPERIMENT=version-attribute`."; "The `version` attribute applies to `tfr://` sources only."; "It cannot be combined with an inline `?version=` on the same source."; "Docs conflict: The currently published docs describe later behavior: they say the experiment is no longer needed by default and is scheduled to complete in v1.2.0. The v1.1.1 release note says the flag is required, so use the release-note behavior for v1.1.1."

### terragrunt CAS deduplicates sources and controls generated and cached content (2026-07-01)
- slug: terragrunt-cas-deduplicates-sources-and-controls-generated-and-cached-content-b102e36ebf82
- score: 0.92

How to use it:

When generating stacks from a catalog with relative source paths, set `update_source_with_cas = true` on the relevant `unit`, `stack`, or `terraform` block; `terragrunt stack generate` rewrites the path to a CAS reference. To edit fetched CAS content in `.terragrunt-cache`, set `mutable = true` on the applicable block; otherwise CAS materializes content read-only.

Examples:

```
terragrunt run --all --no-cas -- plan
```

```
unit "<name>" {\n  source = "<relative-source>"\n  path = "<stack-path>"\n  update_source_with_cas = true\n}\n\nterragrunt stack generate
```

```
terraform {\n  source = "<source>"\n  mutable = true\n}
```

- why_it_matters: Generate portable stacks from relative sources or make cached source files editable while reusing downloaded content across configurations.
- before: Before Terragrunt 1.1, catalog units used remote Git URLs with a `?ref=` even for modules in the same repository; plain relative paths did not resolve from generated locations.
- sources: <https://github.com/gruntwork-io/terragrunt/releases/tag/v1.1.0>, <https://docs.terragrunt.com/features/caching/cas/>, <https://docs.terragrunt.com/reference/hcl/blocks/>, <https://github.com/gruntwork-io/terragrunt-infrastructure-catalog-example/blob/main/docs/1.1-migration-guide.md>
- gotchas: "Version: v1.1.0"; "--no-cas: Disables CAS for the run; incompatible with `update_source_with_cas = true`."; "TG_NO_CAS: Set to `true` to opt out of CAS for a run, as stated in the v1.1.0 release note."; "update_source_with_cas: On a `unit`, `stack`, or `terraform` block, rewrites a relative literal source to a CAS reference during stack generation; requires CAS enabled."; "mutable: On a `terraform` block, copies CAS-fetched content into an editable working tree. Defaults to `false`; takes effect only for CAS-fetched sources."; "source (required): The source to fetch. For `update_source_with_cas`, it must be a relative literal string; interpolation, function calls, and references cause stack generation to fail."; "Prerequisite: The card’s relative-source stack-generation task requires Terragrunt 1.1 or newer."; "`update_source_with_cas` applies to relative sources on a `unit`, `stack`, or `terraform` block."; "`mutable = true` uses extra I/O and disk space; default CAS hard links are read-only."

### terragrunt catalog discovers and scaffolds catalog components in a TUI (2026-07-01)
- slug: terragrunt-catalog-discovers-and-scaffolds-catalog-components-in-a-tui-54568cc48ac5
- score: 0.93

How to use it:

When you want to browse catalog components and scaffold one into a repository, run `terragrunt catalog`, select the component, and press `s` to open the interactive form. The form collects values and scaffolds the component into the working directory.

Examples:

```
terragrunt catalog
```

```
# In the catalog TUI: select a component, then press s
```

- why_it_matters: Browse catalog components and scaffold a selected component into a repository.
- before: The redesigned catalog was previously gated behind the `catalog-redesign` experiment; the release note says the redesign is now the default.
- sources: <https://github.com/gruntwork-io/terragrunt/releases/tag/v1.1.0>, <https://docs.terragrunt.com/reference/cli/commands/catalog/>, <https://docs.terragrunt.com/features/catalog/>
- gotchas: "Version: v1.1.0"; "s: Opens the scaffolding form for the selected component in the catalog TUI."; "Scaffolding is interactive."; "Docs conflict: The current catalog feature page says to press uppercase `S` on a selected module, while the v1.1.0 release note specifies lowercase `s` for a component. Follow the release note's lowercase key."

### terragrunt run can skip auth-provider commands during discovery (2026-07-01)
- slug: terragrunt-run-can-skip-auth-provider-commands-during-discovery-a6c6c1c4df5e
- score: 0.91

How to use it:

When configuration parsing resolves without credentials, run the change-based selection with `--no-discovery-auth-provider-cmd` to skip auth-provider invocations during discovery; auth still runs for executing units. Do not enable it if discovery parsing needs credentials, and `--experiment opt-out-auth` is not required in v1.1.0.

Examples:

```
terragrunt run --all --no-discovery-auth-provider-cmd --queue-include-units-reading=./changed-file.txt -- plan
```

- why_it_matters: Run a change-based unit selection when parsing configuration does not need credentials.
- before: Terragrunt invoked `--auth-provider-cmd` once for every discovered unit by default. The flag was previously gated behind the `opt-out-auth` experiment.
- sources: <https://github.com/gruntwork-io/terragrunt/releases/tag/v1.1.0>, <https://docs.terragrunt.com/reference/cli/commands/run/>
- gotchas: "Version: v1.1.0"; "--all (required): Run the command against all discovered units, subject to selection options."; "--no-discovery-auth-provider-cmd: Skip `--auth-provider-cmd` invocations during discovery; `TG_NO_DISCOVERY_AUTH_PROVIDER_CMD` is the corresponding environment variable."; "--queue-include-units-reading (required): Limit `run --all` to units that read the specified file via an HCL function or include. Takes a string; `TG_QUEUE_INCLUDE_UNITS_READING` is the corresponding environment variable."; "-- (required): Separates Terragrunt arguments from the underlying command and its arguments; `plan` is the command passed through here."; "Prerequisite: Use the discovery skip only when parsing resolves without credentials; credential-dependent parsing, such as via `get_aws_account_id()`, can fail when enabled."; "Use only when parsing resolves without credentials; configuration that depends on values from `--auth-provider-cmd` during discovery will fail to parse when enabled."

### terragrunt stack dependencies and autoinclude are enabled by default (2026-07-01)
- slug: terragrunt-stack-dependencies-and-autoinclude-are-enabled-by-default-da8a525d02bc
- score: 0.96

How to use it:

When a stack’s units need dependencies or shared parent-folder configuration, declare unit dependencies in `autoinclude` using generated component paths, and add an `include` block to `terragrunt.stack.hcl`. In Terragrunt v1.1.0, these features are enabled by default; no experiment flag is required.

Examples:

```
unit "vpc" {
  source = "<catalog-source>/units/vpc"
  path   = "vpc"
}

unit "app" {
  source = "<catalog-source>/units/app"
  path   = "app"

  autoinclude {
    dependency "vpc" {
      config_path = unit.vpc.path
    }
    inputs = {
      vpc_id = dependency.vpc.outputs.vpc_id
    }
  }
}
```

```
include "shared" {
  path = "../shared.stack.hcl"
}

unit "app" {
  source = "<catalog-source>/units/app"
  path   = "app"
}
```

- why_it_matters: Wire units in a generated stack to their dependencies and add shared configuration to stack definitions.
- before: Before stack dependencies, users defined dependency blocks in catalog units and passed dependency paths through `values`.
- sources: <https://github.com/gruntwork-io/terragrunt/releases/tag/v1.1.0>, <https://docs.terragrunt.com/reference/hcl/blocks/>
- gotchas: "Version: v1.1.0"; "unit.<name>.source (required): Source for the unit configuration."; "unit.<name>.path (required): Relative generated path for the unit; exposed as `unit.<name>.path` to sibling component references."; "autoinclude: Unlabeled block inside a unit or stack; its body is injected into that generated component’s configuration. It takes no arguments. For unit dependencies, declare `dependency` and `inputs` here."; "dependency \"<name>\".config_path (required): Path to the dependency unit or stack. It can reference a sibling’s generated path, such as `unit.vpc.path` or `stack.network.path`."; "inputs: Map of inputs; the example reads a dependency output with `dependency.vpc.outputs.vpc_id`."; "include \"<label>\".path (required): Path to the included stack file, relative to the directory of the stack file declaring the include. The included file may declare unit and stack blocks."; "Prerequisite: The `autoinclude` feature is for HCL `terragrunt.stack.hcl` files; JSON stack files declaring it fail generation."; "Prerequisite: In v1.1.0, the `stack-dependencies` experiment is no longer required; the release says the feature is enabled by default."; "Stack dependencies are limited to units depending on stacks; stacks cannot depend on stacks or units."

### Terragrunt hooks receive additional TG_CTX_* environment variables (2026-06-10)
- slug: terragrunt-hooks-receive-additional-tg-ctx-environment-variables-6c8e1faad372
- score: 0.92

How to use it:

When a shared hook script needs to identify its lifecycle phase or access the unit’s source and config directory, enable `hook-context-env` for the Terragrunt run. Read `TG_CTX_HOOK_TYPE`, `TG_CTX_SOURCE`, and `TG_CTX_TERRAGRUNT_DIR` in the hook script.

Examples:

```
terragrunt run --all --experiment hook-context-env -- apply
```

- why_it_matters: When sharing a hook script across Terragrunt lifecycle phases, read the added context variables inside the hook to identify its phase and access the unit source and config directory.
- sources: <https://github.com/gruntwork-io/terragrunt/releases/tag/v1.0.8>, <https://docs.terragrunt.com/reference/experiments/active/>, <https://docs.terragrunt.com/reference/cli/commands/run/>
- gotchas: "Version: v1.0.8"; "Availability: experimental"; "--experiment hook-context-env (required): Enables the `hook-context-env` experiment for the run."; "--all (required): Runs the specified OpenTofu/Terraform command across units in the current stack."; "TG_CTX_HOOK_TYPE: Identifies the hook lifecycle phase: `before_hook`, `after_hook`, or `error_hook`."; "TG_CTX_SOURCE: Resolved source URL: CLI `--source` override, otherwise evaluated `terraform.source` with `--source-map` applied, otherwise `.`."; "TG_CTX_TERRAGRUNT_DIR: Directory containing the current Terragrunt config; equivalent to `get_terragrunt_dir()`."; "Prerequisite: Enable the `hook-context-env` experiment for the run; it adds the variables to every `before_hook`, `after_hook`, and `error_hook`."; "The variables are surfaced to every `before_hook`, `after_hook`, and `error_hook`."; "`TG_CTX_HOOK_TYPE` identifies `before_hook`, `after_hook`, or `error_hook`."; "`TG_CTX_SOURCE` is the resolved terraform source URL: CLI `--source` override, otherwise evaluated `terraform.source` with source-map applied, otherwise `.`."; "`TG_CTX_TERRAGRUNT_DIR` is the directory of the current Terragrunt config."

### terragrunt tfr:// sources resolve an omitted version to the latest stable release (2026-06-01)
- slug: terragrunt-tfr-sources-resolve-an-omitted-version-to-the-latest-stable-release-43e217cf4827
- score: 0.97

How to use it:

When referencing a registry module without a version constraint, omit `version` from the `tfr://` source URL; Terragrunt resolves the latest stable version. Add `?version=<version>` to pin a version or select a prerelease.

Examples:

```
terraform {
  source = "tfr:///terraform-aws-modules/vpc/aws"
}
```

- why_it_matters: Reference a registry module without a version constraint in a Terragrunt source URL.
- sources: <https://github.com/gruntwork-io/terragrunt/releases/tag/v1.0.7>
- gotchas: "Version: v1.0.7"; "version (query parameter): Specifies the module version. Omit it to resolve the latest stable version; set it with `?version=<version>` to pin a version or opt into a prerelease."; "Prereleases are excluded from unpinned resolution; if a registry publishes `4.0.0-rc1` alongside `3.3.0`, resolution pins to `3.3.0`."

### terragrunt deep-merge experiment adds deep_merge HCL function (2026-05-25)
- slug: terragrunt-deep-merge-experiment-adds-deep-merge-hcl-function-282023bf14f0
- score: 0.98

How to use it:

When composing inputs from multiple JSON, YAML, or HCL-derived maps, enable the `deep-merge` experiment and call `deep_merge` with positional map/object arguments; later values override overlapping keys, nested maps merge recursively, lists append, and `null` arguments are ignored.

Examples:

```
locals {
  config_json_files = sort(fileset(get_terragrunt_dir(), "*.json"))
  config = deep_merge([
    for file in local.config_json_files :
    jsondecode(file("${get_terragrunt_dir()}/${file}"))
  ]...)
}

inputs = local.config
```

```
terragrunt run --all --experiment deep-merge -- plan
```

- why_it_matters: Compose Terragrunt inputs from multiple decoded JSON, YAML, or HCL-derived maps.
- sources: <https://github.com/gruntwork-io/terragrunt/releases/tag/v1.0.6>, <https://docs.terragrunt.com/reference/hcl/functions/>, <https://docs.terragrunt.com/reference/experiments/active/>
- gotchas: "Version: 1.0.6"; "Availability: Experimental; requires enabling the `deep-merge` experiment."; "deep_merge(map1, map2, ...) (required): Positional map/object arguments to combine; later arguments override overlapping keys, nested maps merge recursively, lists append, and null arguments are ignored."; "--experiment deep-merge (required): Enables the experiment required to call `deep_merge`; the docs' CLI example enables it for `terragrunt run`."; "Prerequisite: Enable the `deep-merge` experiment; calling `deep_merge` without it returns an error."; "Calling `deep_merge` without enabling the `deep-merge` experiment returns an error."

### Terragrunt CAS `mutable` attribute for editable fetched sources (2026-05-18)
- slug: terragrunt-cas-mutable-attribute-for-editable-fetched-sources-d475f3198fa9
- score: 0.94

How to use it:

When a source is fetched through CAS and you need to edit its materialized files, set `mutable = true` in the applicable `terraform`, `unit`, or `stack` block. This copies files into the block’s working directory instead of hardlinking them from CAS.

Examples:

```
terraform {
  source  = "git::https://github.com/acme/infrastructure-modules.git//vpc?ref=v1.0.0"
  mutable = true
}
```

- why_it_matters: When you need to edit source files materialized through CAS, configure the applicable block as mutable.
- sources: <https://github.com/gruntwork-io/terragrunt/releases/tag/v1.0.5>
- gotchas: "Version: v1.0.5"; "mutable: Boolean on `terraform`, `unit`, or `stack`; `true` copies CAS-fetched files so they are editable. Defaults to `false`, which hardlinks files and marks them read-only."; "Prerequisite: The source must be fetched through CAS; `mutable` has no effect with the standard download path."; "The default is `false`; files are materialized read-only so an accidental edit cannot reach back into the shared CAS store."; "The attribute is orthogonal to `update_source_with_cas`."; "The attribute has no effect when content is fetched through the standard download path, which already produces an independent copy."

### terragrunt CAS stack components accept local filesystem sources (2026-05-07)
- slug: terragrunt-cas-stack-components-accept-local-filesystem-sources-98e2e018ca2b
- score: 0.95

How to use it:

When iterating on a local catalog with CAS-backed stack generation, set the consumer stack’s `source` to the local catalog subdirectory and run `terragrunt stack generate`; keep `update_source_with_cas = true` in the catalog’s nested source blocks. The local catalog is copied to a temporary directory for rewriting, leaving the original untouched.

Examples:

```
stack "service" {
  source = "../catalog//stacks/service"
  path = "service"
}

terragrunt stack generate
```

```
unit "service" {
  source = "../..//units/my-service"
  update_source_with_cas = true
  path = "service"
}
```

- why_it_matters: Iterate on a stack catalog in a local checkout before tagging a release.
- before: Use a remote Git URL as the `source` for CAS-backed stack generation.
- sources: <https://github.com/gruntwork-io/terragrunt/releases/tag/v1.0.4>, <https://docs.terragrunt.com/features/stacks/explicit/>, <https://docs.terragrunt.com/features/caching/cas/>
- gotchas: "Version: v1.0.4"; "stack.<name>.source (required): Catalog source; accepts a local filesystem path, including a `//` subdirectory suffix."; "stack.<name>.path (required): Generated path for the component."; "unit.<name>.source (required): Relative path to the component source in the catalog."; "unit.<name>.update_source_with_cas: Set to `true` to rewrite relative source paths to CAS references; requires CAS enabled. Must be set in catalog files, not by consumers."; "Prerequisite: Do not set `--no-cas` when using `update_source_with_cas = true`."; "Prerequisite: Sources using `update_source_with_cas` must be relative paths within the same repository."; "This applies to CAS-backed stack generation."; "The local source path is a directory copied to a temporary directory; the original directory is left untouched."

### terragrunt catalog discovers, copies, and scaffolds unit and stack components (2026-05-07)
- slug: terragrunt-catalog-discovers-copies-and-scaffolds-unit-and-stack-components-674296396342
- score: 0.93

How to use it:

When you want to add a catalog unit or stack to your working directory, run `terragrunt catalog`, select it, and choose the copy action. After the TUI exits, use the printed output directory and follow-up command; required `values.<name>` references get `"TODO"` placeholders, while optional `try(...)` references get their literal fallback defaults.

Examples:

```
terragrunt catalog
```

- why_it_matters: Copy a unit or stack from the catalog into a working directory and prepare its referenced values.
- sources: <https://github.com/gruntwork-io/terragrunt/releases/tag/v1.0.4>
- gotchas: "Version: v1.0.4"; "tab: Cycle forward through catalog tabs."; "shift+tab: Cycle backward through catalog tabs."; "values.<name>: A referenced value outside `try(...)` is listed as required and gets a `\"TODO\"` placeholder in the sibling `terragrunt.values.hcl` stub."; "try(...)` fallback: A value referenced through `try(...)` is listed as optional and gets the literal fallback default in the stub."; "An existing `terragrunt.values.hcl` is left alone."; "A directory that matches multiple component kinds is classified by precedence: template, stack, unit, module."

### terragrunt CAS integrates with stacks through update_source_with_cas (2026-04-27)
- slug: terragrunt-cas-integrates-with-stacks-through-update-source-with-cas-76df6b7a5d14
- score: 0.96

How to use it:

When a catalog unit uses a relative source path, set `update_source_with_cas = true` and generate the stack with CAS enabled; Terragrunt rewrites the source to a `cas::` reference. The v1.0.3 release note says to enable the `cas` experiment, but current documentation no longer lists CAS as an experiment.

Examples:

```
unit "service" {
  source = "../..//units/my-service"
  update_source_with_cas = true
  path = "service"
}

terragrunt stack generate --experiment cas
```

- why_it_matters: Generate a stack from catalog units whose Terraform source paths are relative to the catalog repository.
- before: Without CAS, catalog authors used remote Git URLs and threaded the reference through `values` expressions.
- sources: <https://github.com/gruntwork-io/terragrunt/releases/tag/v1.0.3>, <https://docs.terragrunt.com/features/stacks/explicit/>, <https://docs.terragrunt.com/reference/cli/commands/stack/generate/>
- gotchas: "Version: v1.0.3"; "Availability: The `cas` experiment is required."; "source (required): Relative source path within the same repository; `//` separates the repository base path from the subdirectory."; "update_source_with_cas: Set to `true` to rewrite a nested relative source to a `cas::` reference during stack generation."; "path (required): Relative destination path for the generated unit."; "stack generate (required): Generates stack units from discovered `terragrunt.stack.hcl` configurations."; "Prerequisite: The relative source must stay within the same repository; `--no-cas` must not be set."; "Prerequisite: The v1.0.3 release note says the `cas` experiment must be enabled. Current active-experiment docs do not list CAS as an experiment."; "The repository is cloned once; subsequent stack generations resolve content from the local store without network access."; "Docs conflict: Current documentation describes CAS integration but no longer documents the `cas` experiment enable flag; it may describe behavior newer than v1.0.3."

### terragrunt catalog discovery and filtering with catalog-redesign (2026-04-27)
- slug: terragrunt-catalog-discovery-and-filtering-with-catalog-redesign-dc56c450c2af
- score: 0.98

How to use it:

When using Terragrunt v1.0.3 catalog discovery, enable the `catalog-redesign` experiment and run `terragrunt catalog`; add root `.terragrunt-catalog-ignore` rules to exclude paths. For extra rules, use `--ignore-file <path>` or `TG_IGNORE_FILE`; the docs confirm the command and ignore behavior, but not the experiment requirement at v1.0.3.

Examples:

```
terragrunt catalog
```

```
terragrunt catalog --ignore-file <path>
```

- why_it_matters: Discover modules and templates across a repository and exclude selected paths from the catalog.
- sources: <https://github.com/gruntwork-io/terragrunt/releases/tag/v1.0.3>, <https://docs.terragrunt.com/features/catalog/tui/>
- gotchas: "Version: v1.0.3"; "Availability: The `catalog-redesign` experiment is required."; "--ignore-file <path>: Path to an additional ignore file; its rules are appended after root `.terragrunt-catalog-ignore` rules, and the file must exist."; "TG_IGNORE_FILE: Environment-variable alternative to `--ignore-file`."; "Prerequisite: The docs describe `catalog-redesign` behavior as default in v1.1, with no experiment required; they do not document v1.0.3's experiment prerequisite."; "Ignore patterns are anchored at the repository root, one per line; `#` starts a comment, `!` negates, and the last match wins."; "A lone `*` does not cross `/`; `**` does."; "A directory that qualifies as both a template and a module is classified as a template."; "Docs conflict: Current docs describe default catalog behavior at v1.1, later than the card's v1.0.3; they do not verify its experiment switch or v1.0.3 usage."

### terragrunt mark-many-as-read enables source tracking and mark_glob_as_read (2026-04-27)
- slug: terragrunt-mark-many-as-read-enables-source-tracking-and-mark-glob-as-read-751f5d3cb01f
- score: 0.98

How to use it:

When a unit reads files indirectly or consumes a local Terraform module, enable `mark-many-as-read` so reading-based filters can select it when those files change. Use `mark_glob_as_read(pattern)` in `locals` to record matching files; local module source files are marked automatically.

Examples:

```
terragrunt run --all --filter 'reading=../../modules/service/**' -- plan
```

```
locals {
  configs = mark_glob_as_read("${get_terragrunt_dir()}/config/{*.yaml,**/*.yaml}")
}
```

```
terragrunt run --all --filter 'reading=./config/**' -- plan
```

- why_it_matters: Make reading-based filters match units that consume module files or indirectly read a collection of files.
- before: Before this change, a local module source did not cause its files to be marked read; for files not tracked natively, `mark_as_read(file_path)` could mark an individual file.
- sources: <https://github.com/gruntwork-io/terragrunt/releases/tag/v1.0.3>, <https://docs.terragrunt.com/reference/hcl/functions/#mark_glob_as_read>, <https://docs.terragrunt.com/features/filter/attributes/#reading-based-expressions>
- gotchas: "Version: v1.0.3"; "Availability: Requires the `mark-many-as-read` experiment to be enabled; calling `mark_glob_as_read` without it returns an error."; "--experiment mark-many-as-read (required): Enables the experiment behaviors, including `mark_glob_as_read`; the release note says the function errors without it."; "pattern (required): Glob expanded by `mark_glob_as_read`; matches are marked read and returned as absolute paths. Uses `gobwas/glob` syntax. For any-depth matching with a wildcard trailing segment, use `{*.yaml,**/*.yaml}`."; "reading=<path> (required): Reading-based filter expression matching units and stacks by files they read."; "Prerequisite: Use Terragrunt v1.0.3 or later for the release-note change."; "Prerequisite: Enable the `mark-many-as-read` experiment to use `mark_glob_as_read` and automatic local-source file tracking, per v1.0.3 release note. Current documentation says local module files are marked automatically but does not list this experiment as a prerequisite."; "Automatic marking applies recursively to `*.tf`, `*.tf.json`, `*.hcl`, `*.tofu`, and `*.tofu.json` files under the local source path; non-source files such as `README.md` are skipped."; "`mark_glob_as_read` uses the same `gobwas/glob` syntax as filter expressions."; "For match-at-any-depth with a wildcard trailing segment, use `{*.yaml,**/*.yaml}` because `**` only collapses surrounding separators when adjacent segments are literals."; "Docs conflict: Current official filter documentation says local module source files are automatically marked read without mentioning `mark-many-as-read`; current docs also say `mark_glob_as_read` is available, while the v1.0.3 release note requires the experiment. The current docs may reflect later behavior."

### terragrunt stack-dependencies resolves nested stack paths (2026-04-27)
- slug: terragrunt-stack-dependencies-resolves-nested-stack-paths-7e1d90af9515
- score: 0.95

How to use it:

When a unit in a parent stack must depend on a nested stack, enable `stack-dependencies` and set the dependency’s `config_path` to `stack.<name>.<nested_stack>.path` (for example, `stack.infra.deep.path`).

Examples:

```
unit "app" {
  source = "../catalog/units/app"
  path   = "app"

  autoinclude {
    dependency "deep" {
      config_path = stack.infra.deep.path
    }
  }
}
```

- why_it_matters: Declare a dependency in a unit of a parent stack on a stack nested inside one of its stacks.
- before: Previously, `stack-dependencies` supported `stack.<name>.path` for a whole stack and `stack.<name>.<unit_name>.path` for a unit inside a stack; it did not resolve the nested-stack reference described by this change.
- sources: <https://github.com/gruntwork-io/terragrunt/releases/tag/v1.0.3>, <https://docs.terragrunt.com/reference/hcl/blocks/>
- gotchas: "Version: v1.0.3"; "Availability: The `stack-dependencies` experiment is required."; "stack-dependencies (required): Experiment to enable for this feature in v1.0.3."; "autoinclude (required): Unit block that supplies configuration merged into the generated unit configuration."; "dependency \"deep\" (required): Dependency block; `deep` is its label."; "config_path (required): Path to the dependency configuration. Here it uses the nested stack path reference."; "stack.infra.deep.path (required): Reference to the generated path of the `deep` stack nested under `infra`, as stated in the v1.0.3 release note."; "Prerequisite: Enable the `stack-dependencies` experiment."; "Prerequisite: Declare the nested stack in the referenced stack’s `terragrunt.stack.hcl`; the release note example names `catalog/stacks/infra/terragrunt.stack.hcl`."; "Docs conflict: Current HCL blocks documentation says stacks are opaque dependency boundaries and path references cannot target a component inside another stack. This differs from the v1.0.3 release note’s nested-stack behavior; the current page documents a newer behavior/version. https://docs.terragrunt.com/reference/hcl/blocks/"

### terragrunt stack-dependencies supports cross-stack dependency patterns (2026-04-21)
- slug: terragrunt-stack-dependencies-supports-cross-stack-dependency-patterns-3f8e54636763
- score: 0.96

How to use it:

When a stack needs dependencies on another stack or a unit in a nested stack, declare them in `autoinclude` in `terragrunt.stack.hcl` using stack paths and dependency outputs. Plan all units with the `stack-dependencies` experiment enabled.

Examples:

```
stack "infra" {
  source = "<stack-source>"
  path   = "infra"
}

unit "app" {
  source = "<unit-source>"
  path   = "app"

  autoinclude {
    dependency "infra" {
      config_path = stack.infra.path
    }
    inputs = {
      vpc_id = dependency.infra.outputs.vpc.vpc_id
    }
  }
}
```

```
stack "networking" {
  source = "<stack-source>"
  path   = "networking"
}

unit "app" {
  source = "<unit-source>"
  path   = "app"

  autoinclude {
    dependency "vpc" {
      config_path = stack.networking.vpc.path
    }
    inputs = {
      vpc_id = dependency.vpc.outputs.vpc_id
    }
  }
}
```

```
terragrunt run --all --experiment stack-dependencies -- plan
```

- why_it_matters: Configure a Terragrunt stack so units can depend on another stack or on a unit in a nested stack.
- before: Before stack dependencies, stacks passed dependency paths to units through `values`, and units declared `dependency` blocks using those values as `config_path`.
- sources: <https://github.com/gruntwork-io/terragrunt/releases/tag/v1.0.2>, <https://docs.terragrunt.com/reference/cli/commands/run/>, <https://github.com/gruntwork-io/terragrunt-infrastructure-catalog-example/blob/main/docs/1.1-migration-guide.md>
- gotchas: "Version: v1.0.2"; "Availability: The `stack-dependencies` experiment."; "stack.<name>.path (required): Path reference for depending on the whole named stack."; "stack.<name>.<unit_name>.path (required): Path reference for depending on a unit within a nested stack."; "dependency.<name>.config_path (required): Path to the dependency configuration; examples set it to a stack path reference."; "dependency.<name>.outputs.<unit_name>.<output_key>: Access an output from a unit through a dependency targeting a stack directory; use the dependent stack's name and the unit/output names."; "--all: Run the specified OpenTofu/Terraform command against all units in the current stack."; "--experiment stack-dependencies (required): Enables the stack-dependencies experiment for the command."; "plan (required): OpenTofu/Terraform command passed to `terragrunt run`."; "Prerequisite: Enable the `stack-dependencies` experiment for the run with `--experiment stack-dependencies`."; "Prerequisite: The stack and unit declarations, including their `source` and `path`, belong in `terragrunt.stack.hcl`; `autoinclude` is nested in the unit or stack declaration."

### terragrunt.stack.hcl autoinclude dependency wiring with stack-dependencies (2026-04-13)
- slug: terragrunt-stack-hcl-autoinclude-dependency-wiring-with-stack-dependencies-e0ba8c7ca403
- score: 0.92

How to use it:

When generating a stack with unit dependencies or configuration overrides, enable the `stack-dependencies` experiment and put an `autoinclude` block inside the unit in `terragrunt.stack.hcl`. Then run the plan command across all units.

Examples:

```
unit "app" {
  source = "../catalog/units/app"
  path   = "app"

  autoinclude {
    dependency "vpc" {
      config_path = unit.vpc.path
    }

    inputs = {
      vpc_id = dependency.vpc.outputs.vpc_id
    }
  }
}
```

```
terragrunt run --all --experiment stack-dependencies -- plan
```

- why_it_matters: Define dependencies and configuration overrides between units when generating a stack.
- sources: <https://github.com/gruntwork-io/terragrunt/releases/tag/v1.0.1>, <https://docs.terragrunt.com/reference/cli/commands/run/>
- gotchas: "Version: v1.0.1"; "Availability: experiment"; "--all (required): Run the specified OpenTofu/Terraform command against all units in the current stack."; "--experiment stack-dependencies (required): Enable the stack-dependencies experiment for this run."; "autoinclude (required): Block in a unit that enables dependency relationships and configuration overrides during stack generation."; "dependency \"vpc\" (required): Declare a dependency named `vpc` in the autoinclude block."; "config_path (required): Set the dependency configuration path to `unit.vpc.path`."; "inputs: Set the generated unit input `vpc_id` from `dependency.vpc.outputs.vpc_id`."; "-- / plan (required): The separator passes `plan` as the OpenTofu/Terraform command."; "Prerequisite: Use Terragrunt v1.0.1, the release version that introduces this experiment."; "Docs conflict: Current active-experiments documentation does not list `stack-dependencies`; current v1.1 release documentation says the feature is enabled by default there. Those newer docs do not establish v1.0.1 behavior, so the v1.0.1 release note is used for the experiment requirement."

### terragrunt find --filter supports dependency traversal depth (2026-01-26)
- slug: terragrunt-find-filter-supports-dependency-traversal-depth-abe1cda0531c
- score: 0.98

How to use it:

When you need to discover units with dependency or dependent traversal capped at selected depths, run `terragrunt find --filter` with a number on the graph-expression ellipsis. For example, `terragrunt find --filter 'service...1'` finds `service` and its direct dependencies.

Examples:

```
terragrunt find --filter 'service...1'
```

```
terragrunt find --filter '1...vpc'
```

```
terragrunt find --filter '1...db...2'
```

- why_it_matters: Find Terragrunt units within a dependency graph while limiting traversal to selected graph depths.
- sources: <https://github.com/gruntwork-io/terragrunt/releases/tag/v0.99.0>
- gotchas: "Version: v0.99.0"; "--filter (required): Filter query; graph expressions can bound traversal depth by appending or prepending a number to an ellipsis."

### terragrunt --filter is generally available for Run Queue targeting (2026-01-05)
- slug: terragrunt-filter-is-generally-available-for-run-queue-targeting-b46b95ad249b
- score: 0.93

How to use it:

For targeted Run Queue discovery or execution, use Terragrunt’s unified `--filter` expressions for paths, files read, and dependency traversal. Use `--filters-file` for newline-delimited filters; a legacy excludes file needs conversion to filter expressions.

Examples:

```
terragrunt find --filter '{./<path>}'
```

```
terragrunt find --filter 'reading=<file>'
```

```
terragrunt run --all --filters-file <filters.txt> -- <tofu-command>
```

- why_it_matters: Target units or visualize the Run Queue in a Terragrunt repository using unified filter expressions.
- before: Use the corresponding queue control flag: `--queue-include-dir`, `--queue-exclude-dir`, `--queue-include-units-reading`, `--units-that-include`, `--queue-include-external-dependencies`, `--queue-excludes-file`, or `--graph`.
- sources: <https://github.com/gruntwork-io/terragrunt/releases/tag/v0.97.0>, <https://docs.terragrunt.com/features/filter/filters-file/>, <https://docs.terragrunt.com/features/filter/graph/>
- gotchas: "Version: v0.97.0"; "Availability: The --filter flag is generally available; legacy queue flag aliases will not be removed before Terragrunt 1.0."; "--filter <expression>: Select units/stacks with a filter expression; repeat the flag to combine filters. Path inclusion uses `{./path}`, exclusion uses `!{./path}`, file-read matching uses `reading=<file>`, and graph traversal uses `...` around a target."; "--filters-file <file>: Read filter expressions from a newline-delimited text file; the docs show empty lines and `#` comment lines are ignored."; "reading=<file>: Attribute expression that matches units/stacks that read the named file."; "...: Graph traversal operator; after a target includes its dependencies, before a target includes its dependents. Both directions are supported by surrounding the target."; "Prerequisite: Terragrunt v0.97.0 or later for the generally available `--filter` flag."; "Prerequisite: Filters files contain newline-delimited expressions; the v0.97.0 release note says a `--queue-excludes-file` file does not directly translate to a `--filters-file` file."; "A file used for `--queue-excludes-file` does not directly translate to a file usable with `--filters-file`."; "Legacy queue flag aliases remain for backwards compatibility and will not emit deprecation warnings."; "Docs conflict: Current docs describe graph expressions as `...<target>` for dependents and `<target>...` for dependencies; this differs from the v0.97.0 release note’s `{./**}...` and `...{.}` examples. Use the release-note mappings for v0.97.0."
