Support parent-scoped multi-file stacks @osterman (#2787)
## what- Support one logical stack across multiple top-level parent manifests without merging parent scopes.
- Keep each parent's
metadata.inheritsgraph self-contained while canonicalizing equivalent imported duplicates by lexical parent path. - Add the top-level stack composition PRD and regression fixtures for naming, conflicts, isolation, explicit imports, and invalid inheritance.
why
- Multiple top-level files that represented layers of the same logical stack were previously rejected or treated independently.
- This enables aggregate component discovery without implicitly making another parent's imports part of a manifest's inheritance dependencies.
- Shared inheritance bases remain intentional and reviewable through each parent's normal import graph.
references
docs/prd/top-level-stack-composition.md
Summary by CodeRabbit
-
New Features
- Added parent-scoped multi-file stack discovery: multiple top-level parent manifests with the same stack identity are composed into one logical stack.
- Kept parent-specific imports/globals/locals/component config isolated while aggregating components across parents.
- Enabled controlled component inheritance within the composed logical stack.
-
Bug Fixes
- Duplicate component configurations now resolve deterministically.
- Conflicting duplicates and unsupported peer-only inheritance are rejected with clearer diagnostics.
-
Documentation
- Added a PRD and published a blog post on parent-scoped multi-file stacks.
- Updated the public roadmap to mark the feature as shipped.
feat(stacks): support global-scope metadata defaults @osterman (#2808)
## what- Adds support for a restricted allowlist of
metadatafields (labels,tags,custom,enabled,locked,terraform_workspace_pattern) at the stack-manifest root, deep-merged into every component's ownmetadataas a stack-wide default. - Merge precedence, lowest to highest: global (stack-wide) → the
metadata.inheritsbase-component chain → the component's own localmetadata:block, which always wins. - Component-identity fields (
component,inherits,type,name,terraform_workspace) remain component-only; setting one of these at global scope is now a hard validation error, both at runtime and via the manifest JSON Schema, instead of a silent no-op. - Updates
metadata.mdxdocs and adds a changelog post explaining the new global scope.
why
- A stack-wide
metadata:block (e.g. in_defaults.yaml) was previously accepted by the schema but never applied —metadata.labels/metadata.tags/etc. set there silently did nothing, which is worse than an error, since users had no signal their config wasn't taking effect. - Sharing labels, tags, or a stack-wide lock/enable flag across every component in a stack required copy-pasting the same
metadatablock into each component definition instead of declaring it once.
references
Summary by CodeRabbit
-
New Features
- Added stack-root
metadata:defaults that are deep-merged into each component’smetadata. - Enforced 3-tier precedence: stack defaults →
metadata.inheritschain (when enabled) → component-local metadata.
- Added stack-root
-
Validation & Tests
- Added schema allowlisting for stack-scope
metadata(onlylabels,tags,custom,enabled,locked,terraform_workspace_pattern). - Expanded tests to cover precedence, custom component behavior, and new error paths for invalid global/identity fields.
- Added schema allowlisting for stack-scope
-
Documentation
- Updated component metadata docs and added a blog post explaining scope, allowed keys, and merge behavior.
Clarify Atmos CI concurrency guidance @osterman (#2798)
## what- Add a concise warning about using GitHub Actions concurrency around Atmos/Terraform commands.
- Fix Markdown indentation in the modernization skill so affected validation passes.
why
- Concurrency groups are not a FIFO deployment queue, and cancellation can interrupt Terraform work.
references
Summary by CodeRabbit
- Documentation
- Clarified GitHub Actions
concurrencybehavior for Atmos/Terraform runs, including in-progress vs pending handling and pending-run eviction. - Added warnings that
cancel-in-progress: truecan cancel an in-flight Terraform apply and potentially leave remote state locks requiring manual recovery. - Documented
queue: maxlimits (up to 100 pending) and noted it can’t be combined withcancel-in-progress. - Recommended explicit promotion/deployment workflows for strict execution ordering and updated the modernization checklist wording/formatting.
- Clarified GitHub Actions