[{"url":"https://api.github.com/repos/cloudposse/atmos/releases/348357709","assets_url":"https://api.github.com/repos/cloudposse/atmos/releases/348357709/assets","upload_url":"https://uploads.github.com/repos/cloudposse/atmos/releases/348357709/assets{?name,label}","html_url":"https://github.com/cloudposse/atmos/releases/tag/v1.223.0-rc.0","id":348357709,"author":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"node_id":"RE_kwDOEW4XoM4Uw4RN","tag_name":"v1.223.0-rc.0","target_commitish":"main","name":"v1.223.0-rc.0","draft":false,"immutable":false,"prerelease":true,"created_at":"2026-07-02T06:34:07Z","updated_at":"2026-07-03T01:04:57Z","published_at":"2026-07-03T01:04:57Z","assets":[{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/464884410","id":464884410,"node_id":"RA_kwDOEW4XoM4btZK6","name":"atmos_1.223.0-rc.0_darwin_amd64","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":281216912,"digest":"sha256:60d41176998c6a5dff209e2c3d10857bad6eb7f08e69f88a8e123679db884864","download_count":1,"created_at":"2026-07-03T01:03:46Z","updated_at":"2026-07-03T01:03:56Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.223.0-rc.0/atmos_1.223.0-rc.0_darwin_amd64"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/464884407","id":464884407,"node_id":"RA_kwDOEW4XoM4btZK3","name":"atmos_1.223.0-rc.0_darwin_arm64","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":264102274,"digest":"sha256:d3320dfffe106d5bf42f7e9500584f3b4ec298558441eb76ac4ce4ce4874089b","download_count":1,"created_at":"2026-07-03T01:03:46Z","updated_at":"2026-07-03T01:03:56Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.223.0-rc.0/atmos_1.223.0-rc.0_darwin_arm64"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/464884409","id":464884409,"node_id":"RA_kwDOEW4XoM4btZK5","name":"atmos_1.223.0-rc.0_freebsd_amd64","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":274325676,"digest":"sha256:2eab3dcda02e2ad50b674fe4cbb5a5d02079187426815afd4142e50c0ed9fc69","download_count":1,"created_at":"2026-07-03T01:03:46Z","updated_at":"2026-07-03T01:03:59Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.223.0-rc.0/atmos_1.223.0-rc.0_freebsd_amd64"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/464884685","id":464884685,"node_id":"RA_kwDOEW4XoM4btZPN","name":"atmos_1.223.0-rc.0_freebsd_arm64","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":255197356,"digest":"sha256:0cd5c864d211e35349eef9cae35d8120048da86b5ee1705f5aa1b041f0a4afa7","download_count":1,"created_at":"2026-07-03T01:04:06Z","updated_at":"2026-07-03T01:04:13Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.223.0-rc.0/atmos_1.223.0-rc.0_freebsd_arm64"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/464884485","id":464884485,"node_id":"RA_kwDOEW4XoM4btZMF","name":"atmos_1.223.0-rc.0_linux_386","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":256753826,"digest":"sha256:0c3617d2e1f4877fcc5ced86a9afa9f0886abe9e7e183f4a593b1fcf2200d759","download_count":1,"created_at":"2026-07-03T01:03:56Z","updated_at":"2026-07-03T01:04:05Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.223.0-rc.0/atmos_1.223.0-rc.0_linux_386"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/464884687","id":464884687,"node_id":"RA_kwDOEW4XoM4btZPP","name":"atmos_1.223.0-rc.0_linux_amd64","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":275153058,"digest":"sha256:782b7e11a4aeadc02f7283bad72cb95164fb19dece9b2630bdcfbfe20a9cc6a4","download_count":3,"created_at":"2026-07-03T01:04:06Z","updated_at":"2026-07-03T01:04:14Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.223.0-rc.0/atmos_1.223.0-rc.0_linux_amd64"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/464884486","id":464884486,"node_id":"RA_kwDOEW4XoM4btZMG","name":"atmos_1.223.0-rc.0_linux_arm","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":256442530,"digest":"sha256:99671e7443a1e4eeb31be0b26d2549f3cad688b709d66466c115990ecb6410a8","download_count":1,"created_at":"2026-07-03T01:03:56Z","updated_at":"2026-07-03T01:04:04Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.223.0-rc.0/atmos_1.223.0-rc.0_linux_arm"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/464884408","id":464884408,"node_id":"RA_kwDOEW4XoM4btZK4","name":"atmos_1.223.0-rc.0_linux_arm64","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":255983778,"digest":"sha256:488c464383325d3efdf0284ae7fa0d03cec0b6716e69b9bdbf3da7f75339b19b","download_count":1,"created_at":"2026-07-03T01:03:46Z","updated_at":"2026-07-03T01:03:56Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.223.0-rc.0/atmos_1.223.0-rc.0_linux_arm64"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/464884701","id":464884701,"node_id":"RA_kwDOEW4XoM4btZPd","name":"atmos_1.223.0-rc.0_SHA256SUMS","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":1085,"digest":"sha256:ec3b1a721a86d20f33af63a8ffb462811f80c8359e8282190b3189d35469cfde","download_count":1,"created_at":"2026-07-03T01:04:07Z","updated_at":"2026-07-03T01:04:07Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.223.0-rc.0/atmos_1.223.0-rc.0_SHA256SUMS"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/464884502","id":464884502,"node_id":"RA_kwDOEW4XoM4btZMW","name":"atmos_1.223.0-rc.0_windows_386.exe","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/x-ms-dos-executable","state":"uploaded","size":262267392,"digest":"sha256:d45d0665f0f04770b7562da6da7f23824d670dcdd69943c972934470f3545644","download_count":1,"created_at":"2026-07-03T01:03:59Z","updated_at":"2026-07-03T01:04:06Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.223.0-rc.0/atmos_1.223.0-rc.0_windows_386.exe"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/464884535","id":464884535,"node_id":"RA_kwDOEW4XoM4btZM3","name":"atmos_1.223.0-rc.0_windows_amd64.exe","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/x-ms-dos-executable","state":"uploaded","size":279900160,"digest":"sha256:1ae3e70f38ef72e2abf55362e801f0b2414d1f7bd6efff23c7598765f16ddbd5","download_count":1,"created_at":"2026-07-03T01:04:04Z","updated_at":"2026-07-03T01:04:10Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.223.0-rc.0/atmos_1.223.0-rc.0_windows_amd64.exe"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/464884488","id":464884488,"node_id":"RA_kwDOEW4XoM4btZMI","name":"atmos_1.223.0-rc.0_windows_arm64.exe","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/x-ms-dos-executable","state":"uploaded","size":257823744,"digest":"sha256:f086c4e0b80f47a47e4e18c213f4ee7aad48a84030d50343a7b328a6cf392dc1","download_count":1,"created_at":"2026-07-03T01:03:56Z","updated_at":"2026-07-03T01:04:05Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.223.0-rc.0/atmos_1.223.0-rc.0_windows_arm64.exe"}],"tarball_url":"https://api.github.com/repos/cloudposse/atmos/tarball/v1.223.0-rc.0","zipball_url":"https://api.github.com/repos/cloudposse/atmos/zipball/v1.223.0-rc.0","body":"* No changes\n"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/347974492","assets_url":"https://api.github.com/repos/cloudposse/atmos/releases/347974492/assets","upload_url":"https://uploads.github.com/repos/cloudposse/atmos/releases/347974492/assets{?name,label}","html_url":"https://github.com/cloudposse/atmos/releases/tag/v1.222.0","id":347974492,"author":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"node_id":"RE_kwDOEW4XoM4Uvatc","tag_name":"v1.222.0","target_commitish":"main","name":"v1.222.0","draft":false,"immutable":false,"prerelease":false,"created_at":"2026-07-02T06:34:07Z","updated_at":"2026-07-02T10:56:34Z","published_at":"2026-07-02T10:56:34Z","assets":[{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/464210288","id":464210288,"node_id":"RA_kwDOEW4XoM4bq0lw","name":"atmos_1.222.0_darwin_amd64","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":281216912,"digest":"sha256:3ce47285a8f4a23a5a9019f0f82fe41239ae23a526bb8e3edcec0d977bccd690","download_count":26,"created_at":"2026-07-02T10:36:13Z","updated_at":"2026-07-02T10:36:29Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0/atmos_1.222.0_darwin_amd64"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/464210479","id":464210479,"node_id":"RA_kwDOEW4XoM4bq0ov","name":"atmos_1.222.0_darwin_arm64","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":264102274,"digest":"sha256:c74cb6a506af3e1d7dafb4e3fd4928386fd8b6c619aba8c7644caaa699f9dfea","download_count":68,"created_at":"2026-07-02T10:36:29Z","updated_at":"2026-07-02T10:36:41Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0/atmos_1.222.0_darwin_arm64"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/464210460","id":464210460,"node_id":"RA_kwDOEW4XoM4bq0oc","name":"atmos_1.222.0_freebsd_amd64","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":274325676,"digest":"sha256:10c5c901f34b657009305a9d10b5b07cfcaeba50e5e9ac33e47529eff841b023","download_count":1,"created_at":"2026-07-02T10:36:27Z","updated_at":"2026-07-02T10:36:36Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0/atmos_1.222.0_freebsd_amd64"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/464210287","id":464210287,"node_id":"RA_kwDOEW4XoM4bq0lv","name":"atmos_1.222.0_freebsd_arm64","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":255197356,"digest":"sha256:a5e67b736062a015efaffc4a880081eafddecdf52722d659f87380baf9067cf9","download_count":1,"created_at":"2026-07-02T10:36:13Z","updated_at":"2026-07-02T10:36:28Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0/atmos_1.222.0_freebsd_arm64"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/464210483","id":464210483,"node_id":"RA_kwDOEW4XoM4bq0oz","name":"atmos_1.222.0_linux_386","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":256753826,"digest":"sha256:975fbe0e240e11532115ad5295fb7624685a831e46e12cd248fff76e2b1a8b39","download_count":2,"created_at":"2026-07-02T10:36:29Z","updated_at":"2026-07-02T10:36:40Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0/atmos_1.222.0_linux_386"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/464210888","id":464210888,"node_id":"RA_kwDOEW4XoM4bq0vI","name":"atmos_1.222.0_linux_amd64","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":275153058,"digest":"sha256:5e488513434def59814045ca533797b9af6752757f6c2ade96c0a643e5baa8c3","download_count":720,"created_at":"2026-07-02T10:36:41Z","updated_at":"2026-07-02T10:36:52Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0/atmos_1.222.0_linux_amd64"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/464210289","id":464210289,"node_id":"RA_kwDOEW4XoM4bq0lx","name":"atmos_1.222.0_linux_arm","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":256442530,"digest":"sha256:572d97fa18507520f0bb8d018f40908d12bbc68e58605dd34b664da45a31004b","download_count":1,"created_at":"2026-07-02T10:36:13Z","updated_at":"2026-07-02T10:36:26Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0/atmos_1.222.0_linux_arm"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/464210286","id":464210286,"node_id":"RA_kwDOEW4XoM4bq0lu","name":"atmos_1.222.0_linux_arm64","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":255983778,"digest":"sha256:363d8776fa678dcdc4ae179dea181880fbcfb29663315f07557234b01a1b5246","download_count":270,"created_at":"2026-07-02T10:36:13Z","updated_at":"2026-07-02T10:36:28Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0/atmos_1.222.0_linux_arm64"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/464210901","id":464210901,"node_id":"RA_kwDOEW4XoM4bq0vV","name":"atmos_1.222.0_SHA256SUMS","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":1030,"digest":"sha256:998a512c4c896bc4c34c23c2ad4908f1047f0d8c9522630410be8f808eae7afc","download_count":97,"created_at":"2026-07-02T10:36:42Z","updated_at":"2026-07-02T10:36:42Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0/atmos_1.222.0_SHA256SUMS"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/464210812","id":464210812,"node_id":"RA_kwDOEW4XoM4bq0t8","name":"atmos_1.222.0_windows_386.exe","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/x-ms-dos-executable","state":"uploaded","size":262267392,"digest":"sha256:78cb49d635f611fa92a51caaa0c24ea19764f829d5e945cf82347a8b520db629","download_count":5,"created_at":"2026-07-02T10:36:37Z","updated_at":"2026-07-02T10:36:45Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0/atmos_1.222.0_windows_386.exe"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/464210900","id":464210900,"node_id":"RA_kwDOEW4XoM4bq0vU","name":"atmos_1.222.0_windows_amd64.exe","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/x-ms-dos-executable","state":"uploaded","size":279900160,"digest":"sha256:ac04461535d89dae188fe2fa180ad5bb8ab7353838cd643712f34072a5b2b238","download_count":54,"created_at":"2026-07-02T10:36:41Z","updated_at":"2026-07-02T10:36:51Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0/atmos_1.222.0_windows_amd64.exe"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/464210486","id":464210486,"node_id":"RA_kwDOEW4XoM4bq0o2","name":"atmos_1.222.0_windows_arm64.exe","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/x-ms-dos-executable","state":"uploaded","size":257823744,"digest":"sha256:bc507c799193700734f050f0691de687a5b75e8ccfc035a6a7a30fad5fc24b61","download_count":5,"created_at":"2026-07-02T10:36:29Z","updated_at":"2026-07-02T10:36:41Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0/atmos_1.222.0_windows_arm64.exe"}],"tarball_url":"https://api.github.com/repos/cloudposse/atmos/tarball/v1.222.0","zipball_url":"https://api.github.com/repos/cloudposse/atmos/zipball/v1.222.0","body":"<details>\r\n  <summary>feat: native Helm components (experimental) @osterman (#2667)</summary>\r\n\r\n## what\r\n\r\nAdds the **native Helm component type** to Atmos (stacked on the native Kubernetes work), so `components.helm.<name>` is a first-class component with the same stack semantics as Terraform/Kubernetes — rendered, diffed, applied, and deleted through the Helm Go SDK (no `helm`/`helmfile` binary required).\r\n\r\nThis branch contributes, on top of `osterman/kubernetes-native-component`:\r\n\r\n- **Native Helm component + `atmos helm` commands** — `template`, `diff`, `plan`, `apply`, `deploy`, `delete`. Charts can be local, repository, OCI, or vendored from a `source:` (parity with terraform/kubernetes JIT provisioning). `values:` is the chart's values; secrets flow via `!secret` and are masked.\r\n- **Marked experimental** — `atmos helm` renders the `[EXPERIMENTAL]` badge and honors `settings.experimental` / `ATMOS_EXPERIMENTAL`.\r\n- **Real `diff`** — `atmos helm diff`/`plan` now produces a true unified diff via the [helm-diff](https://github.com/databus23/helm-diff) library (used as a Go library, not the CLI plugin; `v3.15.10` pins the same `helm.sh/helm/v4 v4.2.1` Atmos uses). Secret values are redacted. Three baselines:\r\n  - **deployed release** (default; `action.NewGet`, cluster only for the baseline)\r\n  - **`--from-manifest=<path>`** — local baseline file (offline)\r\n  - **`--against=target[:<name>]`** — current manifests in a git deployment-repo provision target (offline; the GitOps producer-side diff)\r\n- **GitOps producer side** — `apply`/`deploy` can publish rendered manifests to a git deployment repository (`provision` targets). A new optional `Fetcher` capability on the target registry lets `diff` read that target's current state.\r\n- **CI `.Diff` job summary** at parity with the native Kubernetes component (collapsible block, Secrets omitted).\r\n\r\n## why\r\n\r\nHelm has no native cross-release dependency ordering, no first-class secrets, and no in-process rendering — the ecosystem stitches together `helm`, `helmfile`, `helm-secrets`, and `helm-diff`. Atmos provides these directly through the stack model and the Helm Go SDK, including a real diff with no plugin to install, plus an offline GitOps-repo diff for producer-side workflows.\r\n\r\n## references\r\n\r\n- Docs: [`atmos helm`](https://atmos.tools/cli/commands/helm/usage), [`helm diff`](https://atmos.tools/cli/commands/helm/diff), [Helm components](https://atmos.tools/stacks/components/helm)\r\n- Changelog: `website/blog/2026-06-15-native-helm-components.mdx`\r\n- Example: `examples/helm`\r\n- Helmfile parity request: #2069\r\n\r\n## notes\r\n\r\n- Experimental feature; ships behind the experimental gate.\r\n- Pre-existing helm-feature lint debt (5 issues in `executor.go`/`provision.go`, e.g. `os.Getenv`→viper, funlen, arg-limit) is tracked for a follow-up cleanup; the diff work itself is lint-clean against the base.\r\n\r\n</details>\r\n\r\n<details>\r\n  <summary>feat: local Terraform tests against cloud emulators @osterman (#2663)</summary>\r\n\r\n## what\r\n\r\n- Run `atmos terraform test` (Terraform's native `*.tftest.hcl` framework) against a local cloud **emulator** instead of a real cloud account, via a new `examples/terraform-tests` example.\r\n- Add `before.terraform.test` / `after.terraform.test` lifecycle events and wire `cmd/terraform/test.go` to capture output and fire them — which drives both component `hooks:` and the native-CI plugin from one place.\r\n- New `emulator` workflow **step type** that drives emulator up/down/reset, so declarative `kind: step` hooks can bring a sandbox up before tests and tear it down after (`when: always`), with no manual `atmos emulator up/down`.\r\n- Native-CI **job step summary** for `terraform test`: pass/fail/skip badges and a per-run results table, alongside the existing `plan`/`apply` summaries.\r\n- **Bug fix:** under the Podman runtime, `parsePodmanContainer` dropped the container `Ports` array, so the emulator endpoint resolved empty and Terraform silently hit **real AWS** (`403 InvalidAccessKeyId`). Podman's structured `Ports` are now parsed into `Info.Ports`.\r\n- Docs (emulator step type, hook events, job summaries, hooks guide), a changelog blog post, a roadmap milestone, and a `docs/fixes/` write-up for the Podman fix.\r\n\r\n## why\r\n\r\n- `terraform test`'s `apply` run blocks create real infrastructure, so they need a cloud account and spend and rarely run locally — pointing them at an emulator makes them free, hermetic, and identical local↔CI.\r\n- A single hook-events seam keeps the emulator lifecycle declarative (in the component) rather than a hand-written custom command, and reuses the existing `kind: step` machinery.\r\n- The Podman fix is required for any emulator-backed Terraform to reach the sandbox at all on Podman (it also fixes the existing `emulator-aws` example), and is documented in `docs/fixes/` rather than the changelog because it restores already-intended behavior.\r\n\r\n## references\r\n\r\n- Builds on the emulators feature (#2647).\r\n- Podman fix rationale: `docs/fixes/2026-06-27-podman-port-readback-emulator-endpoint.md`.\r\n- Changelog: `website/blog/2026-06-27-local-terraform-tests-with-emulators.mdx`.\r\n\r\n</details>\r\n\r\n<details>\r\n  <summary>[codex] Fix mobile gutters and name runtime CSS @osterman (#2673)</summary>\r\n\r\n## what\r\n\r\n- Renamed the homepage runtime stylesheet from `landing-redesign.css` to `landing-runtime.css`.\r\n- Updated the homepage import to use the new runtime stylesheet name.\r\n- Tightened mobile and tablet hero CSS so the homepage content keeps consistent left/right gutters and CTA elements stay within the content column.\r\n- Added a more compact phone hero by reducing vertical spacing, scaling mobile type, hiding the heavier demo/runs band on small screens, centering the overall mobile content column, placing cloud logos in the whitespace to the right of the value props, and centering the CTA row.\r\n- Optimized the mobile AI section by hiding the decorative badge, reducing text scale/line-height, tightening spacing, and using left-aligned copy on phones.\r\n\r\n## why\r\n\r\n- Makes the stylesheet name describe the current homepage theme instead of a past redesign event.\r\n- Fixes the mobile homepage hero feeling clipped or overly left-aligned on narrow viewports without making the lower action area look disconnected.\r\n- Helps the primary mobile hero and AI section content fit better above the fold on common devices.\r\n- Protects the runtime hero from legacy broad landing-page header rules at responsive breakpoints.\r\n\r\n## references\r\n\r\n- Validation: pre-commit hooks passed during commit.\r\n- Validation: Docusaurus dev server compiled successfully with `src/css/landing-runtime.css` and `AISection/styles.css`.\r\n- Validation: `postcss.parse` passed for the updated CSS files.\r\n\r\n</details>\r\n\r\n<details>\r\n  <summary>feat: native Kubernetes components with GitOps deployment-repo delivery @osterman (#2607)</summary>\r\n\r\n## what\r\n\r\n- **Native `kubernetes` component type.** Define Kubernetes objects in stacks and run `atmos kubernetes render|diff|plan|apply|deploy|delete <component> -s <stack>` through the Kubernetes Go SDKs (server-side apply) — no `kubectl` or `kustomize` binary required.\r\n- Inputs can be **inline `manifests`, files/directories (`paths`), and Kustomize overlays**; full stack semantics (vars/env/auth/metadata/inheritance/overrides), `--all`/`--affected` DAG ordering, Atmos Auth (e.g. EKS) integration, and dotted lifecycle hooks (`before/after.kubernetes.*`).\r\n- **GitOps delivery via `provision.targets`.** `apply`/`deploy` deliver to a target selected by `kind`: `kubernetes` applies to the cluster (default), `git` renders the manifests and commits them to a managed Git deployment repository (Argo CD/Flux source-of-truth) instead. Selected with `--target` (precedence: `--target` → `provision.default` → implicit cluster), so existing components are unaffected.\r\n- New reusable, component-agnostic **target-provisioner registry** (`pkg/provisioner/target`, registry pattern) + a `ProvisionArtifact` model. The **git target** composes the `pkg/git` service: clone-reconcile a `git.repositories.<name>`, replace the managed templated `path` with the rendered files, path-scoped commit with provenance trailers, and push-with-retry. Credentials come from Atmos Auth (GitHub STS); `pull_request` publishing is deferred.\r\n- **Schema, LSP, docs, examples, changelog.** Typed `kubernetes` component and `provision.targets` in Go schema and both JSON schemas; LSP; command/config/stack docs; `examples/kubernetes` and `examples/kustomize`; a changelog blog post and a roadmap milestone.\r\n\r\n## why\r\n\r\n- Kubernetes should be orchestrated by the same stack-based engine as Terraform/Helmfile/Ansible — one set of inheritance, auth, and affected-detection — rather than shelling out to `kubectl`/`kustomize` from glue scripts.\r\n- GitOps pipelines have always needed ad hoc glue to render manifests into a deployment repo, commit, survive push races, and wire credentials. Atmos already owns rendering, lifecycle events, and authentication, so `provision.targets` adds the delivery step with centralized safety rules — the same component config can apply to a cluster in dev and publish to a GitOps repo in prod with one flag.\r\n\r\n## references\r\n\r\n- Builds on the Atmos Git foundational capability (#2597), now merged into `main`, which provides the reusable `pkg/git` service and `git.repositories` configuration consumed by the git target.\r\n- Docs: [Kubernetes component](/stacks/components/kubernetes), [`atmos kubernetes`](/cli/commands/kubernetes/usage).\r\n\r\n</details>\r\n\r\n<details>\r\n  <summary>Add emulator workflows, skill catalog, and website refresh @osterman (#2665)</summary>\r\n\r\n## what\r\n\r\n- Added emulator workflow improvements, including emulator listing, Kubernetes readiness handling, Podman port parsing, and emulator-aware Terraform backend reads for AWS, GCP, and Azure.\r\n- Added offline bundled AI skill catalog support, including available-vs-installed skill listing and install-by-name behavior.\r\n- Added component dependency listing support plus updated examples, docs, landing-page demo assets, and website sidebar/landing refresh work.\r\n\r\n## why\r\n\r\n- Makes local emulator workflows more reliable by keeping in-process backend reads pointed at emulator endpoints instead of real cloud services.\r\n- Lets users discover and install bundled Atmos AI skills without requiring network or Git access.\r\n- Improves dependency visibility and updates the docs/website experience around the new emulator and skill workflows.\r\n\r\n## references\r\n\r\n- None.\r\n\r\n</details>\r\n\r\n<details>\r\n  <summary>Add parallel and matrix workflow control steps @osterman (#2635)</summary>\r\n\r\n## what\r\n\r\n- Add `parallel` and `matrix` workflow control steps with sibling `needs` DAG scheduling.\r\n- Add configurable failure behavior, parent-owned grouped/prefixed/none output, summary rendering through UI helpers, and child result metadata capture.\r\n- Keep the internal exec integration thin while placing the scheduler, matrix expansion, command child executor, output handling, and tests in `pkg/workflow`.\r\n- Add workflow/schema validation, registered `pkg/runner/step/parallel` and `pkg/runner/step/matrix` handlers, JSON schema updates, and `examples/parallel-steps`.\r\n\r\n## why\r\n\r\n- Enables non-interactive workflow steps to run concurrently without moving orchestration policy into `internal/exec`.\r\n- Provides deterministic dependency, failure, output, and matrix semantics before allowing broader step types inside concurrent groups.\r\n- Documents the new behavior with runnable examples and keeps `pkg/workflow` coverage above 80%.\r\n\r\n## references\r\n\r\n- `pkg/workflow` coverage: 82.9%\r\n- Validation run: `go test ./pkg/schema ./pkg/runner/step ./pkg/scheduler ./pkg/workflow ./internal/exec`\r\n- Validation run: `go test ./cmd ./tests -run 'Workflow|workflow|Schema|schema'`\r\n- Validation run: `./custom-gcl run --new-from-rev=origin/main --config=.golangci.yml`\r\n\r\n</details>\r\n\r\n<details>\r\n  <summary>feat(emulator): local cloud emulators + emulator-based advanced quick-start & docs example drawer @osterman (#2647)</summary>\r\n\r\n## what\r\n\r\n**Emulator feature** — run cloud-service emulators locally as first-class Atmos components:\r\n\r\n- `emulator` component kind + driver registry (`pkg/emulator`): the `EmulatorDriver` interface, `ResolveDriver`/`Drivers`, `Endpoint`/`Profile` types, the built-in AWS **Floci** driver, and the AWS target-profile builder (dummy creds, `AWS_ENDPOINT_URL`, and the Terraform provider behavior flags env can't set).\r\n- `atmos emulator` CLI (`cmd/emulator`): lifecycle verbs (up/down/reset/list/…), flags, and shell completions.\r\n- Auth/identity binding so **in-process AWS and Terraform both reach the emulator** (`pkg/auth`, `pkg/component`, `internal/exec`); generic provider-config contribution (`pkg/generator`).\r\n- Design captured as three PRDs: `docs/prd/emulators.md`, `docs/prd/kubernetes-identity.md`, `docs/prd/provider-config-contributor.md`.\r\n- Examples + E2E: `examples/emulator-aws`, `examples/demo-floci`, and the floci/acceptance jobs.\r\n- Changelog: `website/blog/2026-06-22-emulator-persistence.mdx`.\r\n\r\n**Emulator-based advanced quick-start** — rewrote the advanced tutorial to deploy a real event-driven AWS backend (KMS key, encrypted S3 bucket, DynamoDB table, SNS topic, SQS queue, SSM Parameter Store config) **entirely on your laptop, with no AWS account and no credentials**, via the emulator. New backing example `examples/quick-start-advanced` (replaces the old VPC-based one).\r\n\r\n**Docs UI** — a right-side **`[Example]` drawer** that follows each quickstart page and shows the page's backing example files (`QuickStartExampleDrawer`, wired through `theme/DocItem/Content` + `theme/Root`, reading the file-browser plugin's global data). Plus restyled `File`, `Terminal`, `KeyPoints` (\"You will learn\"), `KeyTakeaways`, `EmbedExample`, and `ActionCard` components, a CodeBlock line-numbers toggle, and supporting theme/CSS overrides.\r\n\r\n## why\r\n\r\n- Emulators let contributors and CI run the full Atmos workflow — auth, secrets, vendoring, toolchain, Terraform apply — against local cloud emulators, the **same on a laptop and in CI**, with no cloud credentials. That makes the advanced tutorial runnable by anyone and gives fast, hermetic local iteration.\r\n- The example drawer and component restyle let each tutorial page show its backing example inline, so readers can follow the docs and the code side by side.\r\n\r\n## references\r\n\r\n- Stacked on `osterman/container-component-type` (reuses its persistent container lifecycle via `ComponentType: \"emulator\"`).\r\n- See `docs/prd/emulators.md` for the full design and per-step implementation sequence.\r\n\r\n</details>\r\n\r\n<details>\r\n  <summary>Fix bare command docs links @osterman (#2660)</summary>\r\n\r\n## what\r\n\r\n- Adds explicit redirects from bare command overview routes for `auth`, `ai`, and `toolchain` to their canonical `/usage` pages.\r\n- Updates announcement and feature-card links to point directly at the canonical command overview URLs.\r\n\r\n## why\r\n\r\n- Prevents users from hitting 404s when following bare command docs links like `/cli/commands/auth`.\r\n- Keeps existing `/usage` command overview URLs canonical without changing valid bare command routes such as `workflow`, `devcontainer`, and `ci`.\r\n\r\n## references\r\n\r\n- Reported from `https://atmos.tools/cli/commands/auth` returning 404.\r\n- Validated with `cd website && npm run build`.\r\n\r\n</details>\r\n\r\n<details>\r\n  <summary>feat(hooks): run custom step types as lifecycle hooks (kind: step) @osterman (#2658)</summary>\r\n\r\n## what\r\n\r\n- Add a new `kind: step` component-lifecycle hook that delegates to the workflow/custom-command **step registry**, making every registered step type (`container`, `http`, `toast`, `log`, `markdown`, …) runnable on terraform lifecycle events — name a step `type:` and pass its parameters under `with:`.\r\n- Plumb the **operation outcome** to hooks: user hooks now fire on the failure path (not just success), a new `when: success|failure|always` selector (default `success`) controls outcome-based firing, and `{{ .status }}`/`{{ .exit_code }}`/`{{ .error }}` template context plus `ATMOS_HOOK_*` env vars (alongside component/stack) let a hook announce exactly what happened.\r\n- Tighten the `hooks` JSON schema into a structured per-hook envelope (`kind` enum incl. `step`, `events`, `on_failure`, `when`, `type`, `with`, `retry`) across all three schema copies, kept non-breaking (`additionalProperties: true`).\r\n- Add docs (hooks reference + new sections), a PRD, a changelog blog post, and a roadmap milestone; unit tests cover routing, nested `with:` decode, `when` filtering, outcome template/env exposure, retry, and `on_failure`.\r\n\r\n## why\r\n\r\n- The hook system previously hard-coded a small kind list (`store`, `command`, `infracost`, `checkov`, `kics`, `trivy`, `git`); every new capability meant a new kind. Reusing the existing, well-tested step registry lets the whole step library work as hooks without forking the abstraction.\r\n- A key use case — \"the VPC component in the foobar stack failed\" — was impossible: `after-*` hooks fired only on success (cobra skips `PostRunE` on error) and the outcome reached only CI hooks, never user hooks. Firing user hooks on failure with `when` + outcome context closes that gap while defaulting to success-only so existing hooks (e.g. `store`) keep their behavior.\r\n\r\n## references\r\n\r\n- PRD: `docs/prd/hooks-step-types.md`\r\n- Docs: `/stacks/hooks#kind-step-run-a-step-type` and `#reacting-to-success-or-failure`\r\n- The `http` step type used in the Slack example lands in a separate PR; the bridge works today with every registered step type.\r\n\r\n</details>\r\n\r\n<details>\r\n  <summary>Skip fork autofix and refresh setup-go pins @osterman (#2659)</summary>\r\n\r\n## what\r\n\r\n- Skip the `atmos.ci` `autofix` job when a pull request comes from a fork.\r\n- Keep the existing `atmos-pro[bot]` loop guard and same-repo PR autofix behavior.\r\n- Refresh eight `actions/setup-go` `v6` SHA pins to match the current upstream `v6` tag.\r\n\r\n## why\r\n\r\n- Fork PRs do not receive OIDC, repo variables, or writable credentials, so `atmos pro commit` cannot authenticate or push fixes.\r\n- Skipping the job avoids guaranteed red checks for external contributors while preserving formatting automation for internal PRs.\r\n- The `verify` workflow checks that SHA-pinned actions match their tag comments; the previous `setup-go` pins pointed at `v6.4.0` while labeled as `v6`.\r\n\r\n## references\r\n\r\n- Validated with workflow YAML parsing, upstream tag checks for `actions/setup-go`, and commit hook `check yaml`.\r\n\r\n</details>\r\n\r\n<details>\r\n  <summary>feat(workflows): http step type (webhook alias) with retries @osterman (#2641)</summary>\r\n\r\n## what\r\n\r\n- Add a native `http` workflow/custom-command step (`type: http`) that performs an HTTP request — any verb (`GET`/`POST`/`PUT`/`PATCH`/`DELETE`/`HEAD`/`OPTIONS`), `query` string parameters, `headers`, and a request body via `body` (raw) or `form` (urlencoded, or JSON when `Content-Type` is JSON).\r\n- Keep `webhook` as a first-class **alias** for `http` (`type: webhook` behaves identically) for the fire-a-notification use case. This adds alias support to the step registry: `NewBaseHandler` is variadic for aliases, `Get()` resolves aliases, and `List`/`Count` report only the canonical entry (no duplicate step type).\r\n- Per-attempt `timeout` and `retry` that composes with the existing `retry:` policy; retry is HTTP-aware (transport errors, `5xx`, and `429` retry by default, other `4xx` fail fast, and `retry.conditions` regexes force additional cases).\r\n- Configurable success criteria via `expect.status` (codes) and `expect.response` (regexes); the response body and status are captured as the step's value/metadata for downstream steps.\r\n- Schema fields on `WorkflowStep` and `Task` (so it works in both workflows and custom commands) plus the `HTTPExpect` struct, `ErrHTTPStep*` sentinels, JSON manifest updates, docs, an `examples/http-webhooks` example, a changelog blog post, and a roadmap milestone.\r\n\r\n## why\r\n\r\n- Calling external endpoints (notify a service, trigger a CI job, hit a deployment webhook, poll a health check) previously required shelling out to `curl`, which isn't portable (Windows), is awkward to template, and gets no first-class timeout/retry handling.\r\n- The step is a general-purpose, verb-agnostic **outbound** HTTP client, so `http` is the accurate name (an inbound callback receiver is what \"webhook\" conventionally means); `webhook` is retained as an alias so the evocative name still works.\r\n- Extended/registry step types are not wrapped by the legacy `retry.Do` path that `shell`/`atmos` use, so the handler applies retry itself via `retry.WithPredicate` — which is what enables status-code-aware retry decisions a generic wrapper can't make.\r\n\r\n## references\r\n\r\n- Docs: [workflow step types](/workflows) and [custom commands](/cli/configuration/commands)\r\n- Changelog: `website/blog/2026-06-20-http-step-type.mdx`\r\n\r\n</details>\r\n\r\n<details>\r\n  <summary>feat(workflows): add `say` step for audible TTS notifications @osterman (#2640)</summary>\r\n\r\n## what\r\n\r\n- Add a new `say` workflow step type that speaks its `content` aloud using text-to-speech, and gracefully degrades to printing the message as a Markdown blockquote when no speech engine is available or when running in CI/headless.\r\n- Introduce a reusable cross-platform `pkg/say` package (mirroring `pkg/browser`) that detects macOS `say`, Linux `spd-say`/`espeak`/`espeak-ng`, and Windows PowerShell `System.Speech`, behind a `Speaker` interface with a `CommandRunner` DI seam and functional options.\r\n- Support a CSS font-family-style `voice` list (first installed voice on the host wins), a `rate` field (`slow`/`normal`/`fast`), and a `print` policy (`fallback`/`always`/`never`); add the matching `Voice`/`Rate`/`Print` fields to `WorkflowStep` and sentinel errors `ErrSayNotFound`/`ErrVoiceListUnsupported`.\r\n- Add an `examples/say-something/` reference example, workflow step-type docs, an announcement blog post, and a roadmap milestone under the Workflows Overhaul initiative.\r\n\r\n## why\r\n\r\n- Long-running workflows often outlast your attention; `say` gives an audible cue when a workflow finishes or needs input, going beyond the bell-only `alert` step by announcing what happened.\r\n- Shelling out to `say` only works on macOS — this makes audible notifications portable across macOS/Linux/Windows and safe in CI, so the same workflow runs unchanged everywhere and never fails on a missing engine.\r\n\r\n</details>\r\n\r\n<details>\r\n  <summary>feat(hooks): CI annotations and SARIF upload for scanner findings @osterman (#2631)</summary>\r\n\r\n## what\r\n\r\n- Surface scanner-hook findings (Checkov, Trivy, KICS) in CI **beyond the job summary**:\r\n  - **`ci.annotations`** (default on) — inline GitHub `::error`/`::warning` annotations anchored at each finding's file and line on the PR diff. The non-Code-Scanning path: needs **no** GitHub Advanced Security.\r\n  - **`ci.results`** (default off) — upload the raw SARIF to **GitHub Code Scanning** (Security tab) natively, with no `github/codeql-action` step. Analysis category is auto-derived from the scan target so per-component uploads don't overwrite each other.\r\n- Implemented as **native CI provider capabilities** (`Annotator`, `SARIFReporter`) — siblings of the existing check-run/comment/summary capabilities — not as hooks. All three reporting outputs (`ci.summary`/`ci.annotations`/`ci.results`) are gated by `ci.enabled`.\r\n- **Custom hooks** opt in by adding `format: sarif` to a `kind: command` hook — any SARIF-emitting tool (tfsec, semgrep, gitleaks, …) gets findings, annotations, and upload with no Go code.\r\n- Docs (incl. required GitHub Actions permissions), a changelog blog post, and a roadmap milestone.\r\n\r\n## why\r\n\r\n- The CI job summary (#2617) gave a readable report, but the two richest GitHub surfaces — inline PR annotations and tracked Code Scanning alerts — were missing even though the data was already in the parsed SARIF.\r\n- Modeling this as provider capabilities (rather than reviving the deprecated `ci.*` hook *kinds*) keeps CI reporting where it belongs and lets every SARIF-emitting hook, built-in or custom, participate through one shared path.\r\n\r\n## references\r\n\r\n- Builds on #2617 (scanner findings → CI job summary) and completes the CI-reporting direction from #2614.\r\n- **Note:** base is `main`; #2617 is not yet merged, so this PR's diff currently includes #2617's commits — they drop out once #2617 merges and this branch is rebased.\r\n\r\n</details>\r\n\r\n<details>\r\n  <summary>feat(container): persistent container component kind + compositions @osterman (#2645)</summary>\r\n\r\n## what\r\n\r\nAdds a stack-scoped, Atmos-native **`container` component kind** — one component is one persistent service — plus first-class **compositions** membership.\r\n\r\n- **Lifecycle** (`atmos container <verb> <component> -s <stack>`): `build`, `push`, `pull`, `run`, `up`, `ps`, `logs`, `exec`, `restart`, `stop`, `rm`, `down`. Long-running containers are discovered by labels derived from the canonical instance address `<stack>/container/<component>` (name `atmos-<stack>-container-<component>`), not local state files. `up`/`run` build the image first when `vars.build`-style `build:` is set and the image is missing.\r\n- **First-class config** — `image`, `build`, `run` are top-level component sections (reusing the workflow container-step structs `ContainerBuildStep`/`ContainerRunStep`), **not** nested under `vars`. Container app env comes from the component `env:` section.\r\n- **`atmos container list`** shows per-instance running state (running/stopped/unknown), discovered by label. The generic **`atmos list components`** lists containers as a component type without container-specific status — consistent with terraform/ansible (there is no `atmos terraform list`/`atmos ansible list`).\r\n- **Compositions** — a first-class `composition:` membership field + a top-level `compositions:` section (closed for membership, open for fulfillment). Operating a component with undeclared membership is a hard error; `atmos composition validate <name> -s <stack>` reports fulfilled vs. not-provided services.\r\n- **Deep merge** — the custom-component fallback now runs `metadata.inherits` inheritance + generic deep-merge of all top-level keys, so container honors catalog/abstract defaults like built-in kinds. Abstract components are rejected for execution and filtered from listings.\r\n- Extends the describe-component auto-detect and the describe/list type whitelist for `container` (and fixes the pre-existing `ansible` gap in `list components`).\r\n\r\n## why\r\n\r\nContainers should be first-class, addressable component instances like terraform/helmfile/packer/ansible, and `atmos list components` should show whether each is running. A set of container components grouped by a `composition` is \"our own Compose\" with no `compose.yaml`. Implements `docs/prd/container-components.md`.\r\n\r\n## references\r\n\r\n- PRD: `docs/prd/container-components.md`, `docs/prd/compositions.md`\r\n- Examples: `examples/container-component/`, `examples/compositions/`\r\n- Docs: `website/docs/cli/commands/container/`, `website/docs/components/container.mdx`\r\n- Contributor skill: `.claude/skills/atmos-core-component-development/`\r\n\r\n> [!NOTE]\r\n> Stacked on `osterman/container-step-prd` (the container **step**), not `main`. Changelog/roadmap are not required for this base (the gate is main-only); they'll go on the PR that brings the container feature to `main`.\r\n\r\n</details>\r\n\r\n<details>\r\n  <summary>docs(ci): document github/artifacts planfile runtime-token requirement + E2E test @osterman (#2649)</summary>\r\n\r\n## what\r\n\r\n- **Planfile storage works end-to-end in CI.** The `github/artifacts` store talks to the GitHub Artifacts runtime API for both upload and download, so a planfile uploaded by a `plan` job can be consumed by a separate `deploy` job in the same run.\r\n- **Automatic, configurable drift verification on `deploy`.** When planfile storage is configured and `atmos terraform deploy` runs under CI, Atmos downloads the stored plan, re-plans, compares them with a semantic JSON plan-diff, and applies the verified plan — failing on drift by default. Configurable via `components.terraform.planfiles.verify` (`fail | warn | off`) and `--verify-plan` / `--no-verify-plan` (CLI > config > CI default).\r\n- Generalized the in-repo `github-runtime` action to advertise planfiles, documented the runtime-token requirement, and added the automatic-flow `planfile-verify-e2e` workflow (kept the manual `planfile-artifacts-e2e`).\r\n\r\n## why\r\n\r\n- The same-run plan→deploy handoff (the core CI use case) was broken: GitHub's REST API won't serve an in-progress run's artifact, and verification was opt-in and undocumented.\r\n- A planfile legitimately varies between review and apply (values known-after-apply, computed fields, hashes, ordering). A naive diff rejects a still-valid plan as \"drifted\"; the semantic comparison tolerates benign variation while catching real drift — which is what makes plan-then-deploy practical.\r\n- Verification belongs on `deploy` (which re-runs `plan`, so a fresh plan exists to diff against), not `apply` (which never re-plans).\r\n\r\n## references\r\n\r\n- Docs: [Planfile Storage](https://atmos.tools/ci/planfile-storage), [Planfile drift verification](https://atmos.tools/components/terraform/planfiles#drift-verification), [`atmos terraform deploy`](https://atmos.tools/cli/commands/terraform/deploy)\r\n- Changelog: `website/blog/2026-06-22-native-ci-planfile-verification.mdx`\r\n\r\n</details>\r\n\r\n<details>\r\n  <summary>feat: native container steps for workflows and custom commands @osterman (#2626)</summary>\r\n\r\n## what\r\n\r\n- Add a native `type: container` step (`build` / `push` / `run`) to the shared step library used by both workflows and custom commands, built on the existing `pkg/container` Docker/Podman runtime (new ephemeral one-shot runner plus image build/tag/push/inspect helpers; `ImageInspect` added to the `Runtime` interface, mocks regenerated).\r\n- Formalize **step outputs**: every named step exposes `value`/`values`/`metadata`/`outputs`/`skipped`/`error` (command-like steps add `stdout`/`stderr`/`exit_code`), so a build step can publish an image reference consumed by later push/run steps via `{{ .steps.<name>.outputs.<key> }}`.\r\n- Support per-step `identity` for registry auth and Docker Buildx + Buildx Bake builds; Podman uses the native `podman build` path.\r\n- Add the `examples/container-step` example and a hermetic GitHub Actions job (`[container-step]`) that exercises build → push → run against a `registry:2` service on `localhost:5000`, including failure-propagation.\r\n- Document the step type (`website/docs/workflows`), add a changelog blog post, and update the roadmap (container steps + step outputs marked shipped).\r\n- Land the design PRDs for the follow-on primitives — `container-components.md`, `compose-components.md`, and a rewritten membership-based `compositions.md` — and trim `container-actions-and-step-outputs.md` to cover only the procedural step. Remove the earlier `targets:`-based composition scaffolding (`pkg/composition`, `cmd/composition`, the composition step, and `schema.Composition*`) in favor of those PRDs.\r\n- Split the container-step handler into focused files and reduce complexity to satisfy the lint gate.\r\n\r\n## why\r\n\r\n- Atmos workflows and custom commands increasingly resemble CI pipelines; running containers natively (build images, push to registries, run tools) removes the need for one-off shell scripts and keeps the same automation usable locally and in CI.\r\n- A first-class step-outputs contract lets build → push → run/deploy pipelines pass structured values without shell parsing or temporary env files.\r\n- The procedural container **step** is the shippable foundation; the **component** kinds (container, compose) and **compositions** are specified as PRDs so the broader system can be designed and reviewed before implementation, without blocking this PR.\r\n\r\n## references\r\n\r\n- PRDs: `docs/prd/container-actions-and-step-outputs.md`, `docs/prd/container-components.md`, `docs/prd/compose-components.md`, `docs/prd/compositions.md`\r\n- Changelog: `website/blog/2026-06-17-native-container-steps.mdx`\r\n- Roadmap initiative: \"Container Composition & Local Development\" in `website/src/data/roadmap.js`\r\n\r\n</details>\r\n\r\n<details>\r\n  <summary>docs: add Custom to the Component Library @osterman (#2638)</summary>\r\n\r\n## what\r\n\r\n- Add a **Custom** entry to the Component Library so command-backed custom component types are discoverable alongside Terraform/OpenTofu, Helmfile, Packer, and Ansible.\r\n- New page `website/docs/components/custom.mdx` explaining custom component types (with a minimal Script Runner example and a native-vs-custom comparison), linking to the existing reference and changelog rather than duplicating them.\r\n- Wire the new page into the Component Library sidebar (`website/sidebars.js`) after Ansible.\r\n- Surface custom types in the Component Library overview (`components-overview.mdx`) — a pointer under the Component Types table and a Next Steps bullet.\r\n\r\n## why\r\n\r\n- Custom component types already shipped and are fully documented under `cli/configuration/commands#custom-component-types`, but a user browsing the Component Library never saw them as a first-class option — the nav didn't match the actual capability.\r\n- This is a docs-only change (`no-release`): no behavior changes, and the feature already has its own changelog post.\r\n\r\n## references\r\n\r\n- Reference: `/cli/configuration/commands#custom-component-types`\r\n- Changelog: `/changelog/custom-component-types`\r\n\r\n</details>\r\n\r\n<details>\r\n  <summary>feat: support description in component metadata @osterman (#2634)</summary>\r\n\r\n## what\r\n\r\n- Add an optional `description` field to component `metadata`.\r\n- Update the embedded, test-fixture, and published website JSON schemas to allow `metadata.description`.\r\n- Document the field in the component metadata reference and quick-start guides, and demo it in the quick-start example.\r\n- Add a schema validation test (`pkg/datafetcher/schema_metadata_validation_test.go`) verifying both the embedded and website schemas accept `metadata.description`.\r\n- Add a changelog blog post and a shipped roadmap milestone.\r\n\r\n## why\r\n\r\n- Lets users document the purpose of a component inline, right next to its configuration — especially useful when many components share the same Terraform root module with different configs.\r\n- The field is purely informational: it does not change how a component is processed, planned, or applied, so the change is safe and additive (component `metadata` is already a free-form map at runtime, so no Go changes were required).\r\n- Schema support gives editors auto-completion and validation for the new field.\r\n\r\n## references\r\n\r\n- Component metadata docs: [/stacks/components/component-metadata](https://atmos.tools/stacks/components/component-metadata)\r\n\r\n</details>\r\n\r\n<details>\r\n  <summary>feat: terminal steps - tty/interactive fields and exec step type @osterman (#2602)</summary>\r\n\r\n## what\r\n\r\n**Terminal steps for custom commands and workflows** — three related capabilities:\r\n\r\n- `interactive: true` — attach host stdin and let the step own Ctrl-C. Atmos suspends its SIGINT-exit handler while the step runs (new `pkg/signals` suspension registry consulted by the `main.go` signal handler).\r\n- `tty: true` — allocate a pseudo-terminal (reusing `pkg/terminal/pty`, same engine as `atmos devcontainer attach`). The command sees a real TTY; secret masking is applied to PTY output. With `interactive: true`, the host terminal switches to raw mode so Ctrl-C flows through the PTY to the child.\r\n- `type: exec` — replace the Atmos process entirely (shell `exec` semantics): `execve` of the system shell on Unix (env, working directory, and terminal inherited natively; `ATMOS_SHLVL` unchanged), spawn-and-propagate-exit-code emulation on Windows. Validated to be the final step; `tty`/`interactive`/`retry`/`timeout`/`output` are rejected on exec steps.\r\n\r\nArchitecture: all logic lives in narrow packages — `pkg/process` (`RunShellStep` routing, `RunShellSession`, `ReplaceShellSession`), `pkg/schema` (validation), `pkg/signals` (interrupt suspension). `cmd/` and `internal/exec` contain only inline switch-case call sites; `pkg/runner` and the step handler share the same routing.\r\n\r\nAlso fixes in `pkg/terminal/pty` found along the way:\r\n- stdin copier no longer blocks completion (it's detached, docker-CLI pattern)\r\n- session teardown is bounded: when grandchildren (e.g. aws ssm's `session-manager-plugin`) keep the PTY slave open after the child exits, output drains on a 1s deadline instead of hanging with the terminal in raw mode\r\n- `DisableStdinForward` for `-t`-without-`-i` semantics\r\n\r\n## why\r\n\r\nCustom commands had no way to hand the terminal to an interactive process:\r\n\r\n```yaml\r\ncommands:\r\n  - name: ssh\r\n    steps:\r\n      - type: shell\r\n        command: \"exec aws ssm start-session --target {{ .Arguments.instance_id }}\"\r\n```\r\n\r\nran the SSM session as a piped, masked subprocess: full-screen rendering broke, and Ctrl-C inside the session killed Atmos itself (global SIGINT handler exits 130), killing the orphaned session with SIGPIPE.\r\n\r\nWith this change:\r\n\r\n```yaml\r\ncommands:\r\n  - name: ssh\r\n    steps:\r\n      - type: shell\r\n        tty: true\r\n        interactive: true\r\n        command: \"aws ssm start-session --target {{ .Arguments.instance_id }}\"\r\n```\r\n\r\nbehaves like `docker run -it` (supervised: masking preserved, more steps can follow), and:\r\n\r\n```yaml\r\n      - type: exec\r\n        command: \"aws ssm start-session --target {{ .Arguments.instance_id }}\"\r\n```\r\n\r\nhands the process over entirely (launcher: native job control, zero proxy overhead, must be the last step).\r\n\r\n## references\r\n\r\n- Reported in SweetOps Slack (SSM session via custom command gets a mangled terminal and dies with SIGPIPE on Ctrl-C); teardown hang + raw-terminal-after-exit reproduced live on this PR and fixed\r\n- Docs: [Interactive and TTY Steps](https://atmos.tools/cli/configuration/commands#interactive-and-tty-steps)\r\n\r\n</details>\r\n\r\n<details>\r\n  <summary>feat(secrets): declarative secrets management with !secret, CRUD CLI, and masking @osterman (#1911)</summary>\r\n\r\n## what\r\n\r\nImplements the **Secrets Management PRD** end to end — a GitOps-friendly, multi-cloud secrets workflow built on top of the existing store registry (not a parallel backend). Secrets are **declared** in stack config (committed to git) and their **values** live in a cloud secret backend or a SOPS-encrypted file, managed with a Vercel-like CLI and resolved at runtime with a new `!secret` YAML function.\r\n\r\n### Stores (`pkg/store`)\r\n- `StoreConfig` gains `secret: true` (subsystem membership) and `kind` (cloud/thing) with legacy `type` mapping; `!store` against a `secret: true` store is now an error (\"use `!secret`\").\r\n- New `DeletableStore` / `StatusStore` / `SecretAwareStore` interfaces; AWS SSM writes `SecureString` when used as a secret backend and gains `Delete`/`Has`.\r\n- **New store backends:** AWS Secrets Manager and HashiCorp Vault (KV v2). Registry refactored to a table-driven builder map; `kind`↔`type` compatibility.\r\n\r\n### Secrets core (`pkg/secrets`)\r\n- `service`, declaration `registry`, `resolver`, `validator`, `kinds`, and a leaf `pkg/secrets/providers/` subpackage with a store-adapter (track 1) and a native **SOPS** provider (track 2: `age`/`aws-kms`/`gcp-kms`/`gpg`).\r\n- SOPS providers can be defined in `atmos.yaml`, **globally in a stack** (`secrets:` top-level merges into every component), or under a single component.\r\n\r\n### `!secret` + masking (the headline)\r\n- `!secret NAME [| path ...] [| default ...]` wired into the live YAML pipeline, with automatic masker registration.\r\n- **Mask-without-retrieval:** inspection commands (`describe`, `list`) resolve `!secret` to `<MASKED>` **without contacting the backend** when masking is on (the default) — so you can inspect a stack with **no cloud credentials**. Value-producing commands (`secret get`, `terraform plan/apply`) always retrieve; `--mask`/`ATMOS_MASK` only controls redaction of display output.\r\n- Sensitive Terraform outputs (`sensitive = true`) auto-register with the masker as they flow through `!terraform.output` / `atmos.Component()` / `describe`.\r\n\r\n### CLI (`cmd/secret`)\r\n`init`, `set` (alias `add`), `get`, `delete` (alias `rm`), `list`, `pull`, `push`, `import`, `validate`.\r\n\r\n### Stack processing\r\n`secrets` is now a first-class inheritable component section, plus a global stack-level `secrets:` block that merges into every component.\r\n\r\n### Docs + example\r\n- Full Docusaurus docs: `atmos secret` overview + all 9 subcommands, secrets configuration page, `!secret` function page; blog post (with an embedded example) and a roadmap milestone.\r\n- **`examples/sops-secrets/`** — fully self-contained, age-encrypted, **no cloud credentials**. Bundled `atmos test` custom command (`.atmos.d/test.yaml`) proves the full lifecycle end to end (set → encrypted-at-rest → get → list → validate → masked-without-credentials inspection → reveal-needs-key).\r\n\r\n## why\r\n\r\nThere was no unified way to manage human-provisioned secrets in Atmos — stores were designed for machine-written Terraform outputs, and the historical workaround (Chamber) was AWS-only. This adds explicit, declarative secret registration so a secret must be declared before it can be set, read, or resolved, and makes \"inspect a stack\" decoupled from \"authenticate to the secret backend.\"\r\n\r\n## references\r\n\r\n- PRD: `docs/prd/secrets-management.md` and `docs/prd/secrets-masking/`\r\n- Example: `examples/sops-secrets/` (run `atmos test`)\r\n\r\n## notes / follow-ups\r\n\r\n- Fixed a pre-existing init-ordering bug where the global `--mask=false` **flag** did not disable the early-initialized I/O masker (only `ATMOS_MASK=false` did). `io.ReconcileMasking()` now reconciles the masker after flags are parsed, so `--mask=false` and `ATMOS_MASK=false` behave identically.\r\n- `pkg/store` backend implementations could be moved into a `pkg/store/providers/` subpackage (mirroring `pkg/secrets/providers/`) — deferred to a dedicated follow-up PR since it touches ~30 external call-sites.\r\n- Base-component (`metadata.component`) inheritance of the `secrets` section is not wired yet (component-level + `import:` + global-stack inheritance all work).\r\n\r\n</details>\r\n\r\n<details>\r\n  <summary>feat(terraform): registry cache, RC management, and multi-platform mirror @osterman (#2582)</summary>\r\n\r\n## what\r\n\r\n- Add a transparent Terraform/OpenTofu **registry cache**: an ephemeral local HTTPS network-mirror proxy (`pkg/http/proxy`, `pkg/terraform/{cache,registry}`) that caches providers and modules in the canonical `filesystem_mirror` layout, enabled with `components.terraform.cache.enabled: true`.\r\n- Add the `atmos terraform cache` command group — `list`, `stats`, `prune`, `delete`, plus `mirror` (alias `warm`) for eager multi-platform pre-seeding and `trust`/`untrust` for the proxy certificate.\r\n- Add declarative Terraform **CLI-config (`.terraformrc`) management** via `components.terraform.rc`, exposed to the subprocess through `TF_CLI_CONFIG_FILE`/`TOFU_CLI_CONFIG_FILE`.\r\n- Add a first-class `components.terraform.platforms` setting (target `<os>_<arch>` list) that drives **both** eager `atmos terraform cache mirror` pre-seeding (`--all`/`--components`/`--query`/`-s`, package-manager-style TUI, `--format json|yaml`) **and** automatic completion of `.terraform.lock.hcl`.\r\n- Keep `.terraform.lock.hcl` complete across platforms: a built-in `after.terraform.init` provisioner runs `terraform/tofu providers lock -platform=…` for the declared `platforms` whenever a customized provider installation method (the default plugin cache, or the registry cache) is active. Because it runs after `init`, it sees the fully JIT-vendored and code-generated working directory, so the generated provider set (including stack-config provider versions) is what gets locked — and committed lock files install cleanly on every platform in a fleet.\r\n- Generate and cache a self-signed loopback certificate so the proxy can serve HTTPS (required by Terraform/OpenTofu network mirrors); trusted automatically via `SSL_CERT_FILE` on Linux/CI and via a one-time `atmos terraform cache trust` on macOS/Windows.\r\n- Add `examples/caching` (auto-installs OpenTofu via the toolchain), PRDs, command + configuration docs, blog posts, and a roadmap update.\r\n\r\n## why\r\n\r\n- Repeated and CI runs re-download the same providers and modules; the cache eliminates that, keeps runs working through registry outages, and preserves the exact versions a deployment used.\r\n- Atmos enables a provider plugin cache (`TF_PLUGIN_CACHE_DIR`) by default, and network mirrors behave the same way: Terraform can no longer record the registry's signed cross-platform checksums, so `init` writes a `.terraform.lock.hcl` with hashes for only the current platform and prints the \"Incomplete lock file information for providers\" warning. Declaring `components.terraform.platforms` lets Atmos complete the lock automatically for every target platform.\r\n- The lazy proxy only caches the host platform, so mixed CI/developer fleets and air-gapped reproducible builds need declarative multi-platform pre-seeding — `components.terraform.platforms` + `cache mirror` provide it.\r\n- Declarative `rc` lets teams manage provider mirrors, credentials, and other CLI-config directives from `atmos.yaml` instead of per-machine `.terraformrc` files.\r\n\r\n## references\r\n\r\n- Closes #2150\r\n- `docs/prd/terraform-registry-cache.md`, `docs/prd/terraform-rc-management.md`, `docs/prd/terraform-registry-cache-tls.md`\r\n\r\n</details>\r\n\r\n<details>\r\n  <summary>feat: Atmos Git — foundational capability for GitOps enablement @osterman (#2597)</summary>\r\n\r\n## what\r\n\r\nAtmos Git: Git becomes a foundational platform capability, on par with Toolchain, Auth, and Hooks — the enablement layer for GitOps workflows where Atmos commits generated artifacts to a source-of-truth repository. PRD: `docs/prd/git-ops.md`.\r\n\r\n- **Top-level `git` config** — `git.repositories.<name>` declares managed repositories (uri, branch, remote, clone depth/filter/single-branch/submodules, `auth.identity`, `commit.signing`/`commit.author`, `push.retries`), `git.hooks` declares local Git hooks, `git.list` configures list output. Workdirs default to automatic XDG cache locations (`$XDG_CACHE_HOME/atmos/git/repositories/<name>`) so the native CI cache captures and restores managed clones.\r\n- **`pkg/git` service** — provider registry (registry pattern) with the `cli` provider in v1 (chosen because GitHub STS materializes credentials as `GIT_CONFIG_*` env vars, which subprocess git honors and go-git ignores). Clone is defined as *reconcile* (clone-if-absent, else fetch + checkout + ff-only) so stale CI-cache restores are just faster clones. Safety rules: ff-only pull, no force push ever, push retry-with-rebase on non-fast-forward rejection, path-scoped commits that fail on unrelated dirty files, worktree path-traversal validation, per-invocation commit author injection (CI runners need no `user.name`), provenance trailers (`Atmos-Stack`, `Atmos-Component`, `Atmos-Source-SHA`).\r\n- **`atmos git` command group** — `clone`, `pull`, `status`, `diff`, `commit`, `push`, `list`, `clean`, plus `git hooks install|uninstall|run`, registered under the **Git** help group. `--all` bulk operations (bounded concurrency, attempt-all with `errors.Join`). Clone accepts configured names, plain URLs, and go-getter `git::...?ref=&depth=` URIs. No-arg clone in native CI (`ci.enabled: true`) infers the current repository from CI metadata and clones into the workspace — an `actions/checkout` replacement. `atmos list git-repositories` alias registered.\r\n- **`git` hook kind** — publishes generated artifacts on lifecycle events (`after.terraform.apply`, ...) to the current repository by default or a named managed repository, with templated commit messages, trailers, clean no-ops, and push-after-commit with retry. Inherits `--skip-hooks` and `on_failure`.\r\n- **Local Git hook shims** — `atmos git hooks install` writes worktree-aware `.git/hooks/*` shims (marker-protected, `--force` to overwrite, warns when `core.hooksPath` is set); `run` dispatches configured commands with stdin forwarding and exit-code propagation.\r\n- **Error handling** — new sentinels (`ErrGitRepositoryNotFound`, `ErrGitAuthFailed`, `ErrGitPushRejected`, `ErrGitDirtyUnmanagedFiles`, `ErrGitPathEscapesWorktree`, `ErrGitHookNotConfigured`, `ErrGitRepositoryRequired`, `ErrGitProviderNotFound`) with error-builder hints and exit-code mapping. Git stderr streams to the masked writer and is never embedded in error chains.\r\n- **Docs & example** — command pages under `website/docs/cli/commands/git/`, `git` configuration reference, hook kind docs, changelog blog post (`atmos-gitops`), roadmap milestone (CI/CD Simplification initiative), and a GitOps publishing demo at `examples/gitops` (reconcile → review → publish against a managed deployment repo via custom commands).\r\n\r\n### What this is — and isn't\r\n\r\nAtmos owns the **publishing side** of GitOps: render → diff → commit → push, with centralized safety rules. Reconciliation stays with the consumer — Argo CD or Flux pulls from the repository, or CI applies on merge. There are no agents and no drift-correction loop in Atmos itself (explicit non-goal in the PRD); Atmos is the producer feeding the reconciler. This also isn't a replacement for the existing GitHub Actions plan/apply integration — it's the Git plumbing those pipelines use.\r\n\r\n## why\r\n\r\nGitOps workflows have always needed glue: ad hoc scripts to render manifests into deployment repos, commit them, survive push races, and wire credentials. Atmos already owns rendering, lifecycle events, toolchain, and credentials (GitHub STS) — this PR gives it the Git operations between them, with centralized safety rules instead of per-pipeline shell scripts. It is the foundation for Kubernetes deployment-repository provisioning (Argo CD / Flux rendered-manifest publishing, on the kubernetes component branch) and a future `github` provider for pull-request-based publishing to protected branches.\r\n\r\n## references\r\n\r\n- PRD: `docs/prd/git-ops.md` (in this PR)\r\n- Coverage: `pkg/git` 86%, `pkg/git/providers/cli` 88%, `pkg/hooks/kinds/git` 94%, `cmd/git` 81%\r\n- Related: native CI cache (XDG-root archiving) and the Kubernetes component branch (consumes `provision.git` next)\r\n\r\n</details>\r\n\r\n<details>\r\n  <summary>feat: support dotenv files in !include @osterman (#1930)</summary>\r\n\r\n## Summary\r\n\r\nAdds explicit dotenv file support to the existing `!include` YAML function. Dotenv files now resolve to maps, so they can be used directly in CLI and stack `env` sections and with YAML merge keys.\r\n\r\n```yaml\r\nenv:\r\n  <<: !include .env\r\n  AWS_REGION: us-east-2\r\n```\r\n\r\nDotenv files can also be layered with YAML merge sequences. This uses YAML's `<<` merge-key syntax, the same YAML mechanism commonly used with anchors and aliases:\r\n\r\n```yaml\r\nenv:\r\n  <<:\r\n    - !include .env.local\r\n    - !include .env\r\n  AWS_REGION: us-east-2\r\n```\r\n\r\nYAML merge sequence precedence is earlier item wins, and inline keys under `env` override all merged values.\r\n\r\n## What Changed\r\n\r\n- Parse `.env`, `.env.*`, and exact `*.env` filenames as dotenv files when used with `!include`\r\n- Support `env: !include .env` and `env: { <<: !include .env }` / block merge forms in stack config\r\n- Support dotenv `!include` in `atmos.yaml` `env`, including merge sequences for layered dotenv files\r\n- Preserve `!include.raw` behavior for raw file contents\r\n- Keep `.envrc` and `foo.env.local` unsupported/raw; Atmos does not auto-load or execute dotenv files\r\n- Preserve YAML custom tags during schema validation so `env: !include .env` satisfies stack manifest schema rules\r\n- Update the stack manifest JSON schema description for `env` to document the `!include` string form\r\n- Document dotenv includes in both CLI `env` and stack `env` docs, including YAML merge-key behavior, include path resolution, and layered files\r\n- Add a short blog post for explicit dotenv inclusion\r\n- Add a roadmap milestone entry for the shipped dotenv `!include` support\r\n- Add coverage-focused tests for dotenv merge-key retry handling, include path helpers, case-preservation helpers, and YAML custom-tag conversion\r\n- Harden the LocalStack demo provider config to use the local edge endpoint directly, path-style S3, and skip AWS account-ID discovery so Terraform does not hang before reaching LocalStack in CI\r\n\r\n## Tests\r\n\r\n- `cd examples/demo-localstack && ATMOS_IDENTITY=false go run ../.. describe component demo -s dev --format json --logs-level Off | jq '.providers.aws'`\r\n- `cd examples/demo-localstack && ATMOS_IDENTITY=false go run ../.. validate stacks --logs-level Off`\r\n- `go test ./pkg/config ./pkg/validator ./pkg/filetype`\r\n- `go test ./internal/exec -run 'TestGenerateProviderOverrides|TestGenerateProviderOverridesForAliases|TestProcessStackConfigProviderSection'`\r\n- `go test ./pkg/config ./pkg/validator -coverprofile=.context/dotenv-include-coverage.out`\r\n- `go test ./pkg/utils -run 'TestInclude(Dotenv|ExtensionBased|RawFunction|WithNoExtension)'`\r\n- `node -e \"import('./website/src/data/roadmap.js').then(() => console.log('roadmap import ok'))\"`\r\n- `git diff --check`\r\n- Real stack manifest schema regression: `env: !include .env` validates against `tests/fixtures/schemas/atmos/atmos-manifest/1.0/atmos-manifest.json`\r\n- Commit hooks passed: go-fumpt, Go build, go mod tidy, golangci-lint, whitespace/EOF/large-file checks\r\n\r\n</details>\r\n\r\n<details>\r\n  <summary>feat(ci): GitHub Actions build cache (atmos ci cache) @osterman (#2579)</summary>\r\n\r\n## what\r\n\r\n- Add a **CI build cache** that restores the well-known Atmos cache root (`~/.cache/atmos` — toolchain binaries, vendored components, remote import clones, provider/plugin caches) at startup and saves it at exit, using the same store `actions/cache` uses (GitHub Actions **Cache Service v2**).\r\n- New `atmos ci cache` subcommands: `restore`, `save`, `list`, `delete` — so the lifecycle can run in one invocation or be spread across CI steps.\r\n- New `ci.cache` configuration block (`enabled`, `auto: off|restore|save|both`, `root`, `paths`, `key`, `restore_keys`, `compression`) with `ATMOS_CI_CACHE_*` env overrides.\r\n- Model it as a CI-provider **capability** (`provider.CacheProvider` + `ci.DetectCache()`) with a backend registry (`pkg/ci/cache`) and a GitHub Actions implementation (`pkg/ci/cache/github`), mirroring the existing artifact subsystem; outside a runner it's a clean no-op.\r\n- Consolidate the default toolchain install path under the XDG **cache** root (`~/.cache/atmos/toolchain`) so a single cache captures it; add a PRD, command/config docs, blog post, and roadmap entry.\r\n\r\n## why\r\n\r\n- In CI, every job re-downloads the toolchain, providers, and modules from upstream — wasting time/bandwidth and exposing runs to transient and rate-limit failures. Persisting the cache root across jobs makes executions faster, more reliable, and reduces supply-chain exposure.\r\n- Teams otherwise hand-wire an `actions/cache` step and own the `key`/`path` logic themselves; Atmos already knows its cache root and can derive a stable key from `toolchain.lock.yaml` + OS/arch, so it's two settings to enable.\r\n- Cache entries are write-once; a per-run state marker makes automatic and manual usage idempotent (an exact-key hit on restore skips the save), so the same operations work whether triggered automatically or via the subcommands.\r\n\r\n## references\r\n\r\n- PRD: `docs/prd/native-ci/framework/ci-cache.md`\r\n- Docs: `/cli/commands/ci/cache` and `/cli/configuration/ci/cache`\r\n- GitHub Actions Cache Service v2 (the store `actions/cache` uses)\r\n\r\n</details>\r\n\r\n\r\n## 🚀 Enhancements\r\n\r\n<details>\r\n  <summary>Warn on explicit version constraint overrides @osterman (#2670)</summary>\r\n\r\n## what\r\n\r\n- Downgrade version constraint failures to structured `log.Warn` messages when an explicit version override is present.\r\n- Detect overrides from `--use-version`, `ATMOS_VERSION_USE`, `ATMOS_USE_VERSION`, and `ATMOS_VERSION`, while keeping config-only `version.use` enforcement unchanged.\r\n- Preserve fatal errors for invalid constraint syntax and add coverage for non-semver override binaries like `test`.\r\n\r\n## why\r\n\r\n- `--use-version ref:*` can re-exec into unreleased binaries that report `version.Version == \"test\"`, which previously failed constraint validation before the requested command could run.\r\n- Explicit overrides are intentional, so Atmos should continue with a warning that explains the bypass instead of enforcing the configured constraint.\r\n\r\n## references\r\n\r\n- Closes #2668\r\n\r\n</details>\r\n\r\n<details>\r\n  <summary>fix(validate): dogfood `atmos validate stacks` for example YAML; fix nil-map crash @osterman (#2666)</summary>\r\n\r\n## what\r\n\r\n- Replace the deprecated third-party `InoUno/yaml-ls-check` GitHub Action in the `[validate]` CI matrix with Atmos itself, running `atmos validate stacks --schemas-atmos-manifest <in-repo schema>` against each example.\r\n- Expand the matrix to also validate three previously-excluded function-using examples (`custom-components`, `sops-secrets`, `onepassword-secrets`), which now pass because Atmos understands its own YAML tags natively.\r\n- Fix a crash in `atmos validate stacks --schemas-atmos-manifest`: it panicked with `assignment to entry in nil map` when the target `atmos.yaml` had no `schemas:` section. Added a lazy-initializing `SetSchemaRegistry` setter and a regression test.\r\n\r\n## why\r\n\r\n- The third-party action targets Node 20 and is force-run on Node 24, emitting deprecation warnings across every `[validate]` job; it also can't parse Atmos YAML tags, which forced many examples to be excluded from validation.\r\n- `atmos validate stacks` is a strict superset of the old static check (YAML syntax + manifest JSON Schema + import resolution + duplicate-component detection) and parses Atmos tags natively — better coverage with no external dependency. Pointing `--schemas-atmos-manifest` at the in-repo schema lets a PR add a schema field and use it in an example in the same change.\r\n- Dogfooding immediately surfaced and fixed a real user-visible crash in the validate command.\r\n\r\n## references\r\n\r\n- `quick-start-advanced` and `native-terraform` are intentionally left out of the matrix (documented inline): the former's `stacks/workflows/*.yaml` uses newer workflow step types the manifest schema doesn't describe yet, and the latter intentionally configures no `stacks.name_pattern`.\r\n\r\n</details>\r\n\r\n<details>\r\n  <summary>fix(hooks): store-output hooks inherit the run's default identity @aknysh (#2662)</summary>\r\n\r\n## what\r\n\r\n- Make the terraform after-apply `store-outputs` hook path inherit the run's auto-detected identity for\r\n  stores that don't declare their own `identity`, matching the main terraform path.\r\n- Add a new `internal/exec.HookStoreDefaultIdentity` helper (auto-detect the active identity from the\r\n  auth manager's chain, normalize empty/`select`/`disabled` to `\"\"`); `cmd/terraform`'s\r\n  `injectHookStoreAuthResolver` now calls `SetAuthContextResolverWithDefaultIdentity` instead of the\r\n  resolver-only variant.\r\n- Fix an adjacent bug: `pkg/store.defaultIdentityForStore` was missing `*SecretsManagerStore`\r\n  (`aws/asm`), so AWS Secrets Manager stores never inherited a default identity on **any** path. Added\r\n  the case so `aws/asm` behaves like `aws/ssm`.\r\n- Tests: `internal/exec.TestHookStoreDefaultIdentity` (new), `cmd/terraform`\r\n  `TestInjectHookStoreAuthResolver_InheritsDefaultIdentity` (replaces `…_ResolverOnly`), updated\r\n  `pkg/store` default-identity test so identity-less `aws/asm` asserts inheritance, and Floci E2E\r\n  `TestAWSStoreHooks_InheritedIdentity_FlociE2E` with fixture `aws-store-hooks-floci-inherit`.\r\n- Fix doc: `docs/fixes/2026-06-27-store-hook-inherit-default-identity.md`.\r\n\r\n## why\r\n\r\n- **Hook fix.** Under Atmos auth, `atmos terraform apply` on a component with a `store-outputs` hook\r\n  applied successfully but then failed in the hook when the target store had no `identity`:\r\n\r\n  ```text\r\n  INFO  Running hooks event=after.terraform.apply status=success\r\n  ✓ Fetching <output> from <component> in <stack>\r\n  Error: failed to assume write role: … get identity: get credentials:\r\n  failed to refresh cached credentials, no EC2 IMDS role found, … ec2imds: GetMetadata …\r\n  ```\r\n\r\n  Hooks run in a freshly-loaded config, so the apply-phase store registry (and its injected default\r\n  identity) is gone. The hook re-injected the resolver but **no** default identity, so identity-less\r\n  stores fell back to the default AWS SDK credential chain — empty under Atmos auth (credentials live\r\n  in the keyring, not the environment) — and dropped to EC2 IMDS. The main terraform path and `!store`\r\n  reads already inherit the run's identity; this removes a surprising asymmetry and completes the\r\n  follow-up explicitly deferred in #2625 (\"Component-identity inheritance for identity-less stores is\r\n  intentionally left for a follow-up design decision\").\r\n\r\n- **ASM fix.** `defaultIdentityForStore` handled `*SSMStore`, `*AzureKeyVaultStore`, and `*GSMStore`\r\n  but not `*SecretsManagerStore`, so `aws/asm` stores without an explicit `identity` could never\r\n  inherit one. This was latent before (and was even codified by the old test); the hook fix's E2E\r\n  surfaced it.\r\n\r\n- **Backward compatible.** `HookStoreDefaultIdentity` returns `\"\"` whenever no identity is resolved\r\n  (no auth manager, or empty/`select`/`disabled`), and `SetAuthContextResolverWithDefaultIdentity(\"\")`\r\n  is a no-op for the default — so runs without Atmos auth keep their prior ambient/default-SDK\r\n  credential behavior, and stores with an explicit `identity` are never overridden.\r\n\r\n## references\r\n\r\n- Follow-up to #2625 (AWS stores/secrets auth; deferred identity-less inheritance in the hook path).\r\n- Related fix docs: `docs/fixes/2026-06-17-aws-stores-secrets-auth-and-gists.md`,\r\n  `docs/fixes/2026-05-25-store-hook-missing-backend-role-assumption.md`.\r\n\r\n</details>\r\n\r\n<details>\r\n  <summary>fix(secret): skip remote-state reads in credential-free secret list @sgtoj (#2657)</summary>\r\n\r\n## what\r\n\r\n- Make credential-free `atmos secret list` skip the YAML functions that perform authenticated backend reads (`!terraform.state`, `!terraform.output`, `!store`, `!store.get`) while it enumerates secret declarations.\r\n- Add a `credentialFreeSkip()` helper and use it in the two credential-free paths: `secret list -s <stack>` enumeration and the single-scope `secret list -s <stack> -c <component>` path without `--verify`.\r\n- Authenticated paths (`get` / `set` / `exec` / `shell`, and `secret list --verify`) are unchanged — they keep skipping only `!secret`.\r\n- Adds `TestCredentialFreeSkip` pinning the skip set and a `docs/fixes` write-up.\r\n\r\n## why\r\n\r\n- Secret listing is intentionally credential-free: it disables authentication so a large stack doesn't run one full auth cycle per component. But it still evaluated `!terraform.state` / `!terraform.output` / `!store` in component `vars` / `settings`. With auth disabled, the S3 backend assumes its configured role with no base credentials, the AWS SDK falls back to the default credential chain, and ultimately dials the EC2 IMDS endpoint — unreachable on a workstation — so the command aborts with a confusing assume-role/credentials error **even immediately after a successful `atmos auth login`**.\r\n- Listing only needs the static `secrets.vars` declarations (`secrets.ExtractDeclarations`), which never require a resolved value. Evaluating these functions was unnecessary and failure-prone. A skipped function leaves its raw string in place, which the declaration extractor ignores, so discovery is unchanged.\r\n- This is a regression: before credential-free enumeration was introduced, `secret list` authenticated per component, so these reads had credentials (slow, but working). Disabling auth removed the credentials without removing the reads.\r\n\r\n## references\r\n\r\n- Related to #2639 (originally reported against `atmos secret list`).\r\n- Follow-up to #2646, which made secret-list enumeration credential-free but left the credentialed function evaluation in place.\r\n- Write-up: `docs/fixes/2026-06-23-secret-list-credential-free-skip.md`\r\n- Verified with `go test ./cmd/secret/...` and the repo's `custom-gcl` lint (both green), and end-to-end against a multi-account repo whose components reference cross-account `!terraform.state`: `secret list -s <stack>` aborted before, completes after (no state reads, no credential-resolution fallbacks).\r\n\r\n</details>\r\n\r\n<details>\r\n  <summary>fix(auth): retry transient auth on freshly-brokered STS git clones @osterman (#2653)</summary>\r\n\r\n## what\r\n\r\n- Retry transient git authentication failures within a bounded window (default 30s, exponential backoff + jitter) **only** when Atmos brokered a fresh GitHub STS token this process — wired through a new `broker.HasBrokeredCredentials()` signal and a `CustomGitGetter.RetryAuthErrors` flag (existing per-source `retry:` config still takes precedence).\r\n- Keep auth failures terminal (fail fast) for non-brokered/static-credential clones, so a genuinely wrong or expired token is never masked by retries.\r\n- Surface previously-swallowed credential-broker failures at `Warn` (was `Debug`, invisible at the default `Warning` log level) and log an actionable `Error` when the brokered-auth retry window is exhausted.\r\n- Add tests: brokered retry succeeds, non-brokered fails fast, bounded-budget exhaustion, and a `-race` concurrency guard proving `EnsureCredentials` provisions exactly once with a happens-before barrier.\r\n\r\n## why\r\n\r\n- Under Atmos Pro cross-repo STS, `atmos vendor pull` intermittently failed with `fatal: Authentication failed` even though the same run logged a successful token mint and OIDC auth — a subset of clones failed and a rerun was clean.\r\n- Root cause is GitHub's brief post-creation 401 window: a just-minted installation token is not yet valid across all of GitHub's git frontends. The atmos-pro server already self-heals its own API calls on this 401 (Sentry `APP-CLOUDPOSSE-COM-AM2`), but the CLI git path did not — `isRetryableGitError` treated auth as terminal and vendor sources have no retry by default, so the earliest clones failed hard.\r\n- This gives the CLI the same tolerance the server has, scoped narrowly to brokered tokens so static credentials still fail fast, and removes the observability gap that made the failure hard to diagnose.\r\n\r\n## references\r\n\r\n- Token TTL is GitHub's standard ~60 min (confirmed in atmos-pro `mint.ts` / token-provider), ruling out mid-run expiry; the post-mint propagation window is the cause.\r\n- Follow-up (out of scope): `revoke_on_exit` cross-process token race on the shared, unlocked github/sts `state.json`.\r\n\r\n</details>\r\n\r\n<details>\r\n  <summary>perf(stacks): dedupe per-identity auth in nested terraform.state resolution @sgtoj (#2656)</summary>\r\n\r\n## what\r\n\r\n- Extends the per-component `AuthManager` memoization introduced in #2652 from the top-level `describe stacks` pass into the **nested** resolution path that runs while templates and YAML functions are evaluated (`!terraform.state`, `!terraform.output`, `atmos.Component(...)`).\r\n- Adds a process-scoped `nestedAuthManagerCache`, consulted by `resolveAuthManagerForNestedComponent`, keyed by the parent auth chain + a deterministic JSON fingerprint of the component's auth section.\r\n- Extracts the key logic into a shared `buildComponentAuthCacheKey` used by **both** the processor cache (#2652) and this nested path, so the two keying strategies cannot drift.\r\n- Caches only successful, non-nil resolutions; `ResetStateCache()` also clears the new cache (kept consistent with the `terraformStateCache` it pairs with). Neither is reset in production.\r\n\r\n## why\r\n\r\n- #2652 deduped per-component auth at the **top level**, but a component that references another component via `!terraform.state` still ran a **full auth cycle** (credential writes, file locks, keyring rebuilds) once per **distinct target** — even when every target resolves to the **same identity**. `terraformStateCache` only short-circuits a repeat read of the *same* target, not distinct targets that share an identity.\r\n- The result was the same N-auth blowup #2652 removed, just relocated into template/YAML resolution. Memoizing by identity removes it.\r\n\r\n**Measured** — `atmos describe stacks -s <stack>` on a large real-world stack (credentials provided via `auth exec`, 45s cap; only the binary under test varies):\r\n\r\n| build                          | wall time   | per-component auth cycles |\r\n| ------------------------------ | ----------- | ------------------------- |\r\n| latest release                 | DNF (>45s)  | —                         |\r\n| `main` (includes #2652)        | ~17–19s     | 44                        |\r\n| this PR (#2652 + nested dedup) | **~10–11s** | **5**                     |\r\n\r\nOutput was verified equivalent to `main`: the remaining run-to-run differences are pre-existing `auto_provision_workdir_for_outputs` / `tofu output` provisioning nondeterminism present on **both** builds (same identity resolved throughout, no new errors). A matched-output pair differed by fewer lines than the `main`-vs-`main` noise floor.\r\n\r\nThe nested path is shared by `describe affected`, `list`, and `terraform --all/--query`. On a large multi-component change, the full per-identity auth cycles during `describe affected` likewise drop from scaling with the number of resolved components to roughly one-per-identity, with the rest served from the cache.\r\n\r\n## test plan\r\n\r\n- `go build ./... && go test ./internal/exec/...` — new unit tests cover key behavior, dedupe-by-identity, parent-chain isolation, errors-not-cached, unserializable-section-not-cached, and the `ResetStateCache` coupling.\r\n- `custom-gcl run --new-from-rev=main` → 0 issues.\r\n- Real-repo benchmark above.\r\n\r\n## references\r\n\r\n- Related to #2639\r\n- Builds on #2652\r\n- Design notes: `docs/fixes/2026-06-22-dedupe-nested-component-auth.md`\r\n\r\n</details>\r\n\r\n<details>\r\n  <summary>fix(describe): respect metadata.enabled when evaluating component functions @sgtoj (#2655)</summary>\r\n\r\n## what\r\n\r\n- Respect `metadata.enabled` when the shared describe pipeline (`describe affected`, `describe stacks`, `list`) evaluates a component's functions:\r\n  - **`!terraform.state` / `!terraform.output`** are skipped for components disabled via `metadata.enabled: false` — the raw function string is left unresolved (no backend read).\r\n  - **`atmos.Component(...)`** returns empty sections (including an empty `outputs`) when the *enclosing* component is disabled — no describe, no state read, and template-safe (`.outputs.x` / `.vars.x` evaluate to nil instead of erroring).\r\n- The gate keys strictly on `metadata.enabled` (via the existing `isComponentEnabled`), **independent of `vars.enabled`**.\r\n\r\n## why\r\n\r\n- `describe affected` describes the current and base stacks and evaluates every component's templates/YAML functions with no `metadata.enabled` gate. A component disabled with `metadata.enabled: false` that references an unprovisioned component's state therefore failed hard with `terraform state not provisioned` — even though disabled components are (correctly) excluded from the final affected list. The enabled-aware filters (`shouldSkipComponent`, `FilterAbstractComponents`) only run when assembling that list, after the describe phase has already failed.\r\n\r\nFixes #2654.\r\n\r\n## references\r\n\r\n- Fixes #2654\r\n- Design notes: `docs/fixes/2026-06-22-describe-respect-metadata-enabled.md`\r\n\r\n## test plan\r\n\r\n- Unit tests: `disabledComponentTerraformSkip` (adds the terraform funcs, clones the base skip), `enclosingComponentDisabled` (nil/absent metadata ⇒ enabled; `vars.enabled:false` alone ⇒ enabled; `metadata.enabled:false` ⇒ disabled), `componentFunc` returns empty sections for a disabled enclosing component, and an end-to-end `processComponentEntry` test (disabled ⇒ `!terraform.state` not resolved; enabled / `vars.enabled:false`-only ⇒ resolved).\r\n- `go build ./...`, `go vet ./internal/exec/...`, and `custom-gcl run --new-from-rev=main` (0 issues).\r\n\r\n> Note: the `TestDescribeAffected*` integration tests are environment-sensitive and fail identically on a clean `main` checkout locally (macOS); they are unrelated to this change. CI (Linux) is authoritative.\r\n\r\n</details>\r\n\r\n<details>\r\n  <summary>fix(stacks): scope and cache per-component auth in describe stacks @sgtoj (#2652)</summary>\r\n\r\n## what\r\n\r\n- Move the stack and component filters above `resolveComponentAuthManager` in `processComponentEntry` so only in-scope components authenticate (auth still precedes `BuildTerraformWorkspace`, template, and YAML-function processing).\r\n- Add a pass-scoped auth cache keyed by the parent chain + a deterministic JSON fingerprint of the component auth section, so components that share an auth section reuse one authenticated manager.\r\n- Regression tests: out-of-scope skip + cache reuse.\r\n\r\n## why\r\n\r\nAny auth-enabled `ExecuteDescribeStacks` caller — `atmos describe stacks`, `atmos list values`/`instances`, `atmos terraform --all`/`--query` — resolves per-component auth **before** the stack/component filters and never reuses it. On a multi-stack repo where components declare their own `default: true` identity, `atmos describe stacks -s <stack>` authenticates components in **other** stacks before discarding them, and re-authenticates each same-identity component from scratch — so the command effectively hangs.\r\n\r\nPer-component auth exists only to populate `info.AuthContext` for that component's later template (`atmos.Component(...)`) and YAML-function (`!terraform.state`, `!terraform.output`) processing, which is skipped for filtered-out components — so authenticating them is wasted work.\r\n\r\n#2646 fixed `atmos secret list` by disabling per-component auth for that command; it did not touch the shared processor, so every other caller still hits this.\r\n\r\n**Measured** with the identical command `atmos describe stacks -s <stack> --logs-level Debug` under a 45s budget, only the atmos binary varying:\r\n\r\n| binary                       | result                                                                  |\r\n| ---------------------------- | ----------------------------------------------------------------------- |\r\n| latest release (v1.221.1)    | did not complete within 45s (authenticating mostly out-of-scope stacks) |\r\n| current `main` (`aa68d85be`) | did not complete within 45s                                             |\r\n| this PR                      | completed in ~18s                                                       |\r\n\r\nWith the fix, in-scope processor-path authentications drop to **2** and out-of-scope ones to **zero** (the ~42 remaining auths are legitimate nested `!terraform.output` / `atmos.Component` reads).\r\n\r\n## references\r\n\r\n- Related to #2639; supersedes #2642 and #2644.\r\n- Fix write-up: `docs/fixes/2026-06-22-describe-stacks-scope-and-cache-per-component-auth.md`\r\n\r\n</details>\r\n\r\n<details>\r\n  <summary>fix(secrets): fast, credential-free atmos secret list @osterman (#2646)</summary>\r\n\r\n## what\r\n\r\n- Make `atmos secret list` require **no authenticated identity** and **never decrypt** — it only reports whether each secret is *set*. On a 72-component stack, listing drops from ~21–34s (it previously authenticated every component and decrypted every secret) to effectively instant.\r\n- Disable per-component authentication during secret-list stack enumeration.\r\n- Resolve SOPS initialization status from the file's cleartext key names — no age key, no decryption.\r\n- Rewrite **every** store's existence check (`Has`) to a non-decrypting metadata API: SSM `GetParameter` with `WithDecryption=false`, Secrets Manager `DescribeSecret`, GCP `GetSecretVersion`, Azure Key Vault properties pager, Vault KV metadata read, and a no-reveal 1Password check.\r\n- Add a tri-state `STATUS` (`initialized` / `missing` / `unknown`) plus a new `--verify` flag: remote-store status shows `unknown` by default; `--verify` contacts backends with a read/describe identity (never a decrypt identity) on a fully-scoped target.\r\n\r\n## why\r\n\r\n- Listing is introspection — it shows which secrets are declared and whether they exist, and never needs a plaintext value, so it should not force authentication or decryption (or require `kms:Decrypt`-style permissions).\r\n- The old path authenticated per component and fetched+decrypted every secret just to populate the status column, making `secret list` slow (and prone to hanging) on real-world stacks and unusable without cloud credentials.\r\n- Existence on a remote store still needs a read credential, so those rows now default to `unknown` (credential-free) and opt into a real check via `--verify`, while local backends (SOPS) always show accurate status for free.\r\n\r\n## references\r\n\r\n- Supersedes the per-component auth-cache approach in #2644 (its `atmos secret list` workload is fully addressed here); follows #2642.\r\n- Docs: `website/docs/cli/commands/secret/list.mdx`; changelog: `fast-credential-free-secret-list`.\r\n\r\n</details>\r\n\r\n<details>\r\n  <summary>fix(secrets): SOPS cloud-KMS secrets authenticate via Atmos identity @osterman (#2643)</summary>\r\n\r\n## what\r\n\r\n- `atmos secret` and `!secret` (during `terraform plan`) against a SOPS cloud-KMS backend now authenticate using the Atmos identity — `--identity` / `ATMOS_IDENTITY`, the per-provider `secrets.providers.<name>.identity`, or the stack/component effective identity — instead of requiring ambient cloud credentials.\r\n- The cloud is inferred from the SOPS file's master-key type at runtime (AWS KMS / GCP KMS / Azure Key Vault); there is no per-cloud `kind`. Credentials are injected into the in-process getsops encrypt/decrypt via `ApplyToMasterKey` (no process-environment mutation).\r\n- Refactors SOPS into its own package `pkg/secrets/providers/sops/` with a registry of per-cloud key handlers (`aws.go` / `gcp.go` / `azure.go`); the cloud-SDK credential building lives in the depguard-exempt `pkg/store/sopsauth/` bridge so the SOPS package imports no cloud SDK directly.\r\n- Threads the auth resolver + effective identity to the provider via a transient `AtmosConfiguration.SecretsAuth` seam, populated in both the `atmos secret` and terraform code paths.\r\n- Fixes the SOPS decrypt error to emit identity/permission hints for cloud-KMS files (derived from the file's actual key types) instead of the misleading age-key hint.\r\n\r\n## why\r\n\r\n- Resolves #2637: the documented `secrets.providers.<name>.identity` field and `--identity` were silently ignored for the SOPS cloud-KMS track, forcing every command to be wrapped in `atmos auth exec` even though Track-1 stores (SSM/ASM/Key Vault/Secret Manager) already authenticated via the identity.\r\n- The fix is additive and backward compatible: with no resolvable identity, the SOPS provider falls back to the ambient credential chain exactly as before. `kind` remains only for the legitimate age-vs-KMS keygen distinction.\r\n- Covered by a Floci KMS end-to-end test (ambient AWS creds cleared, identity-only `secret set`/`get` — the exact #2637 scenario, RED before this change) plus unit tests for key-service selection, per-cloud registry dispatch, identity precedence, and kind-aware error hints.\r\n\r\n## references\r\n\r\n- Closes #2637\r\n- `docs/fixes/2026-06-20-sops-cloud-kms-identity.md` (root cause, fix, and full backend audit)\r\n\r\n</details>\r\n\r\n<details>\r\n  <summary>Add Atmos media kit and CI branding @osterman (#2636)</summary>\r\n\r\n## what\r\n\r\n- Add an Atmos media kit page, blog announcement, brandkit redirect, and generated ZIP download workflow.\r\n- Add logo, wordmark, animated gradient, Atmos CI, and Atmos AI SVG variants for light and dark surfaces.\r\n- Update native Terraform CI summaries and fixtures to use the Atmos CI lockup linking to https://atmos.tools/ci.\r\n\r\n## why\r\n\r\n- Provide a canonical source for Atmos brand assets and usage guidance.\r\n- Align CI summary branding with Atmos instead of the Cloud Posse logo.\r\n- Keep animated treatment assets downloadable and consistent across docs, media kit, and CI output.\r\n\r\n## references\r\n\r\n- Validation: `go test ./pkg/ci/plugins/terraform`\r\n- Validation: `pnpm exec docusaurus build`\r\n\r\n</details>\r\n\r\n<details>\r\n  <summary>Fix AWS store auth and add Floci E2E coverage @osterman (#2625)</summary>\r\n\r\n## what\r\n\r\n- Fix AWS SSM/Secrets Manager store auth during hooks, describe, and secret commands, including inherited identities and secret-store access enforcement.\r\n- Make slash kind notation canonical, add AWS store/secrets gists, document the fix, and add custom endpoint support for AWS, GCP Secret Manager, and Azure Key Vault.\r\n- Add opt-in Floci E2E tests and CI coverage for AWS, GCP, and Azure store/secrets workflows.\r\n\r\n## why\r\n\r\n- The reported SSM hook workflow could fall back to ambient AWS credentials or fail with a missing auth resolver even when the Terraform identity was valid.\r\n- The feature needed full-circle examples plus emulator-backed regression coverage so AWS stores and declared secrets stay working across providers.\r\n\r\n## references\r\n\r\n- No issue linked.\r\n\r\n</details>\r\n\r\n<details>\r\n  <summary>Fix use-version before command resolution @osterman (#2629)</summary>\r\n\r\n## what\r\n\r\n- Run explicit `--use-version` / `ATMOS_USE_VERSION` re-exec before Cobra resolves subcommands.\r\n- Add regression coverage for env var, `--use-version=...`, and `--use-version ...` forms with commands unknown to the current binary.\r\n- We also took the liberty of adding a few unrelated, test-only coverage improvements to satisfy Codecov; these do not change production behavior.\r\n\r\n## why\r\n\r\n- Cobra rejected newly added commands before `PersistentPreRun` could switch Atmos versions.\r\n- This restores the workflow for testing new commands from `ref:`, `sha:`, and PR Atmos builds.\r\n\r\n## references\r\n\r\n- Closes #2624\r\n- Tested with `go test ./cmd -run 'UseVersion|UnknownSubcommand|ParseUseVersion'` and `go test ./pkg/version -run 'CheckAndReexec|UseVersion|RefVersion'`.\r\n\r\n</details>\r\n\r\n<details>\r\n  <summary>fix(toolchain): harden cosign verifier bootstrap @osterman (#2627)</summary>\r\n\r\n## what\r\n\r\n- Keep verifier bootstrap version resolution latest-first, using the existing authenticated GitHub/Aqua lookup path.\r\n- Add a `sigstore/cosign@v3.0.6` fallback only when latest-version lookup fails.\r\n- Add Renovate regex-manager coverage for the fallback cosign version so the safety pin is updateable.\r\n- Update installer tests to prove latest wins when available, cosign falls back when lookup fails, and non-pinned verifier lookup errors still surface.\r\n\r\n## why\r\n\r\n- Prevent OpenTofu toolchain installs from failing when cosign auto-install hits a slow or unavailable GitHub releases API.\r\n- Avoid making the fallback version the default forever; normal installs still use the latest resolved cosign release when GitHub lookup succeeds.\r\n- Preserve existing escape hatches: existing `cosign` on `PATH` still wins, and `verifier_install: path_only` still disables auto-install.\r\n\r\n## references\r\n\r\n- Failing run: https://github.com/cloudposse/atmos/actions/runs/27661641040/job/81808473011\r\n- Fallback cosign release: https://github.com/sigstore/cosign/releases/tag/v3.0.6\r\n\r\n</details>\r\n\r\n<details>\r\n  <summary>test: stabilize Terraform cache coverage @osterman (#2620)</summary>\r\n\r\n## what\r\n\r\n- Add environment overrides for `components.terraform.cache.enabled` and `components.terraform.cache.location`, plus docs in the Terraform config and environment variable references.\r\n- Add focused registry-cache coverage, including Windows-safe trust command unit tests and a non-golden acceptance test with an isolated cache location.\r\n- Stabilize acceptance CI provider reuse with a process-level `TF_PLUGIN_CACHE_DIR` under the Atmos XDG cache root, and bump the CI cache key so `actions/cache` saves a fresh provider-plugin cache.\r\n\r\n## why\r\n\r\n- The native registry cache should be testable on Windows only after its loopback certificate is trusted, but it should not be enabled globally where cold/warm cache state can flip snapshots or screenshots.\r\n- Windows timeout mitigation should use Terraform’s provider plugin cache, which avoids the native cache proxy TLS trust problem.\r\n- The new environment overrides make targeted cache dogfooding possible without editing shared fixture `atmos.yaml` files.\r\n\r\n## references\r\n\r\n- Related context from #2607.\r\n- Validated with `go test ./pkg/config -run 'TestViperBindEnv_.*Cache'`, `go test ./pkg/terraform/cache -run 'Test.*Trust|Test.*Windows'`, `go test ./tests -run TestTerraformRegistryCache -timeout 10m`, and `git diff --check`.\r\n\r\n</details>\r\n\r\n<details>\r\n  <summary>refactor(utils): drop dead helpers and hand-rolled SliceContainsString @osterman (#2608)</summary>\r\n\r\n## what\r\n\r\n- Replace the hand-rolled `SliceContainsString` / `SliceContainsStringHasPrefix` / `SliceContainsStringStartsWith` helpers with stdlib `slices.Contains` / `slices.ContainsFunc` across ~39 call sites, and remove the helpers from `pkg/utils`.\r\n- Delete nine dead exported functions that had zero callers anywhere: `ExtractAtmosConfig`, `GetGitHubRepoReleases`, `GetGitHubReleaseByTag`, `GetGitHubLatestRelease`, `PrintAsHcl`, `NewHighlightWriter` (plus the now-orphaned `HighlightWriter` type/method), `GetAtmosConfigJSON`, `PrintAsJSONToFileDescriptor`, and `PrintAsYAMLWithConfig` — including the now-empty `config_utils.go` and cascaded-unused imports/aliases.\r\n- Convert two `depends_on` dynamic errors in `stack_utils.go` to wrapped static errors (`ErrDependencyResolution`); their messages now carry a `dependency resolution failed:` prefix.\r\n\r\n## why\r\n\r\n- First step in dismantling `pkg/utils`, one of the repo's historical \"dumping grounds\" — `CLAUDE.md` already forbids adding to it, so this begins draining it.\r\n- `slices.Contains` is the identical O(n) scan as the deleted helper (the hot path in `yaml_utils.go` already uses an O(1) map), so there is no behavior or performance change from the swap; it also drops a per-call `perf.Track` defer.\r\n- The static-error conversion satisfies the `err113` lint gate after a flagged `if/else` chain was restructured into early returns, and aligns with the mandatory static-error policy.\r\n\r\n## references\r\n\r\n- Internal cleanup; no issue. Follow-up PRs will relocate the remaining `pkg/utils` files into purpose-built packages (`pkg/yaml`, `pkg/filesystem`, `pkg/data`, etc.).\r\n\r\n</details>\r\n\r\n<details>\r\n  <summary>fix(terraform): restore init + workspace in terraform shell, add --skip-init @osterman (#2616)</summary>\r\n\r\n## what\r\n\r\n- Restore `terraform init` and Terraform workspace `select`/`new` to `atmos terraform shell` so the interactive shell again starts in an **initialized** component and the **correct workspace** (not `default`).\r\n- Extract a provisioner-free `executeTerraformInitCommand` from `executeTerraformInitPhase` so the shell can run `init` without re-firing the `before.terraform.init` provisioners it already runs (no double execution). Main `ExecuteTerraform` pipeline behavior is unchanged.\r\n- The shell now resolves the terraform/tofu binary (and toolchain), generates backend/provider-override files, and assembles the full component environment before launching — matching the shared pipeline.\r\n- Add a `--skip-init` opt-out to `atmos terraform shell` (reuses the existing terraform flag; no new flag definition). Workspace selection stays governed by `workspaces_enabled`.\r\n- Add regression tests for the init → workspace → shell ordering, the `--skip-init` decoupling, and the shell's `shouldRunTerraformInit`/`shouldSkipWorkspaceSetup` contract; document `--skip-init` in the command docs.\r\n\r\n## why\r\n\r\n- This was an accidental regression introduced in **v1.202.0** by #1813, which migrated `terraform shell` to a standalone `ExecuteTerraformShell` and silently dropped the `init` + workspace steps that the shared `ExecuteTerraform` pipeline used to run.\r\n- The result contradicted the published docs (which promise the command generates a backend file and creates the component's workspace) and forced users to pin old versions.\r\n- `--with-secrets` behavior is preserved: secrets are still kept out of the on-disk varfile and withheld from the shell unless explicitly requested.\r\n\r\n## references\r\n\r\n- Regression introduced in #1813 (first released in v1.202.0).\r\n\r\n</details>\r\n\r\n<details>\r\n  <summary>fix(templates): honor ignore_missing_template_values for stack name_template (#2345) @aknysh (#2619)</summary>\r\n\r\n## what\r\n\r\n- Route the global `templates.settings.ignore_missing_template_values` flag into every stack `name_template` rendering site. Previously all 11 name-template `ProcessTmpl(...)` call sites passed a hardcoded `false`, so the flag was silently ignored for name-template rendering.\r\n- Sites updated: atlantis stack name, EKS cluster name, spacelift admin/stack name (describe affected), `describe locals` name, spacelift utils, terraform workspace, terraform generate backends/varfiles, the shared name-template util, and validate stacks.\r\n- Add `TestBuildTerraformWorkspace_IgnoreMissingTemplateValues` asserting both directions (flag off → error; flag on → `<no value>`).\r\n- Incidental cleanup: `gofumpt` reformatting two adjacent pre-existing `fmt.Errorf` calls in `stack_utils.go` - `err113` debt under `golangci-lint --new-from-rev=origin/main`. Converted them to the mandated static-wrapped-error pattern (new sentinels `ErrInvalidDependsOn` / `ErrInvalidSettingsDependsOn` in `errors/errors.go`) with tests covering both resolution branches and the `errors.Is` behavior.\r\n\r\n## why\r\n\r\n- When a user sets `templates.settings.ignore_missing_template_values: true`, they still hit hard errors like `map has no entry for key \"...\"` whenever the error originated from rendering the stack `name_template` — because the name-template `ProcessTmpl` sites bypassed the flag.\r\n- The fix is behavior-preserving: the flag defaults to `false`, so existing configurations render exactly as before; behavior only changes for users who explicitly opt in.\r\n- The `err113` conversion follows the repository's mandated static-error pattern and keeps the pre-commit/CI lint green; messages are unchanged.\r\n\r\n## references\r\n\r\n- Closes #2345\r\n- Fix doc: `docs/fixes/2026-06-15-name-template-ignore-missing-template-values.md`\r\n\r\n\r\n<!-- This is an auto-generated comment: release notes by coderabbit.ai -->\r\n## Summary by CodeRabbit\r\n\r\n## Summary by CodeRabbit\r\n\r\n* **Bug Fixes**\r\n  * Updated template rendering to consistently honor `ignore_missing_template_values` across stack- and dependency-related name derivations (including Terraform workspace and generated stack naming).\r\n  * Added clearer error handling for invalid `depends_on` inputs via dedicated sentinel errors.\r\n\r\n* **Tests**\r\n  * Added regression tests covering enabled/disabled `ignore_missing_template_values` behavior and dependency resolution success/failure.\r\n\r\n* **Documentation**\r\n  * Added a documentation page explaining the corrected `ignore_missing_template_values` behavior for stack name template rendering.\r\n<!-- end of auto-generated comment: release notes by coderabbit.ai -->\r\n</details>\r\n\r\n<details>\r\n  <summary>fix(flags): scope --skip-hooks to the terraform command subtree @osterman (#2578)</summary>\r\n\r\n## what\r\n\r\n- **Scope `--skip-hooks` to the terraform command subtree.** The flag (and `ATMOS_SKIP_HOOKS`) moved off the global flag set onto `atmos terraform` and its subcommands, so it no longer appears in the help of unrelated commands (`auth`, `helmfile`, `atlantis`, `toolchain`, `about`, `secret`, …). Lifecycle hooks only ever run on `terraform plan/apply/deploy`.\r\n- **Stop tracking native-ci CI scratch output.** `tests/fixtures/scenarios/native-ci/{github-output,github-step-summary}.txt` are runtime artifacts; gitignored and untracked (matching the newer `native-ci-gha-plan` scenario).\r\n- **Standardize the CLI test suite on OpenTofu.** The suite forces `ATMOS_COMPONENTS_TERRAFORM_COMMAND=tofu` via a single test-harness default, gates every binary-invoking test on a precondition so a missing binary skips cleanly (instead of baking \"executable file not found\" into goldens), and sanitizes the harness-injected env var out of debug snapshots. A small parity set (`terraform -help/-version passthrough`) opts back into terraform.\r\n- **Provision test tooling via the Atmos toolchain (dogfooding).** `TestMain` installs any missing pinned binary (terraform/tofu/packer/helmfile/helm) through the Atmos toolchain itself and prepends it to `PATH` — \"install as necessary\", so CI (which supplies them via `setup-*` actions) downloads nothing while local runs become self-contained. No host binaries (brew, etc.) required.\r\n\r\n## why\r\n\r\n- `--skip-hooks` on every command was misleading — hooks only run on terraform. Mirrors the existing `--github-token`/toolchain scoping precedent.\r\n- The native-ci scratch files were tracked, so every local run without terraform dirtied them. They're CI artifacts, not fixtures.\r\n- Test runs depended on whatever terraform/tofu binary was on the host; a missing binary silently corrupted golden snapshots and tracked fixtures. Standardizing on a single, license-clean (MPL) OpenTofu — with explicit preconditions — makes the suite deterministic and host-independent. The product runtime default stays `terraform`; only tests change.\r\n- Provisioning tools through the toolchain dogfoods the feature and removes the dependency on host-installed binaries, so the suite runs the same way everywhere.\r\n\r\n## references\r\n\r\n- Follows the `--github-token`/toolchain flag-scoping precedent in `pkg/flags/global_builder.go`.\r\n\r\n</details>\r\n\r\n<details>\r\n  <summary>fix(toolchain): retry cosign verification on transport-level network errors @osterman (#2604)</summary>\r\n\r\n## what\r\n\r\n- Add a `transportFlakeMarkers` allowlist to the cosign retry classifier (`pkg/toolchain/verification/signature_rekor.go`) so transport-level network errors are retried like other transient Sigstore Rekor flakes:\r\n  - `stream error: stream ID` (Go `net/http2` stream errors — covers all HTTP/2 error codes and both send/recv variants)\r\n  - `connection reset by peer`\r\n  - `TLS handshake timeout`\r\n  - `i/o timeout`\r\n  - `unexpected EOF`\r\n- Extend `TestClassifyCosignError` with the exact error observed in CI plus one case per new marker, and add `TestRunCosignWithRetry_RecoversFromTransportFlake` covering end-to-end retry recovery.\r\n\r\n## why\r\n\r\nCI failed on `TestToolchainCustomCommands_InstallAllTools/Install_tofu` while `toolchain install opentofu/opentofu@1.9.0` was verifying the download signature. Cosign's query to the Sigstore Rekor transparency log died with:\r\n\r\n```\r\nsearching log query: stream error: stream ID 1; INTERNAL_ERROR; received from peer\r\n```\r\n\r\nAtmos already retries cosign flakes (`runCosignWithRetry`, 5 attempts with exponential backoff), but the retryable classification is a deliberate allowlist that only recognized Rekor *HTTP response* flakes (`searchLogQueryBadRequest`, the `IEEE_P1363` decode error, and 5xx scoped to the tlog retrieve endpoint). An HTTP/2 transport error matched none of the markers, so it surfaced on the first attempt with no retry.\r\n\r\nBroadening to transport-level failures is safe within the allowlist's design rule: the allowlist exists so a real signature verdict (tampering, identity mismatch, expired cert) is never silently retried away. A transport failure means the request never completed and no verdict was rendered, so retrying it categorically cannot mask tampering. Existing negative tests (tampered artifact, identity mismatch, generic failure) continue to assert those still fail on the first attempt.\r\n\r\n## references\r\n\r\n- Observed failure: Acceptance Tests (linux), `TestToolchainCustomCommands_InstallAllTools/Install_tofu`\r\n\r\n</details>\r\n","reactions":{"url":"https://api.github.com/repos/cloudposse/atmos/releases/347974492/reactions","total_count":1,"+1":0,"-1":0,"laugh":0,"hooray":0,"confused":0,"heart":0,"rocket":1,"eyes":0},"mentions_count":3},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/347786315","assets_url":"https://api.github.com/repos/cloudposse/atmos/releases/347786315/assets","upload_url":"https://uploads.github.com/repos/cloudposse/atmos/releases/347786315/assets{?name,label}","html_url":"https://github.com/cloudposse/atmos/releases/tag/v1.222.0-rc.15","id":347786315,"author":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"node_id":"RE_kwDOEW4XoM4UusxL","tag_name":"v1.222.0-rc.15","target_commitish":"main","name":"v1.222.0-rc.15","draft":false,"immutable":false,"prerelease":true,"created_at":"2026-07-01T21:26:42Z","updated_at":"2026-07-02T01:27:25Z","published_at":"2026-07-02T01:27:25Z","assets":[{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/463811996","id":463811996,"node_id":"RA_kwDOEW4XoM4bpTWc","name":"atmos_1.222.0-rc.15_darwin_amd64","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":263405952,"digest":"sha256:132d30827fb101e0b397a5b2e9d0706426e56a3a561f409b9baf975be6118af4","download_count":2,"created_at":"2026-07-02T01:26:26Z","updated_at":"2026-07-02T01:26:35Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0-rc.15/atmos_1.222.0-rc.15_darwin_amd64"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/463811922","id":463811922,"node_id":"RA_kwDOEW4XoM4bpTVS","name":"atmos_1.222.0-rc.15_darwin_arm64","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":247543282,"digest":"sha256:8a952cfa91f35e21ae899ddd4e11ecd7bf31e5ff6642dc2c81d3647dc5bed24c","download_count":1,"created_at":"2026-07-02T01:26:17Z","updated_at":"2026-07-02T01:26:26Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0-rc.15/atmos_1.222.0-rc.15_darwin_arm64"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/463811843","id":463811843,"node_id":"RA_kwDOEW4XoM4bpTUD","name":"atmos_1.222.0-rc.15_freebsd_amd64","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":256995500,"digest":"sha256:d86a5f330b80cd598db461122d4a43953dc21b6ea1ce8f9f4f5a2adf61de897f","download_count":1,"created_at":"2026-07-02T01:26:08Z","updated_at":"2026-07-02T01:26:18Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0-rc.15/atmos_1.222.0-rc.15_freebsd_amd64"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/463811844","id":463811844,"node_id":"RA_kwDOEW4XoM4bpTUE","name":"atmos_1.222.0-rc.15_freebsd_arm64","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":239272108,"digest":"sha256:d1e3fe2e309823b3d8168822afb14c7373051ec886d543c5dbd9a84e838344ef","download_count":1,"created_at":"2026-07-02T01:26:08Z","updated_at":"2026-07-02T01:26:17Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0-rc.15/atmos_1.222.0-rc.15_freebsd_arm64"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/463811842","id":463811842,"node_id":"RA_kwDOEW4XoM4bpTUC","name":"atmos_1.222.0-rc.15_linux_386","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":241479842,"digest":"sha256:f50c54a89192c3875c80474d2c52da941ff0b975969fbf0f0e52caba9600087f","download_count":1,"created_at":"2026-07-02T01:26:08Z","updated_at":"2026-07-02T01:26:17Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0-rc.15/atmos_1.222.0-rc.15_linux_386"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/463811921","id":463811921,"node_id":"RA_kwDOEW4XoM4bpTVR","name":"atmos_1.222.0-rc.15_linux_amd64","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":257831074,"digest":"sha256:046256de25df217ff86b7d75cff1822928855f76345d985e6467996942e7832a","download_count":4,"created_at":"2026-07-02T01:26:17Z","updated_at":"2026-07-02T01:26:26Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0-rc.15/atmos_1.222.0-rc.15_linux_amd64"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/463812002","id":463812002,"node_id":"RA_kwDOEW4XoM4bpTWi","name":"atmos_1.222.0-rc.15_linux_arm","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":241369250,"digest":"sha256:24d59574862ccc3b5aeca1a546033cda379a93013ddf648b9e263e7b36f1c845","download_count":1,"created_at":"2026-07-02T01:26:27Z","updated_at":"2026-07-02T01:26:33Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0-rc.15/atmos_1.222.0-rc.15_linux_arm"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/463811841","id":463811841,"node_id":"RA_kwDOEW4XoM4bpTUB","name":"atmos_1.222.0-rc.15_linux_arm64","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":240058530,"digest":"sha256:0951af89e38729e186218252069d0e21bf2e1a5f410699dac585feb58054ad5d","download_count":1,"created_at":"2026-07-02T01:26:08Z","updated_at":"2026-07-02T01:26:17Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0-rc.15/atmos_1.222.0-rc.15_linux_arm64"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/463812012","id":463812012,"node_id":"RA_kwDOEW4XoM4bpTWs","name":"atmos_1.222.0-rc.15_SHA256SUMS","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":1096,"digest":"sha256:6dae8c81e4fc8c217175eb6aa02d652cba53e60dfe9d751c5bb6c9d912c4f717","download_count":1,"created_at":"2026-07-02T01:26:27Z","updated_at":"2026-07-02T01:26:28Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0-rc.15/atmos_1.222.0-rc.15_SHA256SUMS"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/463811923","id":463811923,"node_id":"RA_kwDOEW4XoM4bpTVT","name":"atmos_1.222.0-rc.15_windows_386.exe","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/x-ms-dos-executable","state":"uploaded","size":246603776,"digest":"sha256:714eb84d1bf2d7df00a7df4a032f8f74a66bd6097424b7d5d81833219632e201","download_count":1,"created_at":"2026-07-02T01:26:17Z","updated_at":"2026-07-02T01:26:26Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0-rc.15/atmos_1.222.0-rc.15_windows_386.exe"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/463811999","id":463811999,"node_id":"RA_kwDOEW4XoM4bpTWf","name":"atmos_1.222.0-rc.15_windows_amd64.exe","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/x-ms-dos-executable","state":"uploaded","size":262140416,"digest":"sha256:70709d040400515a6433ff77687d91b2e0bc5948e3d811777827a4ece078fd67","download_count":1,"created_at":"2026-07-02T01:26:26Z","updated_at":"2026-07-02T01:26:35Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0-rc.15/atmos_1.222.0-rc.15_windows_amd64.exe"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/463811932","id":463811932,"node_id":"RA_kwDOEW4XoM4bpTVc","name":"atmos_1.222.0-rc.15_windows_arm64.exe","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/x-ms-dos-executable","state":"uploaded","size":241693696,"digest":"sha256:12ef1c14f3e3963e375dc81d838f7ad60221b6086b10fe8804f953ffbd837c72","download_count":1,"created_at":"2026-07-02T01:26:18Z","updated_at":"2026-07-02T01:26:27Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0-rc.15/atmos_1.222.0-rc.15_windows_arm64.exe"}],"tarball_url":"https://api.github.com/repos/cloudposse/atmos/tarball/v1.222.0-rc.15","zipball_url":"https://api.github.com/repos/cloudposse/atmos/zipball/v1.222.0-rc.15","body":"<details>\n  <summary>feat: local Terraform tests against cloud emulators @osterman (#2663)</summary>\n## what\n\n- Run `atmos terraform test` (Terraform's native `*.tftest.hcl` framework) against a local cloud **emulator** instead of a real cloud account, via a new `examples/terraform-tests` example.\n- Add `before.terraform.test` / `after.terraform.test` lifecycle events and wire `cmd/terraform/test.go` to capture output and fire them — which drives both component `hooks:` and the native-CI plugin from one place.\n- New `emulator` workflow **step type** that drives emulator up/down/reset, so declarative `kind: step` hooks can bring a sandbox up before tests and tear it down after (`when: always`), with no manual `atmos emulator up/down`.\n- Native-CI **job step summary** for `terraform test`: pass/fail/skip badges and a per-run results table, alongside the existing `plan`/`apply` summaries.\n- **Bug fix:** under the Podman runtime, `parsePodmanContainer` dropped the container `Ports` array, so the emulator endpoint resolved empty and Terraform silently hit **real AWS** (`403 InvalidAccessKeyId`). Podman's structured `Ports` are now parsed into `Info.Ports`.\n- Docs (emulator step type, hook events, job summaries, hooks guide), a changelog blog post, a roadmap milestone, and a `docs/fixes/` write-up for the Podman fix.\n\n## why\n\n- `terraform test`'s `apply` run blocks create real infrastructure, so they need a cloud account and spend and rarely run locally — pointing them at an emulator makes them free, hermetic, and identical local↔CI.\n- A single hook-events seam keeps the emulator lifecycle declarative (in the component) rather than a hand-written custom command, and reuses the existing `kind: step` machinery.\n- The Podman fix is required for any emulator-backed Terraform to reach the sandbox at all on Podman (it also fixes the existing `emulator-aws` example), and is documented in `docs/fixes/` rather than the changelog because it restores already-intended behavior.\n\n## references\n\n- Builds on the emulators feature (#2647).\n- Podman fix rationale: `docs/fixes/2026-06-27-podman-port-readback-emulator-endpoint.md`.\n- Changelog: `website/blog/2026-06-27-local-terraform-tests-with-emulators.mdx`.\n\n\n<!-- This is an auto-generated comment: release notes by coderabbit.ai -->\n\n## Summary by CodeRabbit\n\n* **New Features**\n  * Added support for `terraform test`, including CI summaries, test result parsing, JUnit output, and inline annotations.\n  * Introduced new workflow step and hook capabilities for emulator runs and ordered multi-step actions.\n  * Added support for fixture-based local Terraform tests against cloud emulators.\n\n* **Bug Fixes**\n  * Improved handling of Podman port detection to help emulator-backed runs reach the correct endpoint.\n\n* **Documentation**\n  * Updated docs and examples for Terraform tests, emulator workflows, hooks, and CI job summaries.\n\n<!-- end of auto-generated comment: release notes by coderabbit.ai -->\n</details>\n\n<details>\n  <summary>[codex] Fix mobile gutters and name runtime CSS @osterman (#2673)</summary>\n## what\n\n- Renamed the homepage runtime stylesheet from `landing-redesign.css` to `landing-runtime.css`.\n- Updated the homepage import to use the new runtime stylesheet name.\n- Tightened mobile and tablet hero CSS so the homepage content keeps consistent left/right gutters and CTA elements stay within the content column.\n- Added a more compact phone hero by reducing vertical spacing, scaling mobile type, hiding the heavier demo/runs band on small screens, centering the overall mobile content column, placing cloud logos in the whitespace to the right of the value props, and centering the CTA row.\n- Optimized the mobile AI section by hiding the decorative badge, reducing text scale/line-height, tightening spacing, and using left-aligned copy on phones.\n\n## why\n\n- Makes the stylesheet name describe the current homepage theme instead of a past redesign event.\n- Fixes the mobile homepage hero feeling clipped or overly left-aligned on narrow viewports without making the lower action area look disconnected.\n- Helps the primary mobile hero and AI section content fit better above the fold on common devices.\n- Protects the runtime hero from legacy broad landing-page header rules at responsive breakpoints.\n\n## references\n\n- Validation: pre-commit hooks passed during commit.\n- Validation: Docusaurus dev server compiled successfully with `src/css/landing-runtime.css` and `AISection/styles.css`.\n- Validation: `postcss.parse` passed for the updated CSS files.\n\n<!-- This is an auto-generated comment: release notes by coderabbit.ai -->\n## Summary by CodeRabbit\n\n* **New Features**\n  * Updated the landing page to use the runtime-themed stylesheet, including refreshed “New”/“Pro” badge styling and a reworked hero layout/spacing.\n* **Bug Fixes**\n  * Improved mobile responsiveness for the AI section and landing hero by refining typography, alignment, spacing, and gaps.\n  * Prevented CTA/content overflow on smaller screens and hid non-essential hero visuals to improve readability.\n* **Tests**\n  * Updated demo-globs test expectations to reflect the removed Docker Compose file.\n  * Adjusted proxy test server shutdown cleanup behavior.\n<!-- end of auto-generated comment: release notes by coderabbit.ai -->\n</details>\n\n<details>\n  <summary>feat: native Kubernetes components with GitOps deployment-repo delivery @osterman (#2607)</summary>\n## what\n\n- **Native `kubernetes` component type.** Define Kubernetes objects in stacks and run `atmos kubernetes render|diff|plan|apply|deploy|delete <component> -s <stack>` through the Kubernetes Go SDKs (server-side apply) — no `kubectl` or `kustomize` binary required.\n- Inputs can be **inline `manifests`, files/directories (`paths`), and Kustomize overlays**; full stack semantics (vars/env/auth/metadata/inheritance/overrides), `--all`/`--affected` DAG ordering, Atmos Auth (e.g. EKS) integration, and dotted lifecycle hooks (`before/after.kubernetes.*`).\n- **GitOps delivery via `provision.targets`.** `apply`/`deploy` deliver to a target selected by `kind`: `kubernetes` applies to the cluster (default), `git` renders the manifests and commits them to a managed Git deployment repository (Argo CD/Flux source-of-truth) instead. Selected with `--target` (precedence: `--target` → `provision.default` → implicit cluster), so existing components are unaffected.\n- New reusable, component-agnostic **target-provisioner registry** (`pkg/provisioner/target`, registry pattern) + a `ProvisionArtifact` model. The **git target** composes the `pkg/git` service: clone-reconcile a `git.repositories.<name>`, replace the managed templated `path` with the rendered files, path-scoped commit with provenance trailers, and push-with-retry. Credentials come from Atmos Auth (GitHub STS); `pull_request` publishing is deferred.\n- **Schema, LSP, docs, examples, changelog.** Typed `kubernetes` component and `provision.targets` in Go schema and both JSON schemas; LSP; command/config/stack docs; `examples/kubernetes` and `examples/kustomize`; a changelog blog post and a roadmap milestone.\n\n## why\n\n- Kubernetes should be orchestrated by the same stack-based engine as Terraform/Helmfile/Ansible — one set of inheritance, auth, and affected-detection — rather than shelling out to `kubectl`/`kustomize` from glue scripts.\n- GitOps pipelines have always needed ad hoc glue to render manifests into a deployment repo, commit, survive push races, and wire credentials. Atmos already owns rendering, lifecycle events, and authentication, so `provision.targets` adds the delivery step with centralized safety rules — the same component config can apply to a cluster in dev and publish to a GitOps repo in prod with one flag.\n\n## references\n\n- Builds on the Atmos Git foundational capability (#2597), now merged into `main`, which provides the reusable `pkg/git` service and `git.repositories` configuration consumed by the git target.\n- Docs: [Kubernetes component](/stacks/components/kubernetes), [`atmos kubernetes`](/cli/commands/kubernetes/usage).\n\n\n<!-- This is an auto-generated comment: release notes by coderabbit.ai -->\n## Summary by CodeRabbit\n\n* **New Features**\n  * Added native Kubernetes component support with `atmos kubernetes` commands: `render`, `diff`/`plan`, `apply`/`deploy`, `delete`, and `validate` (plus `k8s` alias).\n  * Added server-side diff/validate and GitOps-style delivery targets for applying manifests to either clusters or Git repositories.\n* **Bug Fixes**\n  * Improved Kubernetes affected selection, component path resolution, and config merging; refined Kubernetes diff masking/summaries (including Secret redaction).\n* **Documentation**\n  * Expanded CLI, configuration, CI, and examples for Kubernetes and local GitOps workflows.\n<!-- end of auto-generated comment: release notes by coderabbit.ai -->\n</details>\n","mentions_count":1},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/347180925","assets_url":"https://api.github.com/repos/cloudposse/atmos/releases/347180925/assets","upload_url":"https://uploads.github.com/repos/cloudposse/atmos/releases/347180925/assets{?name,label}","html_url":"https://github.com/cloudposse/atmos/releases/tag/v1.222.0-rc.14","id":347180925,"author":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"node_id":"RE_kwDOEW4XoM4UsY99","tag_name":"v1.222.0-rc.14","target_commitish":"main","name":"v1.222.0-rc.14","draft":false,"immutable":false,"prerelease":true,"created_at":"2026-06-30T21:41:41Z","updated_at":"2026-07-01T01:28:33Z","published_at":"2026-07-01T01:28:33Z","assets":[{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/462708788","id":462708788,"node_id":"RA_kwDOEW4XoM4blGA0","name":"atmos_1.222.0-rc.14_darwin_amd64","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":240933776,"digest":"sha256:19bc3a5496b5c084198244964db210d9d1fb29b8b00421d4222558f75f502aef","download_count":1,"created_at":"2026-07-01T01:27:33Z","updated_at":"2026-07-01T01:27:40Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0-rc.14/atmos_1.222.0-rc.14_darwin_amd64"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/462708768","id":462708768,"node_id":"RA_kwDOEW4XoM4blGAg","name":"atmos_1.222.0-rc.14_darwin_arm64","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":226270162,"digest":"sha256:402efdc8a08b75270ec33cb2fe1562901710bac7e2ec8fc626e9150dafef97c6","download_count":1,"created_at":"2026-07-01T01:27:32Z","updated_at":"2026-07-01T01:27:41Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0-rc.14/atmos_1.222.0-rc.14_darwin_arm64"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/462708681","id":462708681,"node_id":"RA_kwDOEW4XoM4blF_J","name":"atmos_1.222.0-rc.14_freebsd_amd64","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":234811564,"digest":"sha256:9ae8b7d63346aa491fc949a7335534e46cf8e28e3dff572dd6c67182a81dbad2","download_count":1,"created_at":"2026-07-01T01:27:24Z","updated_at":"2026-07-01T01:27:33Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0-rc.14/atmos_1.222.0-rc.14_freebsd_amd64"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/462708677","id":462708677,"node_id":"RA_kwDOEW4XoM4blF_F","name":"atmos_1.222.0-rc.14_freebsd_arm64","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":218431660,"digest":"sha256:83a5e9bf16ddeda7ddf8f097fcfa5327a083f5a82332f3531592c24565e82378","download_count":1,"created_at":"2026-07-01T01:27:24Z","updated_at":"2026-07-01T01:27:31Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0-rc.14/atmos_1.222.0-rc.14_freebsd_arm64"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/462708678","id":462708678,"node_id":"RA_kwDOEW4XoM4blF_G","name":"atmos_1.222.0-rc.14_linux_386","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":219185314,"digest":"sha256:1908a8eb9581352abc83e041e03725d6075f02fa341cdfc78eaff487486f1738","download_count":1,"created_at":"2026-07-01T01:27:24Z","updated_at":"2026-07-01T01:27:34Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0-rc.14/atmos_1.222.0-rc.14_linux_386"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/462708867","id":462708867,"node_id":"RA_kwDOEW4XoM4blGCD","name":"atmos_1.222.0-rc.14_linux_amd64","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":235651234,"digest":"sha256:709c16efb36f552c6dfec6c099636fed48e378af66d939b99593ee98f79c862e","download_count":4,"created_at":"2026-07-01T01:27:40Z","updated_at":"2026-07-01T01:27:48Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0-rc.14/atmos_1.222.0-rc.14_linux_amd64"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/462708805","id":462708805,"node_id":"RA_kwDOEW4XoM4blGBF","name":"atmos_1.222.0-rc.14_linux_arm","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":219349154,"digest":"sha256:8f23b520d1e233e3c0e57e9dc7b37ef536715b34b19ea757a36704a978d27bc3","download_count":1,"created_at":"2026-07-01T01:27:35Z","updated_at":"2026-07-01T01:27:40Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0-rc.14/atmos_1.222.0-rc.14_linux_arm"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/462708862","id":462708862,"node_id":"RA_kwDOEW4XoM4blGB-","name":"atmos_1.222.0-rc.14_linux_arm64","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":219218082,"digest":"sha256:8836658a79c78b9a18d602f52f9d831ee20d46163ae2706904379227d0fbdb9d","download_count":1,"created_at":"2026-07-01T01:27:40Z","updated_at":"2026-07-01T01:27:47Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0-rc.14/atmos_1.222.0-rc.14_linux_arm64"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/462708873","id":462708873,"node_id":"RA_kwDOEW4XoM4blGCJ","name":"atmos_1.222.0-rc.14_SHA256SUMS","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":1096,"digest":"sha256:cf888b727f292e5da7ad2d4861b67a760268254250e853aaad335729b350d241","download_count":1,"created_at":"2026-07-01T01:27:42Z","updated_at":"2026-07-01T01:27:42Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0-rc.14/atmos_1.222.0-rc.14_SHA256SUMS"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/462708786","id":462708786,"node_id":"RA_kwDOEW4XoM4blGAy","name":"atmos_1.222.0-rc.14_windows_386.exe","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/x-ms-dos-executable","state":"uploaded","size":223795712,"digest":"sha256:8aa869eb3d2e6e0f687865b96e5942dcb51209e7da6585d8f9d7ce9dd1399b8a","download_count":1,"created_at":"2026-07-01T01:27:33Z","updated_at":"2026-07-01T01:27:39Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0-rc.14/atmos_1.222.0-rc.14_windows_386.exe"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/462708679","id":462708679,"node_id":"RA_kwDOEW4XoM4blF_H","name":"atmos_1.222.0-rc.14_windows_amd64.exe","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/x-ms-dos-executable","state":"uploaded","size":239582208,"digest":"sha256:4082ade02a69773356c6c988b6db12523ed1b121ff4fd1cbc94ccdc68799237f","download_count":1,"created_at":"2026-07-01T01:27:24Z","updated_at":"2026-07-01T01:27:33Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0-rc.14/atmos_1.222.0-rc.14_windows_amd64.exe"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/462708866","id":462708866,"node_id":"RA_kwDOEW4XoM4blGCC","name":"atmos_1.222.0-rc.14_windows_arm64.exe","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/x-ms-dos-executable","state":"uploaded","size":220775936,"digest":"sha256:fcc0011358ad35a9540ce9e797024eade61dc99ee512c5dc2402b496543c85e6","download_count":1,"created_at":"2026-07-01T01:27:40Z","updated_at":"2026-07-01T01:27:47Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0-rc.14/atmos_1.222.0-rc.14_windows_arm64.exe"}],"tarball_url":"https://api.github.com/repos/cloudposse/atmos/tarball/v1.222.0-rc.14","zipball_url":"https://api.github.com/repos/cloudposse/atmos/zipball/v1.222.0-rc.14","body":"<details>\n  <summary>Add emulator workflows, skill catalog, and website refresh @osterman (#2665)</summary>\n## what\n\n- Added emulator workflow improvements, including emulator listing, Kubernetes readiness handling, Podman port parsing, and emulator-aware Terraform backend reads for AWS, GCP, and Azure.\n- Added offline bundled AI skill catalog support, including available-vs-installed skill listing and install-by-name behavior.\n- Added component dependency listing support plus updated examples, docs, landing-page demo assets, and website sidebar/landing refresh work.\n\n## why\n\n- Makes local emulator workflows more reliable by keeping in-process backend reads pointed at emulator endpoints instead of real cloud services.\n- Lets users discover and install bundled Atmos AI skills without requiring network or Git access.\n- Improves dependency visibility and updates the docs/website experience around the new emulator and skill workflows.\n\n## references\n\n- None.\n\n</details>\n\n\n## 🚀 Enhancements\n\n<details>\n  <summary>Warn on explicit version constraint overrides @osterman (#2670)</summary>\n## what\n\n- Downgrade version constraint failures to structured `log.Warn` messages when an explicit version override is present.\n- Detect overrides from `--use-version`, `ATMOS_VERSION_USE`, `ATMOS_USE_VERSION`, and `ATMOS_VERSION`, while keeping config-only `version.use` enforcement unchanged.\n- Preserve fatal errors for invalid constraint syntax and add coverage for non-semver override binaries like `test`.\n\n## why\n\n- `--use-version ref:*` can re-exec into unreleased binaries that report `version.Version == \"test\"`, which previously failed constraint validation before the requested command could run.\n- Explicit overrides are intentional, so Atmos should continue with a warning that explains the bypass instead of enforcing the configured constraint.\n\n## references\n\n- Closes #2668\n\n\n<!-- This is an auto-generated comment: release notes by coderabbit.ai -->\n## Summary by CodeRabbit\n\n* **Bug Fixes**\n  * Improved version-constraint enforcement: explicitly requested versions can bypass validation when appropriate, with clear warning messages when bypassing occurs.\n  * Better diagnostics for malformed version constraints, including more actionable error reporting.\n  * Updated `--use-version` parsing to use the shared version override logic, aligning override behavior across env/CLI forms.\n\n* **Tests**\n  * Added log-capture utilities and expanded table-driven coverage for override warnings and suppression scenarios.\n  * Extended `--use-version` and explicit-override precedence tests, including edge cases like `--` termination.\n<!-- end of auto-generated comment: release notes by coderabbit.ai -->\n</details>\n","mentions_count":1},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/346578342","assets_url":"https://api.github.com/repos/cloudposse/atmos/releases/346578342/assets","upload_url":"https://uploads.github.com/repos/cloudposse/atmos/releases/346578342/assets{?name,label}","html_url":"https://github.com/cloudposse/atmos/releases/tag/v1.222.0-rc.13","id":346578342,"author":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"node_id":"RE_kwDOEW4XoM4UqF2m","tag_name":"v1.222.0-rc.13","target_commitish":"main","name":"v1.222.0-rc.13","draft":false,"immutable":false,"prerelease":true,"created_at":"2026-06-29T19:57:08Z","updated_at":"2026-06-30T01:49:29Z","published_at":"2026-06-30T01:49:29Z","assets":[{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/461700178","id":461700178,"node_id":"RA_kwDOEW4XoM4bhPxS","name":"atmos_1.222.0-rc.13_darwin_amd64","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":240139696,"digest":"sha256:37c977e079ca2271715a64567b7b12b492c42c62c054aaf39b4c1cdc2a6f02f5","download_count":2,"created_at":"2026-06-30T01:48:22Z","updated_at":"2026-06-30T01:48:30Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0-rc.13/atmos_1.222.0-rc.13_darwin_amd64"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/461700179","id":461700179,"node_id":"RA_kwDOEW4XoM4bhPxT","name":"atmos_1.222.0-rc.13_darwin_arm64","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":225507042,"digest":"sha256:b0e9d517d202a2d277921e9d69652f03a5eac940e8b135ac5c4a4beab734e4ee","download_count":2,"created_at":"2026-06-30T01:48:22Z","updated_at":"2026-06-30T01:48:30Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0-rc.13/atmos_1.222.0-rc.13_darwin_arm64"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/461700255","id":461700255,"node_id":"RA_kwDOEW4XoM4bhPyf","name":"atmos_1.222.0-rc.13_freebsd_amd64","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":234016940,"digest":"sha256:fbcdea31624931c7413a0f8fe61cfc767afc4d0871726ec746ae997c689b277d","download_count":1,"created_at":"2026-06-30T01:48:31Z","updated_at":"2026-06-30T01:48:37Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0-rc.13/atmos_1.222.0-rc.13_freebsd_amd64"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/461700210","id":461700210,"node_id":"RA_kwDOEW4XoM4bhPxy","name":"atmos_1.222.0-rc.13_freebsd_arm64","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":217710764,"digest":"sha256:d448eec55e89d057f962ee3fefd4c114932b6589341a58292bdf2a3c146f2850","download_count":1,"created_at":"2026-06-30T01:48:26Z","updated_at":"2026-06-30T01:48:31Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0-rc.13/atmos_1.222.0-rc.13_freebsd_arm64"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/461700083","id":461700083,"node_id":"RA_kwDOEW4XoM4bhPvz","name":"atmos_1.222.0-rc.13_linux_386","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":218411170,"digest":"sha256:2bed5c03f6acaefa251cd5091fcfaaa6b64e444e1c6fabef13b4eae14cc57ba4","download_count":1,"created_at":"2026-06-30T01:48:14Z","updated_at":"2026-06-30T01:48:22Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0-rc.13/atmos_1.222.0-rc.13_linux_386"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/461700177","id":461700177,"node_id":"RA_kwDOEW4XoM4bhPxR","name":"atmos_1.222.0-rc.13_linux_amd64","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":234856610,"digest":"sha256:4bdb5e1ca7a39bcc870cff8f0a1bee08e4c14bd974e629baa054cad9f2e93285","download_count":9,"created_at":"2026-06-30T01:48:22Z","updated_at":"2026-06-30T01:48:31Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0-rc.13/atmos_1.222.0-rc.13_linux_amd64"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/461700238","id":461700238,"node_id":"RA_kwDOEW4XoM4bhPyO","name":"atmos_1.222.0-rc.13_linux_arm","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":218628258,"digest":"sha256:391f6f5a557f354fc0fd29ae8171286d2198ce35280dd5f954dd253e250c90a4","download_count":1,"created_at":"2026-06-30T01:48:31Z","updated_at":"2026-06-30T01:48:38Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0-rc.13/atmos_1.222.0-rc.13_linux_arm"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/461700234","id":461700234,"node_id":"RA_kwDOEW4XoM4bhPyK","name":"atmos_1.222.0-rc.13_linux_arm64","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":218497186,"digest":"sha256:e4b1e9f93da2f2f387e3a9b447f771940c60b2fb745b95c2a9f9b37ce4af7d7f","download_count":1,"created_at":"2026-06-30T01:48:30Z","updated_at":"2026-06-30T01:48:37Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0-rc.13/atmos_1.222.0-rc.13_linux_arm64"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/461700270","id":461700270,"node_id":"RA_kwDOEW4XoM4bhPyu","name":"atmos_1.222.0-rc.13_SHA256SUMS","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":1096,"digest":"sha256:af5171e519c80655cad7d6ac4621038b04a045f797c1ecca1c2e71e7ff070f23","download_count":7,"created_at":"2026-06-30T01:48:32Z","updated_at":"2026-06-30T01:48:32Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0-rc.13/atmos_1.222.0-rc.13_SHA256SUMS"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/461700085","id":461700085,"node_id":"RA_kwDOEW4XoM4bhPv1","name":"atmos_1.222.0-rc.13_windows_386.exe","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/x-ms-dos-executable","state":"uploaded","size":223017984,"digest":"sha256:5d00fc8254158fbc6cb410847e32b94abdcfb09880cdfc25513f8b5b124eeda9","download_count":1,"created_at":"2026-06-30T01:48:14Z","updated_at":"2026-06-30T01:48:22Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0-rc.13/atmos_1.222.0-rc.13_windows_386.exe"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/461700086","id":461700086,"node_id":"RA_kwDOEW4XoM4bhPv2","name":"atmos_1.222.0-rc.13_windows_amd64.exe","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/x-ms-dos-executable","state":"uploaded","size":238788096,"digest":"sha256:4e37ba4cfbee48f70305a0b8439f9b3c7707cd7b85eddcc950fcb1d29452934a","download_count":4,"created_at":"2026-06-30T01:48:14Z","updated_at":"2026-06-30T01:48:26Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0-rc.13/atmos_1.222.0-rc.13_windows_amd64.exe"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/461700084","id":461700084,"node_id":"RA_kwDOEW4XoM4bhPv0","name":"atmos_1.222.0-rc.13_windows_arm64.exe","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/x-ms-dos-executable","state":"uploaded","size":220005376,"digest":"sha256:f7bd606a4f3cc5f97bba796dbacee3762c8e94dc2d933f2fe7f09a7794c96fd6","download_count":1,"created_at":"2026-06-30T01:48:14Z","updated_at":"2026-06-30T01:48:22Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0-rc.13/atmos_1.222.0-rc.13_windows_arm64.exe"}],"tarball_url":"https://api.github.com/repos/cloudposse/atmos/tarball/v1.222.0-rc.13","zipball_url":"https://api.github.com/repos/cloudposse/atmos/zipball/v1.222.0-rc.13","body":"<details>\n  <summary>Add parallel and matrix workflow control steps @osterman (#2635)</summary>\n## what\n\n- Add `parallel` and `matrix` workflow control steps with sibling `needs` DAG scheduling.\n- Add configurable failure behavior, parent-owned grouped/prefixed/none output, summary rendering through UI helpers, and child result metadata capture.\n- Keep the internal exec integration thin while placing the scheduler, matrix expansion, command child executor, output handling, and tests in `pkg/workflow`.\n- Add workflow/schema validation, registered `pkg/runner/step/parallel` and `pkg/runner/step/matrix` handlers, JSON schema updates, and `examples/parallel-steps`.\n\n## why\n\n- Enables non-interactive workflow steps to run concurrently without moving orchestration policy into `internal/exec`.\n- Provides deterministic dependency, failure, output, and matrix semantics before allowing broader step types inside concurrent groups.\n- Documents the new behavior with runnable examples and keeps `pkg/workflow` coverage above 80%.\n\n## references\n\n- `pkg/workflow` coverage: 82.9%\n- Validation run: `go test ./pkg/schema ./pkg/runner/step ./pkg/scheduler ./pkg/workflow ./internal/exec`\n- Validation run: `go test ./cmd ./tests -run 'Workflow|workflow|Schema|schema'`\n- Validation run: `./custom-gcl run --new-from-rev=origin/main --config=.golangci.yml`\n\n\n<!-- This is an auto-generated comment: release notes by coderabbit.ai -->\n## Summary by CodeRabbit\n\n## Release Notes\n\n- **New Features**\n  - Added workflow orchestration control steps: `parallel` and `matrix`, supporting `needs`, `max_concurrency`, matrix expansion, and failure modes (`wait_all`, `fail_fast`, `best_effort`).\n  - Added parent-owned concurrent output rendering (`grouped`/`prefixed`) with optional per-step completion summaries and configurable prefixes.\n  - Added background container execution via `background: true`, coordinated with `wait`, `wait-all`, and `cancel`, including readiness gating from container healthchecks.\n\n- **Documentation**\n  - Added new examples and guides, plus updated workflow schemas and step-type docs for orchestration and structured `output`.\n\n- **Bug Fixes**\n  - Improved validation rules and default naming for nested orchestration steps.\n\n- **Tests**\n  - Extensive new coverage for orchestration execution, output rendering, validation, and background lifecycle handling.\n<!-- end of auto-generated comment: release notes by coderabbit.ai -->\n</details>\n\n\n## 🚀 Enhancements\n\n<details>\n  <summary>fix(validate): dogfood `atmos validate stacks` for example YAML; fix nil-map crash @osterman (#2666)</summary>\n## what\n\n- Replace the deprecated third-party `InoUno/yaml-ls-check` GitHub Action in the `[validate]` CI matrix with Atmos itself, running `atmos validate stacks --schemas-atmos-manifest <in-repo schema>` against each example.\n- Expand the matrix to also validate three previously-excluded function-using examples (`custom-components`, `sops-secrets`, `onepassword-secrets`), which now pass because Atmos understands its own YAML tags natively.\n- Fix a crash in `atmos validate stacks --schemas-atmos-manifest`: it panicked with `assignment to entry in nil map` when the target `atmos.yaml` had no `schemas:` section. Added a lazy-initializing `SetSchemaRegistry` setter and a regression test.\n\n## why\n\n- The third-party action targets Node 20 and is force-run on Node 24, emitting deprecation warnings across every `[validate]` job; it also can't parse Atmos YAML tags, which forced many examples to be excluded from validation.\n- `atmos validate stacks` is a strict superset of the old static check (YAML syntax + manifest JSON Schema + import resolution + duplicate-component detection) and parses Atmos tags natively — better coverage with no external dependency. Pointing `--schemas-atmos-manifest` at the in-repo schema lets a PR add a schema field and use it in an example in the same change.\n- Dogfooding immediately surfaced and fixed a real user-visible crash in the validate command.\n\n## references\n\n- `quick-start-advanced` and `native-terraform` are intentionally left out of the matrix (documented inline): the former's `stacks/workflows/*.yaml` uses newer workflow step types the manifest schema doesn't describe yet, and the latter intentionally configures no `stacks.name_pattern`.\n\n\n<!-- This is an auto-generated comment: release notes by coderabbit.ai -->\n## Summary by CodeRabbit\n\n* **Bug Fixes**\n  * Prevented schema registry updates from failing when `atmos.yaml` has no schema section, and ensured adding a registry entry doesn’t remove existing ones.\n* **Chores**\n  * Updated CI to install Terraform/OpenTofu via the Atmos toolchain (OpenTofu pinned), and streamlined stack validation to run `atmos validate stacks` directly against example folders using in-repo schema files.\n  * Expanded validated demo folders to include additional examples.\n* **Tests**\n  * Strengthened schema validation coverage by exercising the real CLI for both stack manifests and test-case YAMLs with explicit valid/invalid scenarios and failure assertions.\n<!-- end of auto-generated comment: release notes by coderabbit.ai -->\n</details>\n","mentions_count":1},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/346033757","assets_url":"https://api.github.com/repos/cloudposse/atmos/releases/346033757/assets","upload_url":"https://uploads.github.com/repos/cloudposse/atmos/releases/346033757/assets{?name,label}","html_url":"https://github.com/cloudposse/atmos/releases/tag/v1.222.0-rc.12","id":346033757,"author":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"node_id":"RE_kwDOEW4XoM4UoA5d","tag_name":"v1.222.0-rc.12","target_commitish":"main","name":"v1.222.0-rc.12","draft":false,"immutable":false,"prerelease":true,"created_at":"2026-06-28T16:22:19Z","updated_at":"2026-06-29T01:57:32Z","published_at":"2026-06-29T01:57:32Z","assets":[{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/460664465","id":460664465,"node_id":"RA_kwDOEW4XoM4bdS6R","name":"atmos_1.222.0-rc.12_darwin_amd64","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":239945856,"digest":"sha256:8a937820669944df66486f3192470bfecc0f9c2ec7f7e442882c4ca7eed769f3","download_count":1,"created_at":"2026-06-29T01:56:40Z","updated_at":"2026-06-29T01:56:45Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0-rc.12/atmos_1.222.0-rc.12_darwin_amd64"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/460664380","id":460664380,"node_id":"RA_kwDOEW4XoM4bdS48","name":"atmos_1.222.0-rc.12_darwin_arm64","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":225336450,"digest":"sha256:87b88e738cfa54841e1fe6faf7ecfa20d8860572b08a2569ede543003465ee1a","download_count":2,"created_at":"2026-06-29T01:56:32Z","updated_at":"2026-06-29T01:56:38Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0-rc.12/atmos_1.222.0-rc.12_darwin_arm64"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/460664315","id":460664315,"node_id":"RA_kwDOEW4XoM4bdS37","name":"atmos_1.222.0-rc.12_freebsd_amd64","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":233828524,"digest":"sha256:cf667f76390ac9ba70af50004192dd52dea78a94cb0252692e7b000783ca2695","download_count":1,"created_at":"2026-06-29T01:56:24Z","updated_at":"2026-06-29T01:56:31Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0-rc.12/atmos_1.222.0-rc.12_freebsd_amd64"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/460664313","id":460664313,"node_id":"RA_kwDOEW4XoM4bdS35","name":"atmos_1.222.0-rc.12_freebsd_arm64","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":217514156,"digest":"sha256:c02395377950f44c4b4b2bacc26d45702548982f61ab6bb04f1f26f13d5e3037","download_count":1,"created_at":"2026-06-29T01:56:24Z","updated_at":"2026-06-29T01:56:32Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0-rc.12/atmos_1.222.0-rc.12_freebsd_arm64"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/460664478","id":460664478,"node_id":"RA_kwDOEW4XoM4bdS6e","name":"atmos_1.222.0-rc.12_linux_386","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":218247330,"digest":"sha256:be0bb0d759a2589687d2410ced798bcfbaa7435b9a6006631325d0df925c67e2","download_count":1,"created_at":"2026-06-29T01:56:42Z","updated_at":"2026-06-29T01:56:48Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0-rc.12/atmos_1.222.0-rc.12_linux_386"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/460664412","id":460664412,"node_id":"RA_kwDOEW4XoM4bdS5c","name":"atmos_1.222.0-rc.12_linux_amd64","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":234664098,"digest":"sha256:14e637a1d9cdc0d531ddb8260f05eea274ab2e6f3fde1b0960352e677214922c","download_count":195,"created_at":"2026-06-29T01:56:33Z","updated_at":"2026-06-29T01:56:41Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0-rc.12/atmos_1.222.0-rc.12_linux_amd64"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/460664312","id":460664312,"node_id":"RA_kwDOEW4XoM4bdS34","name":"atmos_1.222.0-rc.12_linux_arm","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":218431650,"digest":"sha256:90e14b5825a29c3fe12b66bb30f2ad73539339cdb4d6d5b37f4af273c956aa7b","download_count":1,"created_at":"2026-06-29T01:56:24Z","updated_at":"2026-06-29T01:56:32Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0-rc.12/atmos_1.222.0-rc.12_linux_arm"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/460664314","id":460664314,"node_id":"RA_kwDOEW4XoM4bdS36","name":"atmos_1.222.0-rc.12_linux_arm64","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":218300578,"digest":"sha256:1f86c5a46d6680fe1cb0da7283b465efc428292d90c83d4dee4df65277e62295","download_count":1,"created_at":"2026-06-29T01:56:24Z","updated_at":"2026-06-29T01:56:33Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0-rc.12/atmos_1.222.0-rc.12_linux_arm64"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/460664482","id":460664482,"node_id":"RA_kwDOEW4XoM4bdS6i","name":"atmos_1.222.0-rc.12_SHA256SUMS","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":1096,"digest":"sha256:8d8f31c5c759eee95811e625acf35e9ca180dc6969ea75bc0b6941faa21068fb","download_count":2,"created_at":"2026-06-29T01:56:42Z","updated_at":"2026-06-29T01:56:42Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0-rc.12/atmos_1.222.0-rc.12_SHA256SUMS"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/460664409","id":460664409,"node_id":"RA_kwDOEW4XoM4bdS5Z","name":"atmos_1.222.0-rc.12_windows_386.exe","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/x-ms-dos-executable","state":"uploaded","size":222846976,"digest":"sha256:63c93fbe4d3d39bdd32680006d907a2ce31b5007b01ba96307895b7d27c07640","download_count":1,"created_at":"2026-06-29T01:56:33Z","updated_at":"2026-06-29T01:56:40Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0-rc.12/atmos_1.222.0-rc.12_windows_386.exe"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/460664407","id":460664407,"node_id":"RA_kwDOEW4XoM4bdS5X","name":"atmos_1.222.0-rc.12_windows_amd64.exe","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/x-ms-dos-executable","state":"uploaded","size":238590976,"digest":"sha256:e3f9b9870c6ca7aa387585d65379bf391857d77761396b9e54c5c597164ec7f3","download_count":1,"created_at":"2026-06-29T01:56:32Z","updated_at":"2026-06-29T01:56:41Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0-rc.12/atmos_1.222.0-rc.12_windows_amd64.exe"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/460664451","id":460664451,"node_id":"RA_kwDOEW4XoM4bdS6D","name":"atmos_1.222.0-rc.12_windows_arm64.exe","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/x-ms-dos-executable","state":"uploaded","size":219833344,"digest":"sha256:48b5ad6b7948bd3be93a159b3df88daa1d7bf07b8e56fd76434448fcca7c3750","download_count":1,"created_at":"2026-06-29T01:56:38Z","updated_at":"2026-06-29T01:56:44Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0-rc.12/atmos_1.222.0-rc.12_windows_arm64.exe"}],"tarball_url":"https://api.github.com/repos/cloudposse/atmos/tarball/v1.222.0-rc.12","zipball_url":"https://api.github.com/repos/cloudposse/atmos/zipball/v1.222.0-rc.12","body":"## 🚀 Enhancements\n\n<details>\n  <summary>fix(hooks): store-output hooks inherit the run's default identity @aknysh (#2662)</summary>\n## what\n\n- Make the terraform after-apply `store-outputs` hook path inherit the run's auto-detected identity for\n  stores that don't declare their own `identity`, matching the main terraform path.\n- Add a new `internal/exec.HookStoreDefaultIdentity` helper (auto-detect the active identity from the\n  auth manager's chain, normalize empty/`select`/`disabled` to `\"\"`); `cmd/terraform`'s\n  `injectHookStoreAuthResolver` now calls `SetAuthContextResolverWithDefaultIdentity` instead of the\n  resolver-only variant.\n- Fix an adjacent bug: `pkg/store.defaultIdentityForStore` was missing `*SecretsManagerStore`\n  (`aws/asm`), so AWS Secrets Manager stores never inherited a default identity on **any** path. Added\n  the case so `aws/asm` behaves like `aws/ssm`.\n- Tests: `internal/exec.TestHookStoreDefaultIdentity` (new), `cmd/terraform`\n  `TestInjectHookStoreAuthResolver_InheritsDefaultIdentity` (replaces `…_ResolverOnly`), updated\n  `pkg/store` default-identity test so identity-less `aws/asm` asserts inheritance, and Floci E2E\n  `TestAWSStoreHooks_InheritedIdentity_FlociE2E` with fixture `aws-store-hooks-floci-inherit`.\n- Fix doc: `docs/fixes/2026-06-27-store-hook-inherit-default-identity.md`.\n\n## why\n\n- **Hook fix.** Under Atmos auth, `atmos terraform apply` on a component with a `store-outputs` hook\n  applied successfully but then failed in the hook when the target store had no `identity`:\n\n  ```text\n  INFO  Running hooks event=after.terraform.apply status=success\n  ✓ Fetching <output> from <component> in <stack>\n  Error: failed to assume write role: … get identity: get credentials:\n  failed to refresh cached credentials, no EC2 IMDS role found, … ec2imds: GetMetadata …\n  ```\n\n  Hooks run in a freshly-loaded config, so the apply-phase store registry (and its injected default\n  identity) is gone. The hook re-injected the resolver but **no** default identity, so identity-less\n  stores fell back to the default AWS SDK credential chain — empty under Atmos auth (credentials live\n  in the keyring, not the environment) — and dropped to EC2 IMDS. The main terraform path and `!store`\n  reads already inherit the run's identity; this removes a surprising asymmetry and completes the\n  follow-up explicitly deferred in #2625 (\"Component-identity inheritance for identity-less stores is\n  intentionally left for a follow-up design decision\").\n\n- **ASM fix.** `defaultIdentityForStore` handled `*SSMStore`, `*AzureKeyVaultStore`, and `*GSMStore`\n  but not `*SecretsManagerStore`, so `aws/asm` stores without an explicit `identity` could never\n  inherit one. This was latent before (and was even codified by the old test); the hook fix's E2E\n  surfaced it.\n\n- **Backward compatible.** `HookStoreDefaultIdentity` returns `\"\"` whenever no identity is resolved\n  (no auth manager, or empty/`select`/`disabled`), and `SetAuthContextResolverWithDefaultIdentity(\"\")`\n  is a no-op for the default — so runs without Atmos auth keep their prior ambient/default-SDK\n  credential behavior, and stores with an explicit `identity` are never overridden.\n\n## references\n\n- Follow-up to #2625 (AWS stores/secrets auth; deferred identity-less inheritance in the hook path).\n- Related fix docs: `docs/fixes/2026-06-17-aws-stores-secrets-auth-and-gists.md`,\n  `docs/fixes/2026-05-25-store-hook-missing-backend-role-assumption.md`.\n\n\n<!-- This is an auto-generated comment: release notes by coderabbit.ai -->\n## Summary by CodeRabbit\n\n* **New Features**\n  * Store output hooks now inherit the run’s detected/default identity when a store doesn’t specify an explicit identity.\n  * AWS Secrets Manager store output identity handling now matches the default-identity behavior of other supported stores.\n* **Bug Fixes**\n  * Prevents hook-phase authentication failures under Atmos auth when no fallback AWS credentials are available.\n* **Documentation**\n  * Added a clarification on identity inheritance semantics for store-output hooks.\n* **Tests**\n  * Added/updated unit tests and a Floci end-to-end test covering identity inheritance for SSM/ASM hook outputs.\n<!-- end of auto-generated comment: release notes by coderabbit.ai -->\n</details>\n","mentions_count":1},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/345820247","assets_url":"https://api.github.com/repos/cloudposse/atmos/releases/345820247/assets","upload_url":"https://uploads.github.com/repos/cloudposse/atmos/releases/345820247/assets{?name,label}","html_url":"https://github.com/cloudposse/atmos/releases/tag/v1.222.0-rc.11","id":345820247,"author":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"node_id":"RE_kwDOEW4XoM4UnMxX","tag_name":"v1.222.0-rc.11","target_commitish":"main","name":"v1.222.0-rc.11","draft":false,"immutable":false,"prerelease":true,"created_at":"2026-06-27T10:21:23Z","updated_at":"2026-06-28T01:53:24Z","published_at":"2026-06-28T01:53:24Z","assets":[{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/459900888","id":459900888,"node_id":"RA_kwDOEW4XoM4baYfY","name":"atmos_1.222.0-rc.11_darwin_amd64","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":239945856,"digest":"sha256:24cb010dc1c015793b4b6809d7e1fac9e53b5ab46bb5a1f5d2b7f9a07a1b9d41","download_count":1,"created_at":"2026-06-28T01:52:19Z","updated_at":"2026-06-28T01:52:27Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0-rc.11/atmos_1.222.0-rc.11_darwin_amd64"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/459900889","id":459900889,"node_id":"RA_kwDOEW4XoM4baYfZ","name":"atmos_1.222.0-rc.11_darwin_arm64","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":225336466,"digest":"sha256:3772bbd9b7efc25cdfe442f5be482a9ebf18cd29199c1ec25b588d495bff4993","download_count":2,"created_at":"2026-06-28T01:52:19Z","updated_at":"2026-06-28T01:52:27Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0-rc.11/atmos_1.222.0-rc.11_darwin_arm64"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/459900828","id":459900828,"node_id":"RA_kwDOEW4XoM4baYec","name":"atmos_1.222.0-rc.11_freebsd_amd64","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":233824428,"digest":"sha256:bfc7defc18d92c45e286ed33cd1ab429a5f36b8efb01afca58b15493f80159be","download_count":1,"created_at":"2026-06-28T01:52:10Z","updated_at":"2026-06-28T01:52:18Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0-rc.11/atmos_1.222.0-rc.11_freebsd_amd64"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/459900830","id":459900830,"node_id":"RA_kwDOEW4XoM4baYee","name":"atmos_1.222.0-rc.11_freebsd_arm64","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":217514156,"digest":"sha256:f80ac244e9e8065e686df8604dd2603a0cb15de4408e9832365487f3e556575e","download_count":1,"created_at":"2026-06-28T01:52:10Z","updated_at":"2026-06-28T01:52:19Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0-rc.11/atmos_1.222.0-rc.11_freebsd_arm64"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/459900829","id":459900829,"node_id":"RA_kwDOEW4XoM4baYed","name":"atmos_1.222.0-rc.11_linux_386","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":218243234,"digest":"sha256:5e2dd904cce68dc0db9bee43f0ca9d4adf53dd0992e4a4aed41ed72c22dbe79b","download_count":1,"created_at":"2026-06-28T01:52:10Z","updated_at":"2026-06-28T01:52:18Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0-rc.11/atmos_1.222.0-rc.11_linux_386"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/459900944","id":459900944,"node_id":"RA_kwDOEW4XoM4baYgQ","name":"atmos_1.222.0-rc.11_linux_amd64","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":234660002,"digest":"sha256:4c82e1fbc9e236149b6446299885a90bc7a741860bc57614e5db45b32d61cbad","download_count":4,"created_at":"2026-06-28T01:52:25Z","updated_at":"2026-06-28T01:52:32Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0-rc.11/atmos_1.222.0-rc.11_linux_amd64"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/459900956","id":459900956,"node_id":"RA_kwDOEW4XoM4baYgc","name":"atmos_1.222.0-rc.11_linux_arm","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":218431650,"digest":"sha256:9bf196b6ed1475056cc9772047c6e9cb59d2fcf766a6188c6e94426892fc1327","download_count":1,"created_at":"2026-06-28T01:52:27Z","updated_at":"2026-06-28T01:52:33Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0-rc.11/atmos_1.222.0-rc.11_linux_arm"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/459900881","id":459900881,"node_id":"RA_kwDOEW4XoM4baYfR","name":"atmos_1.222.0-rc.11_linux_arm64","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":218300578,"digest":"sha256:cccf6fb0e1c82cbbe81a41cae2a6f6822961c0aac0ea90677fe393b77a520d27","download_count":1,"created_at":"2026-06-28T01:52:18Z","updated_at":"2026-06-28T01:52:24Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0-rc.11/atmos_1.222.0-rc.11_linux_arm64"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/459900957","id":459900957,"node_id":"RA_kwDOEW4XoM4baYgd","name":"atmos_1.222.0-rc.11_SHA256SUMS","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":1096,"digest":"sha256:929e287e7ec111c0e8a51280ed8820cff223df8376d4543b0c7cd82a4c418bd5","download_count":1,"created_at":"2026-06-28T01:52:27Z","updated_at":"2026-06-28T01:52:27Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0-rc.11/atmos_1.222.0-rc.11_SHA256SUMS"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/459900954","id":459900954,"node_id":"RA_kwDOEW4XoM4baYga","name":"atmos_1.222.0-rc.11_windows_386.exe","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/x-ms-dos-executable","state":"uploaded","size":222846976,"digest":"sha256:b1be7a0dda28be6400ea580b9911e5ee73f8798a38210db5ff4827d5d5cb84cc","download_count":1,"created_at":"2026-06-28T01:52:26Z","updated_at":"2026-06-28T01:52:32Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0-rc.11/atmos_1.222.0-rc.11_windows_386.exe"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/459900885","id":459900885,"node_id":"RA_kwDOEW4XoM4baYfV","name":"atmos_1.222.0-rc.11_windows_amd64.exe","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/x-ms-dos-executable","state":"uploaded","size":238590464,"digest":"sha256:60cdacd85157b5733681669aaa43c008667c9a7326370287f9e356f6ee5c8d08","download_count":1,"created_at":"2026-06-28T01:52:19Z","updated_at":"2026-06-28T01:52:26Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0-rc.11/atmos_1.222.0-rc.11_windows_amd64.exe"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/459900831","id":459900831,"node_id":"RA_kwDOEW4XoM4baYef","name":"atmos_1.222.0-rc.11_windows_arm64.exe","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/x-ms-dos-executable","state":"uploaded","size":219832320,"digest":"sha256:ca43d7ccde26608a49536e7b8db6aaef8b53a12af6a7b25415e46622cef88158","download_count":1,"created_at":"2026-06-28T01:52:10Z","updated_at":"2026-06-28T01:52:17Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0-rc.11/atmos_1.222.0-rc.11_windows_arm64.exe"}],"tarball_url":"https://api.github.com/repos/cloudposse/atmos/tarball/v1.222.0-rc.11","zipball_url":"https://api.github.com/repos/cloudposse/atmos/zipball/v1.222.0-rc.11","body":"<details>\n  <summary>feat(emulator): local cloud emulators + emulator-based advanced quick-start & docs example drawer @osterman (#2647)</summary>\n## what\n\n**Emulator feature** — run cloud-service emulators locally as first-class Atmos components:\n\n- `emulator` component kind + driver registry (`pkg/emulator`): the `EmulatorDriver` interface, `ResolveDriver`/`Drivers`, `Endpoint`/`Profile` types, the built-in AWS **Floci** driver, and the AWS target-profile builder (dummy creds, `AWS_ENDPOINT_URL`, and the Terraform provider behavior flags env can't set).\n- `atmos emulator` CLI (`cmd/emulator`): lifecycle verbs (up/down/reset/list/…), flags, and shell completions.\n- Auth/identity binding so **in-process AWS and Terraform both reach the emulator** (`pkg/auth`, `pkg/component`, `internal/exec`); generic provider-config contribution (`pkg/generator`).\n- Design captured as three PRDs: `docs/prd/emulators.md`, `docs/prd/kubernetes-identity.md`, `docs/prd/provider-config-contributor.md`.\n- Examples + E2E: `examples/emulator-aws`, `examples/demo-floci`, and the floci/acceptance jobs.\n- Changelog: `website/blog/2026-06-22-emulator-persistence.mdx`.\n\n**Emulator-based advanced quick-start** — rewrote the advanced tutorial to deploy a real event-driven AWS backend (KMS key, encrypted S3 bucket, DynamoDB table, SNS topic, SQS queue, SSM Parameter Store config) **entirely on your laptop, with no AWS account and no credentials**, via the emulator. New backing example `examples/quick-start-advanced` (replaces the old VPC-based one).\n\n**Docs UI** — a right-side **`[Example]` drawer** that follows each quickstart page and shows the page's backing example files (`QuickStartExampleDrawer`, wired through `theme/DocItem/Content` + `theme/Root`, reading the file-browser plugin's global data). Plus restyled `File`, `Terminal`, `KeyPoints` (\"You will learn\"), `KeyTakeaways`, `EmbedExample`, and `ActionCard` components, a CodeBlock line-numbers toggle, and supporting theme/CSS overrides.\n\n## why\n\n- Emulators let contributors and CI run the full Atmos workflow — auth, secrets, vendoring, toolchain, Terraform apply — against local cloud emulators, the **same on a laptop and in CI**, with no cloud credentials. That makes the advanced tutorial runnable by anyone and gives fast, hermetic local iteration.\n- The example drawer and component restyle let each tutorial page show its backing example inline, so readers can follow the docs and the code side by side.\n\n## references\n\n- Stacked on `osterman/container-component-type` (reuses its persistent container lifecycle via `ComponentType: \"emulator\"`).\n- See `docs/prd/emulators.md` for the full design and per-step implementation sequence.\n\n</details>\n\n<details>\n  <summary>Fix bare command docs links @osterman (#2660)</summary>\n## what\n\n- Adds explicit redirects from bare command overview routes for `auth`, `ai`, and `toolchain` to their canonical `/usage` pages.\n- Updates announcement and feature-card links to point directly at the canonical command overview URLs.\n\n## why\n\n- Prevents users from hitting 404s when following bare command docs links like `/cli/commands/auth`.\n- Keeps existing `/usage` command overview URLs canonical without changing valid bare command routes such as `workflow`, `devcontainer`, and `ci`.\n\n## references\n\n- Reported from `https://atmos.tools/cli/commands/auth` returning 404.\n- Validated with `cd website && npm run build`.\n\n<!-- This is an auto-generated comment: release notes by coderabbit.ai -->\n\n## Summary by CodeRabbit\n\n* **Bug Fixes**\n  * Updated several CLI-related documentation and announcement links to point to the correct usage pages.\n  * Added automatic redirects from older command overview URLs to the new usage pages, reducing broken or outdated links.\n\n<!-- end of auto-generated comment: release notes by coderabbit.ai -->\n</details>\n","mentions_count":1},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/345081594","assets_url":"https://api.github.com/repos/cloudposse/atmos/releases/345081594/assets","upload_url":"https://uploads.github.com/repos/cloudposse/atmos/releases/345081594/assets{?name,label}","html_url":"https://github.com/cloudposse/atmos/releases/tag/v1.222.0-rc.10","id":345081594,"author":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"node_id":"RE_kwDOEW4XoM4UkYb6","tag_name":"v1.222.0-rc.10","target_commitish":"main","name":"v1.222.0-rc.10","draft":false,"immutable":false,"prerelease":true,"created_at":"2026-06-25T15:20:52Z","updated_at":"2026-06-26T01:50:43Z","published_at":"2026-06-26T01:50:43Z","assets":[{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/458201944","id":458201944,"node_id":"RA_kwDOEW4XoM4bT5tY","name":"atmos_1.222.0-rc.10_darwin_amd64","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":239720752,"digest":"sha256:bbdb4d710438633c9ffbf8feffc65011b341b906d5037c7e3400a8f5113e2023","download_count":1,"created_at":"2026-06-26T01:49:28Z","updated_at":"2026-06-26T01:49:36Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0-rc.10/atmos_1.222.0-rc.10_darwin_amd64"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/458202021","id":458202021,"node_id":"RA_kwDOEW4XoM4bT5ul","name":"atmos_1.222.0-rc.10_darwin_arm64","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":225134354,"digest":"sha256:321713db14f939f404daf2053208c180419f2481ce59e1e5e981d971c9fbff20","download_count":1,"created_at":"2026-06-26T01:49:35Z","updated_at":"2026-06-26T01:49:44Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0-rc.10/atmos_1.222.0-rc.10_darwin_arm64"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/458202035","id":458202035,"node_id":"RA_kwDOEW4XoM4bT5uz","name":"atmos_1.222.0-rc.10_freebsd_amd64","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":233611436,"digest":"sha256:dcad8cc8f37fa243acd615dd7c715f69cb4bbbf638fb07de26d4ea83c158cc31","download_count":1,"created_at":"2026-06-26T01:49:36Z","updated_at":"2026-06-26T01:49:43Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0-rc.10/atmos_1.222.0-rc.10_freebsd_amd64"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/458202076","id":458202076,"node_id":"RA_kwDOEW4XoM4bT5vc","name":"atmos_1.222.0-rc.10_freebsd_arm64","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":217317548,"digest":"sha256:791e86255c9174b5470080e5504a1d5e3a8ff0b212b57d74029ad29951507223","download_count":1,"created_at":"2026-06-26T01:49:44Z","updated_at":"2026-06-26T01:49:52Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0-rc.10/atmos_1.222.0-rc.10_freebsd_arm64"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/458201946","id":458201946,"node_id":"RA_kwDOEW4XoM4bT5ta","name":"atmos_1.222.0-rc.10_linux_386","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":218050722,"digest":"sha256:900754a1c718ebc2559dc3c15c2e9d808e82fe7bb035a9f0ad11d18f922521b6","download_count":1,"created_at":"2026-06-26T01:49:28Z","updated_at":"2026-06-26T01:49:35Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0-rc.10/atmos_1.222.0-rc.10_linux_386"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/458201947","id":458201947,"node_id":"RA_kwDOEW4XoM4bT5tb","name":"atmos_1.222.0-rc.10_linux_amd64","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":234451106,"digest":"sha256:1dadcfb3cda64a0416ee60e78cd5b6408bb425185c7e1c9b48709c6edd4752d4","download_count":9,"created_at":"2026-06-26T01:49:28Z","updated_at":"2026-06-26T01:49:35Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0-rc.10/atmos_1.222.0-rc.10_linux_amd64"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/458202081","id":458202081,"node_id":"RA_kwDOEW4XoM4bT5vh","name":"atmos_1.222.0-rc.10_linux_arm","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":218235042,"digest":"sha256:e3d4d9ac8efc836079e3bf75bc635a945ebfb482678f50948187f9e0b0008f6c","download_count":1,"created_at":"2026-06-26T01:49:44Z","updated_at":"2026-06-26T01:49:58Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0-rc.10/atmos_1.222.0-rc.10_linux_arm"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/458202080","id":458202080,"node_id":"RA_kwDOEW4XoM4bT5vg","name":"atmos_1.222.0-rc.10_linux_arm64","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":218103970,"digest":"sha256:76401736f7da6fda13f1c182b10cfdc52624be61cff2790ada5456e5ad1de4d1","download_count":1,"created_at":"2026-06-26T01:49:44Z","updated_at":"2026-06-26T01:49:52Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0-rc.10/atmos_1.222.0-rc.10_linux_arm64"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/458202083","id":458202083,"node_id":"RA_kwDOEW4XoM4bT5vj","name":"atmos_1.222.0-rc.10_SHA256SUMS","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":1096,"digest":"sha256:ad86ea73980d0dfb9b4acbe468527f3a10fedd471b294b6fed2fdc135bb13211","download_count":1,"created_at":"2026-06-26T01:49:45Z","updated_at":"2026-06-26T01:49:45Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0-rc.10/atmos_1.222.0-rc.10_SHA256SUMS"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/458201945","id":458201945,"node_id":"RA_kwDOEW4XoM4bT5tZ","name":"atmos_1.222.0-rc.10_windows_386.exe","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/x-ms-dos-executable","state":"uploaded","size":222649344,"digest":"sha256:2f46ff0b8bfac6f20dd7b136b22aaead91a99cef7009cea4ccfa3bac61be6be4","download_count":1,"created_at":"2026-06-26T01:49:28Z","updated_at":"2026-06-26T01:49:35Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0-rc.10/atmos_1.222.0-rc.10_windows_386.exe"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/458202025","id":458202025,"node_id":"RA_kwDOEW4XoM4bT5up","name":"atmos_1.222.0-rc.10_windows_amd64.exe","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/x-ms-dos-executable","state":"uploaded","size":238373376,"digest":"sha256:c514fbc430948890892db182e9a91578c40e1c9eea27de52e0c8a27eb9f33b12","download_count":2,"created_at":"2026-06-26T01:49:35Z","updated_at":"2026-06-26T01:49:44Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0-rc.10/atmos_1.222.0-rc.10_windows_amd64.exe"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/458202024","id":458202024,"node_id":"RA_kwDOEW4XoM4bT5uo","name":"atmos_1.222.0-rc.10_windows_arm64.exe","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/x-ms-dos-executable","state":"uploaded","size":219644416,"digest":"sha256:6a72f99ebe380031b6dfb30f77b5706223786d66b7c1d604e5b0f87a1b1c6c22","download_count":1,"created_at":"2026-06-26T01:49:35Z","updated_at":"2026-06-26T01:49:44Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0-rc.10/atmos_1.222.0-rc.10_windows_arm64.exe"}],"tarball_url":"https://api.github.com/repos/cloudposse/atmos/tarball/v1.222.0-rc.10","zipball_url":"https://api.github.com/repos/cloudposse/atmos/zipball/v1.222.0-rc.10","body":"<details>\n  <summary>feat(hooks): run custom step types as lifecycle hooks (kind: step) @osterman (#2658)</summary>\n## what\n\n- Add a new `kind: step` component-lifecycle hook that delegates to the workflow/custom-command **step registry**, making every registered step type (`container`, `http`, `toast`, `log`, `markdown`, …) runnable on terraform lifecycle events — name a step `type:` and pass its parameters under `with:`.\n- Plumb the **operation outcome** to hooks: user hooks now fire on the failure path (not just success), a new `when: success|failure|always` selector (default `success`) controls outcome-based firing, and `{{ .status }}`/`{{ .exit_code }}`/`{{ .error }}` template context plus `ATMOS_HOOK_*` env vars (alongside component/stack) let a hook announce exactly what happened.\n- Tighten the `hooks` JSON schema into a structured per-hook envelope (`kind` enum incl. `step`, `events`, `on_failure`, `when`, `type`, `with`, `retry`) across all three schema copies, kept non-breaking (`additionalProperties: true`).\n- Add docs (hooks reference + new sections), a PRD, a changelog blog post, and a roadmap milestone; unit tests cover routing, nested `with:` decode, `when` filtering, outcome template/env exposure, retry, and `on_failure`.\n\n## why\n\n- The hook system previously hard-coded a small kind list (`store`, `command`, `infracost`, `checkov`, `kics`, `trivy`, `git`); every new capability meant a new kind. Reusing the existing, well-tested step registry lets the whole step library work as hooks without forking the abstraction.\n- A key use case — \"the VPC component in the foobar stack failed\" — was impossible: `after-*` hooks fired only on success (cobra skips `PostRunE` on error) and the outcome reached only CI hooks, never user hooks. Firing user hooks on failure with `when` + outcome context closes that gap while defaulting to success-only so existing hooks (e.g. `store`) keep their behavior.\n\n## references\n\n- PRD: `docs/prd/hooks-step-types.md`\n- Docs: `/stacks/hooks#kind-step-run-a-step-type` and `#reacting-to-success-or-failure`\n- The `http` step type used in the Slack example lands in a separate PR; the bridge works today with every registered step type.\n\n\n<!-- This is an auto-generated comment: release notes by coderabbit.ai -->\n## Summary by CodeRabbit\n\n* **New Features**\n  * Added composable declarative `when` conditions for workflow steps, hooks, and structured custom-command steps (including predicate logic and workflow-style `retry`).\n  * Introduced `kind: step` hooks to run any registered workflow/custom-command step type via `type`, `with`, `retry`, `env`, and `on_failure`.\n  * Hook lifecycle outcomes are now exposed to hook templates and available as `ATMOS_HOOK_STATUS`, `ATMOS_HOOK_EXIT_CODE`, and `ATMOS_HOOK_ERROR`.\n* **Bug Fixes**\n  * Steps/hooks now correctly skip when conditions don’t match, and verification respects both outcome status and CI gating.\n* **Documentation**\n  * Updated docs/schemas/examples, and standardized Terraform lifecycle hook event names to dotted format.\n* **Tests**\n  * Added/updated coverage for conditional execution, schema validation, and the step hook engine.\n<!-- end of auto-generated comment: release notes by coderabbit.ai -->\n</details>\n\n<details>\n  <summary>Skip fork autofix and refresh setup-go pins @osterman (#2659)</summary>\n## what\n\n- Skip the `atmos.ci` `autofix` job when a pull request comes from a fork.\n- Keep the existing `atmos-pro[bot]` loop guard and same-repo PR autofix behavior.\n- Refresh eight `actions/setup-go` `v6` SHA pins to match the current upstream `v6` tag.\n\n## why\n\n- Fork PRs do not receive OIDC, repo variables, or writable credentials, so `atmos pro commit` cannot authenticate or push fixes.\n- Skipping the job avoids guaranteed red checks for external contributors while preserving formatting automation for internal PRs.\n- The `verify` workflow checks that SHA-pinned actions match their tag comments; the previous `setup-go` pins pointed at `v6.4.0` while labeled as `v6`.\n\n## references\n\n- Validated with workflow YAML parsing, upstream tag checks for `actions/setup-go`, and commit hook `check yaml`.\n\n\n<!-- This is an auto-generated comment: release notes by coderabbit.ai -->\n## Summary by CodeRabbit\n\n* **Chores**\n  * Updated multiple CI/E2E workflows to pin the Go setup action (`actions/setup-go@v6`) to newer immutable revisions for more consistent build and test runs.\n  * Improved the automation logic to avoid running the auto-fix job on fork-originated pull requests where commit/push authentication isn’t supported.\n  * Added inline documentation in the automation workflow explaining the fork/OIDC limitation.\n<!-- end of auto-generated comment: release notes by coderabbit.ai -->\n</details>\n","mentions_count":1},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/344440667","assets_url":"https://api.github.com/repos/cloudposse/atmos/releases/344440667/assets","upload_url":"https://uploads.github.com/repos/cloudposse/atmos/releases/344440667/assets{?name,label}","html_url":"https://github.com/cloudposse/atmos/releases/tag/v1.222.0-rc.9","id":344440667,"author":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"node_id":"RE_kwDOEW4XoM4Uh79b","tag_name":"v1.222.0-rc.9","target_commitish":"main","name":"v1.222.0-rc.9","draft":false,"immutable":false,"prerelease":true,"created_at":"2026-06-24T21:10:07Z","updated_at":"2026-06-25T01:48:02Z","published_at":"2026-06-25T01:48:02Z","assets":[{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/457196656","id":457196656,"node_id":"RA_kwDOEW4XoM4bQERw","name":"atmos_1.222.0-rc.9_darwin_amd64","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":239645824,"digest":"sha256:865afafdad719aeb63e35c0598dc7cbe7443e86b9ba8e73a8889a10fe3617ec7","download_count":0,"created_at":"2026-06-25T01:47:02Z","updated_at":"2026-06-25T01:47:11Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0-rc.9/atmos_1.222.0-rc.9_darwin_amd64"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/457196589","id":457196589,"node_id":"RA_kwDOEW4XoM4bQEQt","name":"atmos_1.222.0-rc.9_darwin_arm64","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":225067106,"digest":"sha256:6be53db9251d4e25a2412b1ea7432507c209274264324f41594cd640b73c50d6","download_count":0,"created_at":"2026-06-25T01:46:53Z","updated_at":"2026-06-25T01:47:03Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0-rc.9/atmos_1.222.0-rc.9_darwin_arm64"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/457196659","id":457196659,"node_id":"RA_kwDOEW4XoM4bQERz","name":"atmos_1.222.0-rc.9_freebsd_amd64","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":233537708,"digest":"sha256:61e6c7afef70a1c74dd63dda6aac62d511d14a5fdcdb628c7444d90b90fa1984","download_count":0,"created_at":"2026-06-25T01:47:03Z","updated_at":"2026-06-25T01:47:10Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0-rc.9/atmos_1.222.0-rc.9_freebsd_amd64"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/457196591","id":457196591,"node_id":"RA_kwDOEW4XoM4bQEQv","name":"atmos_1.222.0-rc.9_freebsd_arm64","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":217252012,"digest":"sha256:11664fddd8b2c0227415bd53c1032d717254a4a27a09d472f68b70555305a3ef","download_count":0,"created_at":"2026-06-25T01:46:53Z","updated_at":"2026-06-25T01:47:01Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0-rc.9/atmos_1.222.0-rc.9_freebsd_arm64"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/457196643","id":457196643,"node_id":"RA_kwDOEW4XoM4bQERj","name":"atmos_1.222.0-rc.9_linux_386","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":217985186,"digest":"sha256:ecfb8b074a9370c018691ed1cfa593cb445aaa3d8e4345357734e95f49bb06e6","download_count":0,"created_at":"2026-06-25T01:47:01Z","updated_at":"2026-06-25T01:47:09Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0-rc.9/atmos_1.222.0-rc.9_linux_386"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/457196707","id":457196707,"node_id":"RA_kwDOEW4XoM4bQESj","name":"atmos_1.222.0-rc.9_linux_amd64","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":234377378,"digest":"sha256:6a815ba54d31023684ba3fd8d89df1f7e9dcf11c061d5ec8fd10fc6b4dcae1fe","download_count":7,"created_at":"2026-06-25T01:47:09Z","updated_at":"2026-06-25T01:47:16Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0-rc.9/atmos_1.222.0-rc.9_linux_amd64"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/457196710","id":457196710,"node_id":"RA_kwDOEW4XoM4bQESm","name":"atmos_1.222.0-rc.9_linux_arm","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":218169506,"digest":"sha256:9de3c4f7e56f8c9b07203dce57f66b9ad616cf344eb64439aa21e432a1bd9de6","download_count":0,"created_at":"2026-06-25T01:47:10Z","updated_at":"2026-06-25T01:47:18Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0-rc.9/atmos_1.222.0-rc.9_linux_arm"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/457196648","id":457196648,"node_id":"RA_kwDOEW4XoM4bQERo","name":"atmos_1.222.0-rc.9_linux_arm64","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":218038434,"digest":"sha256:8fbdb7259b193e2761977a9fd6ead625df765a8a60937cf70fb921724cd2a2cd","download_count":0,"created_at":"2026-06-25T01:47:02Z","updated_at":"2026-06-25T01:47:09Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0-rc.9/atmos_1.222.0-rc.9_linux_arm64"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/457196714","id":457196714,"node_id":"RA_kwDOEW4XoM4bQESq","name":"atmos_1.222.0-rc.9_SHA256SUMS","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":1085,"digest":"sha256:3b047fc6a66704c6d9c6801492dc64382fbb46a22ca4a42999c8a1dde7af65f4","download_count":0,"created_at":"2026-06-25T01:47:11Z","updated_at":"2026-06-25T01:47:12Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0-rc.9/atmos_1.222.0-rc.9_SHA256SUMS"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/457196590","id":457196590,"node_id":"RA_kwDOEW4XoM4bQEQu","name":"atmos_1.222.0-rc.9_windows_386.exe","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/x-ms-dos-executable","state":"uploaded","size":222580736,"digest":"sha256:eedafe035908d27342a5d75a199a5cdc184f00f0a01add98c43dcdfacac3ca55","download_count":0,"created_at":"2026-06-25T01:46:53Z","updated_at":"2026-06-25T01:47:01Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0-rc.9/atmos_1.222.0-rc.9_windows_386.exe"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/457196592","id":457196592,"node_id":"RA_kwDOEW4XoM4bQEQw","name":"atmos_1.222.0-rc.9_windows_amd64.exe","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/x-ms-dos-executable","state":"uploaded","size":238297088,"digest":"sha256:5968baa4bef7f6eeea07eaf02757ee8f9595e069021057488684e7b4705e53c1","download_count":0,"created_at":"2026-06-25T01:46:53Z","updated_at":"2026-06-25T01:47:02Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0-rc.9/atmos_1.222.0-rc.9_windows_amd64.exe"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/457196699","id":457196699,"node_id":"RA_kwDOEW4XoM4bQESb","name":"atmos_1.222.0-rc.9_windows_arm64.exe","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/x-ms-dos-executable","state":"uploaded","size":219572736,"digest":"sha256:0c0c0e2714ba6661c3d3688098374b4ef26d2a7743f240f3d94c02a7666c2647","download_count":0,"created_at":"2026-06-25T01:47:09Z","updated_at":"2026-06-25T01:47:16Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0-rc.9/atmos_1.222.0-rc.9_windows_arm64.exe"}],"tarball_url":"https://api.github.com/repos/cloudposse/atmos/tarball/v1.222.0-rc.9","zipball_url":"https://api.github.com/repos/cloudposse/atmos/zipball/v1.222.0-rc.9","body":"<details>\n  <summary>feat(workflows): http step type (webhook alias) with retries @osterman (#2641)</summary>\n## what\n\n- Add a native `http` workflow/custom-command step (`type: http`) that performs an HTTP request — any verb (`GET`/`POST`/`PUT`/`PATCH`/`DELETE`/`HEAD`/`OPTIONS`), `query` string parameters, `headers`, and a request body via `body` (raw) or `form` (urlencoded, or JSON when `Content-Type` is JSON).\n- Keep `webhook` as a first-class **alias** for `http` (`type: webhook` behaves identically) for the fire-a-notification use case. This adds alias support to the step registry: `NewBaseHandler` is variadic for aliases, `Get()` resolves aliases, and `List`/`Count` report only the canonical entry (no duplicate step type).\n- Per-attempt `timeout` and `retry` that composes with the existing `retry:` policy; retry is HTTP-aware (transport errors, `5xx`, and `429` retry by default, other `4xx` fail fast, and `retry.conditions` regexes force additional cases).\n- Configurable success criteria via `expect.status` (codes) and `expect.response` (regexes); the response body and status are captured as the step's value/metadata for downstream steps.\n- Schema fields on `WorkflowStep` and `Task` (so it works in both workflows and custom commands) plus the `HTTPExpect` struct, `ErrHTTPStep*` sentinels, JSON manifest updates, docs, an `examples/http-webhooks` example, a changelog blog post, and a roadmap milestone.\n\n## why\n\n- Calling external endpoints (notify a service, trigger a CI job, hit a deployment webhook, poll a health check) previously required shelling out to `curl`, which isn't portable (Windows), is awkward to template, and gets no first-class timeout/retry handling.\n- The step is a general-purpose, verb-agnostic **outbound** HTTP client, so `http` is the accurate name (an inbound callback receiver is what \"webhook\" conventionally means); `webhook` is retained as an alias so the evocative name still works.\n- Extended/registry step types are not wrapped by the legacy `retry.Do` path that `shell`/`atmos` use, so the handler applies retry itself via `retry.WithPredicate` — which is what enables status-code-aware retry decisions a generic wrapper can't make.\n\n## references\n\n- Docs: [workflow step types](/workflows) and [custom commands](/cli/configuration/commands)\n- Changelog: `website/blog/2026-06-20-http-step-type.mdx`\n\n\n<!-- This is an auto-generated comment: release notes by coderabbit.ai -->\n## Summary by CodeRabbit\n\n## Release Notes\n\n* **New Features**\n  * Added an **HTTP workflow step** (`http`, with `webhook` alias) to call HTTP endpoints from workflows.\n  * Supports templated **URL, method, headers, query**, and mutually exclusive **raw `body` vs `form`** payloads.\n  * Added **response expectations** (status allowlist and regex matching), with the **response body** as the step value and status/headers metadata.\n  * Introduced **per-step timeouts** and HTTP-aware retries, including **`retry.conditions`** for additional match-based retries.\n\n* **Documentation**\n  * Expanded HTTP step docs, examples, and retry-condition guidance; updated step type tables.\n\n* **Tests**\n  * Added end-to-end and unit tests covering validation, execution, retries, templating, and aliases.\n<!-- end of auto-generated comment: release notes by coderabbit.ai -->\n\n</details>\n\n<details>\n  <summary>feat(workflows): add `say` step for audible TTS notifications @osterman (#2640)</summary>\n## what\n\n- Add a new `say` workflow step type that speaks its `content` aloud using text-to-speech, and gracefully degrades to printing the message as a Markdown blockquote when no speech engine is available or when running in CI/headless.\n- Introduce a reusable cross-platform `pkg/say` package (mirroring `pkg/browser`) that detects macOS `say`, Linux `spd-say`/`espeak`/`espeak-ng`, and Windows PowerShell `System.Speech`, behind a `Speaker` interface with a `CommandRunner` DI seam and functional options.\n- Support a CSS font-family-style `voice` list (first installed voice on the host wins), a `rate` field (`slow`/`normal`/`fast`), and a `print` policy (`fallback`/`always`/`never`); add the matching `Voice`/`Rate`/`Print` fields to `WorkflowStep` and sentinel errors `ErrSayNotFound`/`ErrVoiceListUnsupported`.\n- Add an `examples/say-something/` reference example, workflow step-type docs, an announcement blog post, and a roadmap milestone under the Workflows Overhaul initiative.\n\n## why\n\n- Long-running workflows often outlast your attention; `say` gives an audible cue when a workflow finishes or needs input, going beyond the bell-only `alert` step by announcing what happened.\n- Shelling out to `say` only works on macOS — this makes audible notifications portable across macOS/Linux/Windows and safe in CI, so the same workflow runs unchanged everywhere and never fails on a missing engine.\n\n## references\n\n- N/A\n\n\n<!-- This is an auto-generated comment: release notes by coderabbit.ai -->\n## Summary by CodeRabbit\n\n## Release Notes\n\n* **New Features**\n  * Added a `say` workflow step for cross-platform text-to-speech with automatic engine detection.\n  * Supports `voice`, `rate`, and a `print` policy (`fallback`, `always`, `never`) that can render a Markdown blockquote when audio isn’t available.\n\n* **Bug Fixes**\n  * Workflows keep running when speech engines are missing and when voice listing isn’t supported.\n\n* **Documentation**\n  * Added `say` step docs, a “say something” example (README + Atmos config + workflow), and a blog post; updated step-type listings.\n\n* **Tests**\n  * Added unit tests covering detection, voice enumeration/parsing, argument generation, and `say` execution.\n<!-- end of auto-generated comment: release notes by coderabbit.ai -->\n</details>\n\n<details>\n  <summary>feat(hooks): CI annotations and SARIF upload for scanner findings @osterman (#2631)</summary>\n## what\n\n- Surface scanner-hook findings (Checkov, Trivy, KICS) in CI **beyond the job summary**:\n  - **`ci.annotations`** (default on) — inline GitHub `::error`/`::warning` annotations anchored at each finding's file and line on the PR diff. The non-Code-Scanning path: needs **no** GitHub Advanced Security.\n  - **`ci.results`** (default off) — upload the raw SARIF to **GitHub Code Scanning** (Security tab) natively, with no `github/codeql-action` step. Analysis category is auto-derived from the scan target so per-component uploads don't overwrite each other.\n- Implemented as **native CI provider capabilities** (`Annotator`, `SARIFReporter`) — siblings of the existing check-run/comment/summary capabilities — not as hooks. All three reporting outputs (`ci.summary`/`ci.annotations`/`ci.results`) are gated by `ci.enabled`.\n- **Custom hooks** opt in by adding `format: sarif` to a `kind: command` hook — any SARIF-emitting tool (tfsec, semgrep, gitleaks, …) gets findings, annotations, and upload with no Go code.\n- Docs (incl. required GitHub Actions permissions), a changelog blog post, and a roadmap milestone.\n\n## why\n\n- The CI job summary (#2617) gave a readable report, but the two richest GitHub surfaces — inline PR annotations and tracked Code Scanning alerts — were missing even though the data was already in the parsed SARIF.\n- Modeling this as provider capabilities (rather than reviving the deprecated `ci.*` hook *kinds*) keeps CI reporting where it belongs and lets every SARIF-emitting hook, built-in or custom, participate through one shared path.\n\n## references\n\n- Builds on #2617 (scanner findings → CI job summary) and completes the CI-reporting direction from #2614.\n- **Note:** base is `main`; #2617 is not yet merged, so this PR's diff currently includes #2617's commits — they drop out once #2617 merges and this branch is rebased.\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\n\n<!-- This is an auto-generated comment: release notes by coderabbit.ai -->\n## Summary by CodeRabbit\n\n* **New Features**\n  * Added CI reporting for security scan findings in GitHub Actions: job step summaries, inline workflow diff annotations, and optional GitHub Code Scanning SARIF uploads (configurable via `ci.enabled`, `ci.annotations`, and `ci.results`).\n  * Enabled `kind: command` hooks with `format: sarif` to route findings into the same CI destinations.\n* **Bug Fixes**\n  * Switched the build base image to Debian trixie to resolve scanner runtime GLIBC issues.\n  * Standardized AWS custom endpoint configuration to `spec.endpoint_url`; CI reporting is best-effort and won’t fail scans/plans.\n* **Documentation**\n  * Updated CI reporting and hook documentation, plus endpoint configuration references.\n<!-- end of auto-generated comment: release notes by coderabbit.ai -->\n</details>\n\n<details>\n  <summary>feat(container): persistent container component kind + compositions @osterman (#2645)</summary>\n## what\n\nAdds a stack-scoped, Atmos-native **`container` component kind** — one component is one persistent service — plus first-class **compositions** membership.\n\n- **Lifecycle** (`atmos container <verb> <component> -s <stack>`): `build`, `push`, `pull`, `run`, `up`, `ps`, `logs`, `exec`, `restart`, `stop`, `rm`, `down`. Long-running containers are discovered by labels derived from the canonical instance address `<stack>/container/<component>` (name `atmos-<stack>-container-<component>`), not local state files. `up`/`run` build the image first when `vars.build`-style `build:` is set and the image is missing.\n- **First-class config** — `image`, `build`, `run` are top-level component sections (reusing the workflow container-step structs `ContainerBuildStep`/`ContainerRunStep`), **not** nested under `vars`. Container app env comes from the component `env:` section.\n- **`atmos container list`** shows per-instance running state (running/stopped/unknown), discovered by label. The generic **`atmos list components`** lists containers as a component type without container-specific status — consistent with terraform/ansible (there is no `atmos terraform list`/`atmos ansible list`).\n- **Compositions** — a first-class `composition:` membership field + a top-level `compositions:` section (closed for membership, open for fulfillment). Operating a component with undeclared membership is a hard error; `atmos composition validate <name> -s <stack>` reports fulfilled vs. not-provided services.\n- **Deep merge** — the custom-component fallback now runs `metadata.inherits` inheritance + generic deep-merge of all top-level keys, so container honors catalog/abstract defaults like built-in kinds. Abstract components are rejected for execution and filtered from listings.\n- Extends the describe-component auto-detect and the describe/list type whitelist for `container` (and fixes the pre-existing `ansible` gap in `list components`).\n\n## why\n\nContainers should be first-class, addressable component instances like terraform/helmfile/packer/ansible, and `atmos list components` should show whether each is running. A set of container components grouped by a `composition` is \"our own Compose\" with no `compose.yaml`. Implements `docs/prd/container-components.md`.\n\n## references\n\n- PRD: `docs/prd/container-components.md`, `docs/prd/compositions.md`\n- Examples: `examples/container-component/`, `examples/compositions/`\n- Docs: `website/docs/cli/commands/container/`, `website/docs/components/container.mdx`\n- Contributor skill: `.claude/skills/atmos-core-component-development/`\n\n> [!NOTE]\n> Stacked on `osterman/container-step-prd` (the container **step**), not `main`. Changelog/roadmap are not required for this base (the gate is main-only); they'll go on the PR that brings the container feature to `main`.\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\n\n<!-- This is an auto-generated comment: release notes by coderabbit.ai -->\n## Summary by CodeRabbit\n\n## Release Notes\n\n* **New Features**\n  * Added `atmos container` for persistent, stack-scoped container lifecycle management (build/push/pull, run/up/down, start/stop/restart, rm, ps/logs/exec/attach), including bulk mode (`--all`) and interactive selection.\n  * Added `atmos composition validate` to report composition service fulfillment across stacks.\n\n* **Updates**\n  * Introduced first-class `components.container.*` with `image/build/run`, `metadata.inherits` deep-merge, and improved `run.command` parsing.\n  * Added `run.restart` and `run.healthcheck` support; updated container instance labels to `tools.atmos.*`, plus enhanced shell completion and log streaming.\n\n* **Documentation**\n  * Updated container/composition guides and added runnable examples.\n<!-- end of auto-generated comment: release notes by coderabbit.ai -->\n\n</details>\n","mentions_count":1},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/343836978","assets_url":"https://api.github.com/repos/cloudposse/atmos/releases/343836978/assets","upload_url":"https://uploads.github.com/repos/cloudposse/atmos/releases/343836978/assets{?name,label}","html_url":"https://github.com/cloudposse/atmos/releases/tag/v1.222.0-rc.8","id":343836978,"author":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"node_id":"RE_kwDOEW4XoM4Ufoky","tag_name":"v1.222.0-rc.8","target_commitish":"main","name":"v1.222.0-rc.8","draft":false,"immutable":false,"prerelease":true,"created_at":"2026-06-24T00:59:11Z","updated_at":"2026-06-24T02:26:21Z","published_at":"2026-06-24T01:21:06Z","assets":[{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/456196760","id":456196760,"node_id":"RA_kwDOEW4XoM4bMQKY","name":"atmos_1.222.0-rc.8_darwin_amd64","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":239238336,"digest":"sha256:aeb1bc4ca91e396ac437cceda4bba8280709a3eb44bf3e60a399c76d78154c8f","download_count":0,"created_at":"2026-06-24T02:25:53Z","updated_at":"2026-06-24T02:26:01Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0-rc.8/atmos_1.222.0-rc.8_darwin_amd64"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/456196762","id":456196762,"node_id":"RA_kwDOEW4XoM4bMQKa","name":"atmos_1.222.0-rc.8_darwin_arm64","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":224697698,"digest":"sha256:9ad6c7fadd5ffc10796dcf71b7c84c1fefa11cfb4d01ecf86d867e85633ef0ce","download_count":0,"created_at":"2026-06-24T02:25:53Z","updated_at":"2026-06-24T02:26:01Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0-rc.8/atmos_1.222.0-rc.8_darwin_arm64"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/456197065","id":456197065,"node_id":"RA_kwDOEW4XoM4bMQPJ","name":"atmos_1.222.0-rc.8_freebsd_amd64","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":233132204,"digest":"sha256:e1b34731de0bdef2f290b486e6fce3e46c05f1e66c1657af17f679e611d12c8a","download_count":0,"created_at":"2026-06-24T02:26:13Z","updated_at":"2026-06-24T02:26:21Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0-rc.8/atmos_1.222.0-rc.8_freebsd_amd64"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/456196909","id":456196909,"node_id":"RA_kwDOEW4XoM4bMQMt","name":"atmos_1.222.0-rc.8_freebsd_arm64","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":216924332,"digest":"sha256:5624a1efd72fe467450347d86411240403b6e65244893b3590cdf1728c8696f0","download_count":0,"created_at":"2026-06-24T02:26:04Z","updated_at":"2026-06-24T02:26:11Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0-rc.8/atmos_1.222.0-rc.8_freebsd_arm64"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/456196761","id":456196761,"node_id":"RA_kwDOEW4XoM4bMQKZ","name":"atmos_1.222.0-rc.8_linux_386","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":217645218,"digest":"sha256:51c16f7e0fd69184309b01701d4c446e08d37691ee95cc08abf314658c9e1ec6","download_count":0,"created_at":"2026-06-24T02:25:53Z","updated_at":"2026-06-24T02:26:01Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0-rc.8/atmos_1.222.0-rc.8_linux_386"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/456196895","id":456196895,"node_id":"RA_kwDOEW4XoM4bMQMf","name":"atmos_1.222.0-rc.8_linux_amd64","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":233971874,"digest":"sha256:8ba28e7e5200261213fb5e6993c037809f6823de19ea86899b1ff452436bd805","download_count":103,"created_at":"2026-06-24T02:26:03Z","updated_at":"2026-06-24T02:26:12Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0-rc.8/atmos_1.222.0-rc.8_linux_amd64"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/456197076","id":456197076,"node_id":"RA_kwDOEW4XoM4bMQPU","name":"atmos_1.222.0-rc.8_linux_arm","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":217841826,"digest":"sha256:95b878852f1d955f57b54c2d0f767c6fb816b4832af76411b288c3e8532e6ccf","download_count":0,"created_at":"2026-06-24T02:26:14Z","updated_at":"2026-06-24T02:26:21Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0-rc.8/atmos_1.222.0-rc.8_linux_arm"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/456196908","id":456196908,"node_id":"RA_kwDOEW4XoM4bMQMs","name":"atmos_1.222.0-rc.8_linux_arm64","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":217710754,"digest":"sha256:58b595924a68c1e3181fa69eda60f55f98f9a9cff9e2e0f3afad3382b63b4c1c","download_count":0,"created_at":"2026-06-24T02:26:04Z","updated_at":"2026-06-24T02:26:14Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0-rc.8/atmos_1.222.0-rc.8_linux_arm64"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/456197093","id":456197093,"node_id":"RA_kwDOEW4XoM4bMQPl","name":"atmos_1.222.0-rc.8_SHA256SUMS","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":1085,"digest":"sha256:d238ef8f833a7750b6c7761f7951fe10302ecea9f0c222bb4dd6c93773b53968","download_count":59,"created_at":"2026-06-24T02:26:16Z","updated_at":"2026-06-24T02:26:16Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0-rc.8/atmos_1.222.0-rc.8_SHA256SUMS"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/456197058","id":456197058,"node_id":"RA_kwDOEW4XoM4bMQPC","name":"atmos_1.222.0-rc.8_windows_386.exe","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/x-ms-dos-executable","state":"uploaded","size":222230016,"digest":"sha256:1f5930cd1e4f94e52fe1a97de6c3f60449cfae99efadc48a0d60e3841608e38c","download_count":0,"created_at":"2026-06-24T02:26:13Z","updated_at":"2026-06-24T02:26:21Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0-rc.8/atmos_1.222.0-rc.8_windows_386.exe"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/456196904","id":456196904,"node_id":"RA_kwDOEW4XoM4bMQMo","name":"atmos_1.222.0-rc.8_windows_amd64.exe","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/x-ms-dos-executable","state":"uploaded","size":237888000,"digest":"sha256:937e5f38168cd765a03b13707c91cfdd9ff02df1e3e70664677c7673469ccf2f","download_count":0,"created_at":"2026-06-24T02:26:03Z","updated_at":"2026-06-24T02:26:11Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0-rc.8/atmos_1.222.0-rc.8_windows_amd64.exe"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/456196758","id":456196758,"node_id":"RA_kwDOEW4XoM4bMQKW","name":"atmos_1.222.0-rc.8_windows_arm64.exe","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/x-ms-dos-executable","state":"uploaded","size":219229696,"digest":"sha256:0ef11ee60fa6b198fcad3d1d83c01488abcf2fae4761c384342d19da673d2eef","download_count":0,"created_at":"2026-06-24T02:25:53Z","updated_at":"2026-06-24T02:26:01Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0-rc.8/atmos_1.222.0-rc.8_windows_arm64.exe"}],"tarball_url":"https://api.github.com/repos/cloudposse/atmos/tarball/v1.222.0-rc.8","zipball_url":"https://api.github.com/repos/cloudposse/atmos/zipball/v1.222.0-rc.8","body":"<details>\n  <summary>docs(ci): document github/artifacts planfile runtime-token requirement + E2E test @osterman (#2649)</summary>\n## what\n\n- **Planfile storage works end-to-end in CI.** The `github/artifacts` store talks to the GitHub Artifacts runtime API for both upload and download, so a planfile uploaded by a `plan` job can be consumed by a separate `deploy` job in the same run.\n- **Automatic, configurable drift verification on `deploy`.** When planfile storage is configured and `atmos terraform deploy` runs under CI, Atmos downloads the stored plan, re-plans, compares them with a semantic JSON plan-diff, and applies the verified plan — failing on drift by default. Configurable via `components.terraform.planfiles.verify` (`fail | warn | off`) and `--verify-plan` / `--no-verify-plan` (CLI > config > CI default).\n- Generalized the in-repo `github-runtime` action to advertise planfiles, documented the runtime-token requirement, and added the automatic-flow `planfile-verify-e2e` workflow (kept the manual `planfile-artifacts-e2e`).\n\n## why\n\n- The same-run plan→deploy handoff (the core CI use case) was broken: GitHub's REST API won't serve an in-progress run's artifact, and verification was opt-in and undocumented.\n- A planfile legitimately varies between review and apply (values known-after-apply, computed fields, hashes, ordering). A naive diff rejects a still-valid plan as \"drifted\"; the semantic comparison tolerates benign variation while catching real drift — which is what makes plan-then-deploy practical.\n- Verification belongs on `deploy` (which re-runs `plan`, so a fresh plan exists to diff against), not `apply` (which never re-plans).\n\n## references\n\n- Docs: [Planfile Storage](https://atmos.tools/ci/planfile-storage), [Planfile drift verification](https://atmos.tools/components/terraform/planfiles#drift-verification), [`atmos terraform deploy`](https://atmos.tools/cli/commands/terraform/deploy)\n- Changelog: `website/blog/2026-06-22-native-ci-planfile-verification.mdx`\n\n\n<!-- This is an auto-generated comment: release notes by coderabbit.ai -->\n\n## Summary by CodeRabbit\n\n# Release Notes\n\n* **New Features**\n  * Configurable Terraform planfile drift verification during deploy with three modes: `fail` (strict), `warn` (proceed), or `off` (skip).\n  * GitHub Actions Artifacts support for same-run planfile downloads via runtime API.\n  * CLI flags (`--verify-plan` / `--verify-plan=false`) to override configuration at runtime.\n\n* **Tests**\n  * Added GitHub Actions E2E workflows for planfile artifacts and verification scenarios.\n  * Comprehensive unit and integration test coverage for verification modes and storage operations.\n\n* **Documentation**\n  * Updated planfile storage guides with drift verification behavior and GitHub Actions setup instructions.\n  * Blog post explaining plan-then-deploy workflow and configuration options.\n\n* **Chores**\n  * GitHub Actions runtime action now exposes credentials for planfile artifact storage.\n\n<!-- end of auto-generated comment: release notes by coderabbit.ai -->\n</details>\n\n<details>\n  <summary>feat: native container steps for workflows and custom commands @osterman (#2626)</summary>\n## what\n\n- Add a native `type: container` step (`build` / `push` / `run`) to the shared step library used by both workflows and custom commands, built on the existing `pkg/container` Docker/Podman runtime (new ephemeral one-shot runner plus image build/tag/push/inspect helpers; `ImageInspect` added to the `Runtime` interface, mocks regenerated).\n- Formalize **step outputs**: every named step exposes `value`/`values`/`metadata`/`outputs`/`skipped`/`error` (command-like steps add `stdout`/`stderr`/`exit_code`), so a build step can publish an image reference consumed by later push/run steps via `{{ .steps.<name>.outputs.<key> }}`.\n- Support per-step `identity` for registry auth and Docker Buildx + Buildx Bake builds; Podman uses the native `podman build` path.\n- Add the `examples/container-step` example and a hermetic GitHub Actions job (`[container-step]`) that exercises build → push → run against a `registry:2` service on `localhost:5000`, including failure-propagation.\n- Document the step type (`website/docs/workflows`), add a changelog blog post, and update the roadmap (container steps + step outputs marked shipped).\n- Land the design PRDs for the follow-on primitives — `container-components.md`, `compose-components.md`, and a rewritten membership-based `compositions.md` — and trim `container-actions-and-step-outputs.md` to cover only the procedural step. Remove the earlier `targets:`-based composition scaffolding (`pkg/composition`, `cmd/composition`, the composition step, and `schema.Composition*`) in favor of those PRDs.\n- Split the container-step handler into focused files and reduce complexity to satisfy the lint gate.\n\n## why\n\n- Atmos workflows and custom commands increasingly resemble CI pipelines; running containers natively (build images, push to registries, run tools) removes the need for one-off shell scripts and keeps the same automation usable locally and in CI.\n- A first-class step-outputs contract lets build → push → run/deploy pipelines pass structured values without shell parsing or temporary env files.\n- The procedural container **step** is the shippable foundation; the **component** kinds (container, compose) and **compositions** are specified as PRDs so the broader system can be designed and reviewed before implementation, without blocking this PR.\n\n## references\n\n- PRDs: `docs/prd/container-actions-and-step-outputs.md`, `docs/prd/container-components.md`, `docs/prd/compose-components.md`, `docs/prd/compositions.md`\n- Changelog: `website/blog/2026-06-17-native-container-steps.mdx`\n- Roadmap initiative: \"Container Composition & Local Development\" in `website/src/data/roadmap.js`\n\n\n<!-- This is an auto-generated comment: release notes by coderabbit.ai -->\n## Summary by CodeRabbit\n\n* **New Features**\n  * Added native `type: container` workflow step actions: `build`, `push`, `run`, and `inspect`, with image metadata and step exit/status details.\n  * Added workflow-level container sandbox support for shared execution context across shell steps.\n  * Added step `outputs` support with `{{ .steps.<name>.outputs.<key> }}` propagation for later steps.\n  * Improved Podman runtime auto-start/recovery and identity-based registry authentication in container flows.\n\n* **Bug Fixes**\n  * Improved environment-variable casing handling for nested `env:` declarations.\n\n* **Documentation**\n  * Added extensive docs and examples for container steps, workflow container config, and step outputs.\n\n* **Tests / CI**\n  * Expanded automated tests and added CI coverage for local container build→push→run flows.\n<!-- end of auto-generated comment: release notes by coderabbit.ai -->\n</details>\n\n\n## 🚀 Enhancements\n\n<details>\n  <summary>fix(secret): skip remote-state reads in credential-free secret list @sgtoj (#2657)</summary>\n## what\n\n- Make credential-free `atmos secret list` skip the YAML functions that perform authenticated backend reads (`!terraform.state`, `!terraform.output`, `!store`, `!store.get`) while it enumerates secret declarations.\n- Add a `credentialFreeSkip()` helper and use it in the two credential-free paths: `secret list -s <stack>` enumeration and the single-scope `secret list -s <stack> -c <component>` path without `--verify`.\n- Authenticated paths (`get` / `set` / `exec` / `shell`, and `secret list --verify`) are unchanged — they keep skipping only `!secret`.\n- Adds `TestCredentialFreeSkip` pinning the skip set and a `docs/fixes` write-up.\n\n## why\n\n- Secret listing is intentionally credential-free: it disables authentication so a large stack doesn't run one full auth cycle per component. But it still evaluated `!terraform.state` / `!terraform.output` / `!store` in component `vars` / `settings`. With auth disabled, the S3 backend assumes its configured role with no base credentials, the AWS SDK falls back to the default credential chain, and ultimately dials the EC2 IMDS endpoint — unreachable on a workstation — so the command aborts with a confusing assume-role/credentials error **even immediately after a successful `atmos auth login`**.\n- Listing only needs the static `secrets.vars` declarations (`secrets.ExtractDeclarations`), which never require a resolved value. Evaluating these functions was unnecessary and failure-prone. A skipped function leaves its raw string in place, which the declaration extractor ignores, so discovery is unchanged.\n- This is a regression: before credential-free enumeration was introduced, `secret list` authenticated per component, so these reads had credentials (slow, but working). Disabling auth removed the credentials without removing the reads.\n\n## references\n\n- Related to #2639 (originally reported against `atmos secret list`).\n- Follow-up to #2646, which made secret-list enumeration credential-free but left the credentialed function evaluation in place.\n- Write-up: `docs/fixes/2026-06-23-secret-list-credential-free-skip.md`\n- Verified with `go test ./cmd/secret/...` and the repo's `custom-gcl` lint (both green), and end-to-end against a multi-account repo whose components reference cross-account `!terraform.state`: `secret list -s <stack>` aborted before, completes after (no state reads, no credential-resolution fallbacks).\n\n\n<!-- This is an auto-generated comment: release notes by coderabbit.ai -->\n\n## Summary by CodeRabbit\n\n* **Bug Fixes**\n  * Fixed `atmos secret list` failing with credential errors after `atmos auth login` by preventing credential-free operations from attempting authenticated backend reads.\n\n<!-- end of auto-generated comment: release notes by coderabbit.ai -->\n</details>\n\n<details>\n  <summary>fix(auth): retry transient auth on freshly-brokered STS git clones @osterman (#2653)</summary>\n## what\n\n- Retry transient git authentication failures within a bounded window (default 30s, exponential backoff + jitter) **only** when Atmos brokered a fresh GitHub STS token this process — wired through a new `broker.HasBrokeredCredentials()` signal and a `CustomGitGetter.RetryAuthErrors` flag (existing per-source `retry:` config still takes precedence).\n- Keep auth failures terminal (fail fast) for non-brokered/static-credential clones, so a genuinely wrong or expired token is never masked by retries.\n- Surface previously-swallowed credential-broker failures at `Warn` (was `Debug`, invisible at the default `Warning` log level) and log an actionable `Error` when the brokered-auth retry window is exhausted.\n- Add tests: brokered retry succeeds, non-brokered fails fast, bounded-budget exhaustion, and a `-race` concurrency guard proving `EnsureCredentials` provisions exactly once with a happens-before barrier.\n\n## why\n\n- Under Atmos Pro cross-repo STS, `atmos vendor pull` intermittently failed with `fatal: Authentication failed` even though the same run logged a successful token mint and OIDC auth — a subset of clones failed and a rerun was clean.\n- Root cause is GitHub's brief post-creation 401 window: a just-minted installation token is not yet valid across all of GitHub's git frontends. The atmos-pro server already self-heals its own API calls on this 401 (Sentry `APP-CLOUDPOSSE-COM-AM2`), but the CLI git path did not — `isRetryableGitError` treated auth as terminal and vendor sources have no retry by default, so the earliest clones failed hard.\n- This gives the CLI the same tolerance the server has, scoped narrowly to brokered tokens so static credentials still fail fast, and removes the observability gap that made the failure hard to diagnose.\n\n## references\n\n- Token TTL is GitHub's standard ~60 min (confirmed in atmos-pro `mint.ts` / token-provider), ruling out mid-run expiry; the post-mint propagation window is the cause.\n- Follow-up (out of scope): `revoke_on_exit` cross-process token race on the shared, unlocked github/sts `state.json`.\n\n\n<!-- This is an auto-generated comment: release notes by coderabbit.ai -->\n## Summary by CodeRabbit\n\n* **New Features**\n  * Added automatic, bounded retries for transient Git authentication failures when using brokered GitHub App credentials, including a sensible default when no explicit retry window is configured.\n  * Introduced a `RetryAuthErrors` setting on the custom Git getter to enable this behavior.\n\n* **Improvements**\n  * Credential brokering now runs only for remote sources, and auth-retry logic activates only after brokered credentials are successfully exported.\n  * Enhanced warning logs when credential broker provisioning or environment export fails.\n\n* **Tests**\n  * Expanded coverage for brokered-credential detection, export-failure handling, and concurrent provisioning, plus brokered vs non-brokered retry behavior.\n\n* **Chores/CI**\n  * Pinned the `gofumpt` version in pre-commit.\n<!-- end of auto-generated comment: release notes by coderabbit.ai -->\n</details>\n\n<details>\n  <summary>perf(stacks): dedupe per-identity auth in nested terraform.state resolution @sgtoj (#2656)</summary>\n## what\n\n- Extends the per-component `AuthManager` memoization introduced in #2652 from the top-level `describe stacks` pass into the **nested** resolution path that runs while templates and YAML functions are evaluated (`!terraform.state`, `!terraform.output`, `atmos.Component(...)`).\n- Adds a process-scoped `nestedAuthManagerCache`, consulted by `resolveAuthManagerForNestedComponent`, keyed by the parent auth chain + a deterministic JSON fingerprint of the component's auth section.\n- Extracts the key logic into a shared `buildComponentAuthCacheKey` used by **both** the processor cache (#2652) and this nested path, so the two keying strategies cannot drift.\n- Caches only successful, non-nil resolutions; `ResetStateCache()` also clears the new cache (kept consistent with the `terraformStateCache` it pairs with). Neither is reset in production.\n\n## why\n\n- #2652 deduped per-component auth at the **top level**, but a component that references another component via `!terraform.state` still ran a **full auth cycle** (credential writes, file locks, keyring rebuilds) once per **distinct target** — even when every target resolves to the **same identity**. `terraformStateCache` only short-circuits a repeat read of the *same* target, not distinct targets that share an identity.\n- The result was the same N-auth blowup #2652 removed, just relocated into template/YAML resolution. Memoizing by identity removes it.\n\n**Measured** — `atmos describe stacks -s <stack>` on a large real-world stack (credentials provided via `auth exec`, 45s cap; only the binary under test varies):\n\n| build                          | wall time   | per-component auth cycles |\n| ------------------------------ | ----------- | ------------------------- |\n| latest release                 | DNF (>45s)  | —                         |\n| `main` (includes #2652)        | ~17–19s     | 44                        |\n| this PR (#2652 + nested dedup) | **~10–11s** | **5**                     |\n\nOutput was verified equivalent to `main`: the remaining run-to-run differences are pre-existing `auto_provision_workdir_for_outputs` / `tofu output` provisioning nondeterminism present on **both** builds (same identity resolved throughout, no new errors). A matched-output pair differed by fewer lines than the `main`-vs-`main` noise floor.\n\nThe nested path is shared by `describe affected`, `list`, and `terraform --all/--query`. On a large multi-component change, the full per-identity auth cycles during `describe affected` likewise drop from scaling with the number of resolved components to roughly one-per-identity, with the rest served from the cache.\n\n## test plan\n\n- `go build ./... && go test ./internal/exec/...` — new unit tests cover key behavior, dedupe-by-identity, parent-chain isolation, errors-not-cached, unserializable-section-not-cached, and the `ResetStateCache` coupling.\n- `custom-gcl run --new-from-rev=main` → 0 issues.\n- Real-repo benchmark above.\n\n## references\n\n- Related to #2639\n- Builds on #2652\n- Design notes: `docs/fixes/2026-06-22-dedupe-nested-component-auth.md`\n\n\n<!-- This is an auto-generated comment: release notes by coderabbit.ai -->\n## Summary by CodeRabbit\n\n* **Bug Fixes**\n  * Fixed per-identity authentication deduplication for nested Terraform state/output references, reducing redundant authentication manager creation.\n  * Improved caching behavior so successful results are reused, failures aren’t memoized, and cache reset clears nested authentication state alongside the Terraform state cache.\n* **Documentation**\n  * Added a documentation note explaining the nested authentication caching behavior and reset semantics.\n* **Tests**\n  * Added unit tests covering deterministic cache-key generation, deduplication/differentiation by identity, non-caching of errors, handling of non-fingerprintable auth sections, and cache invalidation on reset.\n<!-- end of auto-generated comment: release notes by coderabbit.ai -->\n</details>\n\n<details>\n  <summary>fix(describe): respect metadata.enabled when evaluating component functions @sgtoj (#2655)</summary>\n## what\n\n- Respect `metadata.enabled` when the shared describe pipeline (`describe affected`, `describe stacks`, `list`) evaluates a component's functions:\n  - **`!terraform.state` / `!terraform.output`** are skipped for components disabled via `metadata.enabled: false` — the raw function string is left unresolved (no backend read).\n  - **`atmos.Component(...)`** returns empty sections (including an empty `outputs`) when the *enclosing* component is disabled — no describe, no state read, and template-safe (`.outputs.x` / `.vars.x` evaluate to nil instead of erroring).\n- The gate keys strictly on `metadata.enabled` (via the existing `isComponentEnabled`), **independent of `vars.enabled`**.\n\n## why\n\n- `describe affected` describes the current and base stacks and evaluates every component's templates/YAML functions with no `metadata.enabled` gate. A component disabled with `metadata.enabled: false` that references an unprovisioned component's state therefore failed hard with `terraform state not provisioned` — even though disabled components are (correctly) excluded from the final affected list. The enabled-aware filters (`shouldSkipComponent`, `FilterAbstractComponents`) only run when assembling that list, after the describe phase has already failed.\n\nFixes #2654.\n\n## references\n\n- Fixes #2654\n- Design notes: `docs/fixes/2026-06-22-describe-respect-metadata-enabled.md`\n\n## test plan\n\n- Unit tests: `disabledComponentTerraformSkip` (adds the terraform funcs, clones the base skip), `enclosingComponentDisabled` (nil/absent metadata ⇒ enabled; `vars.enabled:false` alone ⇒ enabled; `metadata.enabled:false` ⇒ disabled), `componentFunc` returns empty sections for a disabled enclosing component, and an end-to-end `processComponentEntry` test (disabled ⇒ `!terraform.state` not resolved; enabled / `vars.enabled:false`-only ⇒ resolved).\n- `go build ./...`, `go vet ./internal/exec/...`, and `custom-gcl run --new-from-rev=main` (0 issues).\n\n> Note: the `TestDescribeAffected*` integration tests are environment-sensitive and fail identically on a clean `main` checkout locally (macOS); they are unrelated to this change. CI (Linux) is authoritative.\n\n\n<!-- This is an auto-generated comment: release notes by coderabbit.ai -->\n## Summary by CodeRabbit\n\n* **Bug Fixes**\n  * `atmos describe affected` and related stack inspection commands now correctly honor `metadata.enabled: false`, avoiding Terraform state/output inspection and template evaluation for disabled components.\n* **Documentation**\n  * Added a documentation entry describing the metadata handling fix and the scenarios it resolves.\n* **Tests**\n  * Added end-to-end and unit-style coverage to ensure disabled/enabled behavior works consistently for YAML-function and `atmos.Component(...)` template handling.\n<!-- end of auto-generated comment: release notes by coderabbit.ai -->\n</details>\n","mentions_count":2},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/343233861","assets_url":"https://api.github.com/repos/cloudposse/atmos/releases/343233861/assets","upload_url":"https://uploads.github.com/repos/cloudposse/atmos/releases/343233861/assets{?name,label}","html_url":"https://github.com/cloudposse/atmos/releases/tag/v1.222.0-rc.7","id":343233861,"author":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"node_id":"RE_kwDOEW4XoM4UdVVF","tag_name":"v1.222.0-rc.7","target_commitish":"main","name":"v1.222.0-rc.7","draft":false,"immutable":false,"prerelease":true,"created_at":"2026-06-22T20:22:00Z","updated_at":"2026-06-23T01:22:25Z","published_at":"2026-06-23T01:22:25Z","assets":[{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/455149656","id":455149656,"node_id":"RA_kwDOEW4XoM4bIQhY","name":"atmos_1.222.0-rc.7_darwin_amd64","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":239000192,"digest":"sha256:4cc4fd9bf69c6a6303135a4198971a0817060c6537c2bb9efaa216e84a4a5113","download_count":0,"created_at":"2026-06-23T01:21:21Z","updated_at":"2026-06-23T01:21:30Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0-rc.7/atmos_1.222.0-rc.7_darwin_amd64"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/455149662","id":455149662,"node_id":"RA_kwDOEW4XoM4bIQhe","name":"atmos_1.222.0-rc.7_darwin_arm64","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":224494850,"digest":"sha256:e1a08b88c868966dbbab1d0426cadd51618f81b402a7edb298923245658e9a8f","download_count":1,"created_at":"2026-06-23T01:21:22Z","updated_at":"2026-06-23T01:21:29Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0-rc.7/atmos_1.222.0-rc.7_darwin_arm64"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/455149601","id":455149601,"node_id":"RA_kwDOEW4XoM4bIQgh","name":"atmos_1.222.0-rc.7_freebsd_amd64","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":232902828,"digest":"sha256:df5f89a0d8377910c407ddc42665021d17684050fc6a879ddc7e169a710e6de6","download_count":0,"created_at":"2026-06-23T01:21:15Z","updated_at":"2026-06-23T01:21:22Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0-rc.7/atmos_1.222.0-rc.7_freebsd_amd64"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/455149602","id":455149602,"node_id":"RA_kwDOEW4XoM4bIQgi","name":"atmos_1.222.0-rc.7_freebsd_arm64","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":216727724,"digest":"sha256:e21d5fd3cb8f89a6013eda0581f4b4ee38a2c2c3dd00d25ce49d0ee52a46f9e9","download_count":0,"created_at":"2026-06-23T01:21:15Z","updated_at":"2026-06-23T01:21:21Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0-rc.7/atmos_1.222.0-rc.7_freebsd_arm64"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/455149531","id":455149531,"node_id":"RA_kwDOEW4XoM4bIQfb","name":"atmos_1.222.0-rc.7_linux_386","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":217424034,"digest":"sha256:d67a5e5836345e542360314b74291f943f1a85b6ea7ee58baf5315538eba9aae","download_count":0,"created_at":"2026-06-23T01:21:06Z","updated_at":"2026-06-23T01:21:14Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0-rc.7/atmos_1.222.0-rc.7_linux_386"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/455149533","id":455149533,"node_id":"RA_kwDOEW4XoM4bIQfd","name":"atmos_1.222.0-rc.7_linux_amd64","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":233742498,"digest":"sha256:095d636bdb9d8065e4634374fec452372caaa73eb47ea8ce9bcdb2e0d6616e04","download_count":5,"created_at":"2026-06-23T01:21:06Z","updated_at":"2026-06-23T01:21:16Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0-rc.7/atmos_1.222.0-rc.7_linux_amd64"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/455149591","id":455149591,"node_id":"RA_kwDOEW4XoM4bIQgX","name":"atmos_1.222.0-rc.7_linux_arm","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":217579682,"digest":"sha256:18152137dd4d4c959ea069962f0c66649dbc08634071db4f00da13b0ba36b5a1","download_count":0,"created_at":"2026-06-23T01:21:14Z","updated_at":"2026-06-23T01:21:22Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0-rc.7/atmos_1.222.0-rc.7_linux_arm"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/455149532","id":455149532,"node_id":"RA_kwDOEW4XoM4bIQfc","name":"atmos_1.222.0-rc.7_linux_arm64","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":217514146,"digest":"sha256:dd188e20684ba62570d9ea3f29b256d2ab14f97dcff8f1c96874e083afbcb69f","download_count":0,"created_at":"2026-06-23T01:21:06Z","updated_at":"2026-06-23T01:21:14Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0-rc.7/atmos_1.222.0-rc.7_linux_arm64"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/455149668","id":455149668,"node_id":"RA_kwDOEW4XoM4bIQhk","name":"atmos_1.222.0-rc.7_SHA256SUMS","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":1085,"digest":"sha256:a242f5998afe31caee2eef923fc665122f2a74af2c88f537e527b6fcbc24b07e","download_count":1,"created_at":"2026-06-23T01:21:23Z","updated_at":"2026-06-23T01:21:23Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0-rc.7/atmos_1.222.0-rc.7_SHA256SUMS"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/455149665","id":455149665,"node_id":"RA_kwDOEW4XoM4bIQhh","name":"atmos_1.222.0-rc.7_windows_386.exe","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/x-ms-dos-executable","state":"uploaded","size":222008832,"digest":"sha256:ccb61615cffebf27c651e3325c8a1bd9a5a701457df295044485e729978ede64","download_count":0,"created_at":"2026-06-23T01:21:22Z","updated_at":"2026-06-23T01:21:30Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0-rc.7/atmos_1.222.0-rc.7_windows_386.exe"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/455149622","id":455149622,"node_id":"RA_kwDOEW4XoM4bIQg2","name":"atmos_1.222.0-rc.7_windows_amd64.exe","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/x-ms-dos-executable","state":"uploaded","size":237651968,"digest":"sha256:b21a38a5c335afdcbcc99f87a6710b2dc9cebfdbb8c364ddb2989a6265e37567","download_count":1,"created_at":"2026-06-23T01:21:16Z","updated_at":"2026-06-23T01:21:23Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0-rc.7/atmos_1.222.0-rc.7_windows_amd64.exe"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/455149530","id":455149530,"node_id":"RA_kwDOEW4XoM4bIQfa","name":"atmos_1.222.0-rc.7_windows_arm64.exe","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/x-ms-dos-executable","state":"uploaded","size":219019264,"digest":"sha256:9a2b5aff522f6f148787071ad88e3622924c06e8e10547fe974e02ea94e79eea","download_count":0,"created_at":"2026-06-23T01:21:06Z","updated_at":"2026-06-23T01:21:14Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0-rc.7/atmos_1.222.0-rc.7_windows_arm64.exe"}],"tarball_url":"https://api.github.com/repos/cloudposse/atmos/tarball/v1.222.0-rc.7","zipball_url":"https://api.github.com/repos/cloudposse/atmos/zipball/v1.222.0-rc.7","body":"## 🚀 Enhancements\n\n<details>\n  <summary>fix(stacks): scope and cache per-component auth in describe stacks @sgtoj (#2652)</summary>\n## what\n\n- Move the stack and component filters above `resolveComponentAuthManager` in `processComponentEntry` so only in-scope components authenticate (auth still precedes `BuildTerraformWorkspace`, template, and YAML-function processing).\n- Add a pass-scoped auth cache keyed by the parent chain + a deterministic JSON fingerprint of the component auth section, so components that share an auth section reuse one authenticated manager.\n- Regression tests: out-of-scope skip + cache reuse.\n\n## why\n\nAny auth-enabled `ExecuteDescribeStacks` caller — `atmos describe stacks`, `atmos list values`/`instances`, `atmos terraform --all`/`--query` — resolves per-component auth **before** the stack/component filters and never reuses it. On a multi-stack repo where components declare their own `default: true` identity, `atmos describe stacks -s <stack>` authenticates components in **other** stacks before discarding them, and re-authenticates each same-identity component from scratch — so the command effectively hangs.\n\nPer-component auth exists only to populate `info.AuthContext` for that component's later template (`atmos.Component(...)`) and YAML-function (`!terraform.state`, `!terraform.output`) processing, which is skipped for filtered-out components — so authenticating them is wasted work.\n\n#2646 fixed `atmos secret list` by disabling per-component auth for that command; it did not touch the shared processor, so every other caller still hits this.\n\n**Measured** with the identical command `atmos describe stacks -s <stack> --logs-level Debug` under a 45s budget, only the atmos binary varying:\n\n| binary                       | result                                                                  |\n| ---------------------------- | ----------------------------------------------------------------------- |\n| latest release (v1.221.1)    | did not complete within 45s (authenticating mostly out-of-scope stacks) |\n| current `main` (`aa68d85be`) | did not complete within 45s                                             |\n| this PR                      | completed in ~18s                                                       |\n\nWith the fix, in-scope processor-path authentications drop to **2** and out-of-scope ones to **zero** (the ~42 remaining auths are legitimate nested `!terraform.output` / `atmos.Component` reads).\n\n## references\n\n- Related to #2639; supersedes #2642 and #2644.\n- Fix write-up: `docs/fixes/2026-06-22-describe-stacks-scope-and-cache-per-component-auth.md`\n\n\n<!-- This is an auto-generated comment: release notes by coderabbit.ai -->\n\n## Summary by CodeRabbit\n\n## Release Notes\n\n* **Bug Fixes**\n  * Fixed unnecessary authentication of out-of-scope components in `describe stacks` operations with stack/component filters\n  * Added caching to eliminate redundant authentication cycles for components with identical auth configurations\n\n* **Documentation**\n  * Added documentation explaining describe-stacks authentication scoping and caching behavior\n\n<!-- end of auto-generated comment: release notes by coderabbit.ai -->\n</details>\n","mentions_count":1},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/342639659","assets_url":"https://api.github.com/repos/cloudposse/atmos/releases/342639659/assets","upload_url":"https://uploads.github.com/repos/cloudposse/atmos/releases/342639659/assets{?name,label}","html_url":"https://github.com/cloudposse/atmos/releases/tag/v1.222.0-rc.6","id":342639659,"author":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"node_id":"RE_kwDOEW4XoM4UbEQr","tag_name":"v1.222.0-rc.6","target_commitish":"main","name":"v1.222.0-rc.6","draft":false,"immutable":false,"prerelease":true,"created_at":"2026-06-21T21:38:14Z","updated_at":"2026-06-22T01:39:53Z","published_at":"2026-06-22T01:39:53Z","assets":[{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/454109327","id":454109327,"node_id":"RA_kwDOEW4XoM4bESiP","name":"atmos_1.222.0-rc.6_darwin_amd64","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":239000048,"digest":"sha256:4f942c5a39f7e4160911fbbe5a26022a1863ff3b3d1c3bd2b6b55c766de69b32","download_count":0,"created_at":"2026-06-22T01:38:45Z","updated_at":"2026-06-22T01:38:56Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0-rc.6/atmos_1.222.0-rc.6_darwin_amd64"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/454109325","id":454109325,"node_id":"RA_kwDOEW4XoM4bESiN","name":"atmos_1.222.0-rc.6_darwin_arm64","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":224494706,"digest":"sha256:7052b3c7a9a735ddbd74182e656dc7c0c6e2af3f81737153a2c2b352b1c177b9","download_count":0,"created_at":"2026-06-22T01:38:45Z","updated_at":"2026-06-22T01:38:55Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0-rc.6/atmos_1.222.0-rc.6_darwin_arm64"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/454109508","id":454109508,"node_id":"RA_kwDOEW4XoM4bESlE","name":"atmos_1.222.0-rc.6_freebsd_amd64","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":232902828,"digest":"sha256:8dc62b3f638cf8bb59af942b3ec8cef138917d5518312462ca7e7a060097fc90","download_count":0,"created_at":"2026-06-22T01:38:56Z","updated_at":"2026-06-22T01:39:03Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0-rc.6/atmos_1.222.0-rc.6_freebsd_amd64"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/454109328","id":454109328,"node_id":"RA_kwDOEW4XoM4bESiQ","name":"atmos_1.222.0-rc.6_freebsd_arm64","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":216727724,"digest":"sha256:a1d411c6ae59b044f1f08080511228636283baca85f66c6d9d4776b34f8e4d01","download_count":0,"created_at":"2026-06-22T01:38:45Z","updated_at":"2026-06-22T01:38:57Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0-rc.6/atmos_1.222.0-rc.6_freebsd_arm64"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/454109331","id":454109331,"node_id":"RA_kwDOEW4XoM4bESiT","name":"atmos_1.222.0-rc.6_linux_386","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":217419938,"digest":"sha256:c18eb87103ac626ebff04fc49c599b9ba3085300b2376e077ac4a860b5bd87a8","download_count":1,"created_at":"2026-06-22T01:38:45Z","updated_at":"2026-06-22T01:38:55Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0-rc.6/atmos_1.222.0-rc.6_linux_386"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/454109329","id":454109329,"node_id":"RA_kwDOEW4XoM4bESiR","name":"atmos_1.222.0-rc.6_linux_amd64","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":233742498,"digest":"sha256:9b7db09f712edbfa697f8866e20b693d465e4c361e57d72e9f4ac71a2d3bba17","download_count":7,"created_at":"2026-06-22T01:38:45Z","updated_at":"2026-06-22T01:38:56Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0-rc.6/atmos_1.222.0-rc.6_linux_amd64"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/454109506","id":454109506,"node_id":"RA_kwDOEW4XoM4bESlC","name":"atmos_1.222.0-rc.6_linux_arm","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":217579682,"digest":"sha256:3a725dca037fcd915a1a5cb7c52bd7b971da6320f09b48ae6c92a518eea63b0c","download_count":1,"created_at":"2026-06-22T01:38:56Z","updated_at":"2026-06-22T01:39:03Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0-rc.6/atmos_1.222.0-rc.6_linux_arm"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/454109332","id":454109332,"node_id":"RA_kwDOEW4XoM4bESiU","name":"atmos_1.222.0-rc.6_linux_arm64","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":217514146,"digest":"sha256:d88988945f9337ea4cc7a1f0220de90633cc76372733b9e2ffcfe2509ced861a","download_count":0,"created_at":"2026-06-22T01:38:45Z","updated_at":"2026-06-22T01:38:56Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0-rc.6/atmos_1.222.0-rc.6_linux_arm64"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/454109512","id":454109512,"node_id":"RA_kwDOEW4XoM4bESlI","name":"atmos_1.222.0-rc.6_SHA256SUMS","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":1085,"digest":"sha256:83bed84ebe4506b1988ab0d7f01ea239a8820401d65896e4011d00129c46ec0b","download_count":0,"created_at":"2026-06-22T01:38:57Z","updated_at":"2026-06-22T01:38:57Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0-rc.6/atmos_1.222.0-rc.6_SHA256SUMS"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/454109463","id":454109463,"node_id":"RA_kwDOEW4XoM4bESkX","name":"atmos_1.222.0-rc.6_windows_386.exe","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/x-ms-dos-executable","state":"uploaded","size":222007296,"digest":"sha256:e087fbef811523c1fe09ef4045792661bf0593bf70a5754e7a2541ddc9b27809","download_count":0,"created_at":"2026-06-22T01:38:55Z","updated_at":"2026-06-22T01:39:04Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0-rc.6/atmos_1.222.0-rc.6_windows_386.exe"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/454109326","id":454109326,"node_id":"RA_kwDOEW4XoM4bESiO","name":"atmos_1.222.0-rc.6_windows_amd64.exe","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/x-ms-dos-executable","state":"uploaded","size":237648896,"digest":"sha256:e869a189a7663ea23ccef825da83587d019cc79874a4d044888768e3c393822a","download_count":0,"created_at":"2026-06-22T01:38:45Z","updated_at":"2026-06-22T01:38:57Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0-rc.6/atmos_1.222.0-rc.6_windows_amd64.exe"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/454109330","id":454109330,"node_id":"RA_kwDOEW4XoM4bESiS","name":"atmos_1.222.0-rc.6_windows_arm64.exe","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/x-ms-dos-executable","state":"uploaded","size":219017728,"digest":"sha256:1e57e31459e67a8001d25ef19730117412c2a8551942151624e351e51f289fa6","download_count":0,"created_at":"2026-06-22T01:38:45Z","updated_at":"2026-06-22T01:38:57Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0-rc.6/atmos_1.222.0-rc.6_windows_arm64.exe"}],"tarball_url":"https://api.github.com/repos/cloudposse/atmos/tarball/v1.222.0-rc.6","zipball_url":"https://api.github.com/repos/cloudposse/atmos/zipball/v1.222.0-rc.6","body":"<details>\n  <summary>docs: add Custom to the Component Library @osterman (#2638)</summary>\n## what\n\n- Add a **Custom** entry to the Component Library so command-backed custom component types are discoverable alongside Terraform/OpenTofu, Helmfile, Packer, and Ansible.\n- New page `website/docs/components/custom.mdx` explaining custom component types (with a minimal Script Runner example and a native-vs-custom comparison), linking to the existing reference and changelog rather than duplicating them.\n- Wire the new page into the Component Library sidebar (`website/sidebars.js`) after Ansible.\n- Surface custom types in the Component Library overview (`components-overview.mdx`) — a pointer under the Component Types table and a Next Steps bullet.\n\n## why\n\n- Custom component types already shipped and are fully documented under `cli/configuration/commands#custom-component-types`, but a user browsing the Component Library never saw them as a first-class option — the nav didn't match the actual capability.\n- This is a docs-only change (`no-release`): no behavior changes, and the feature already has its own changelog post.\n\n## references\n\n- Reference: `/cli/configuration/commands#custom-component-types`\n- Changelog: `/changelog/custom-component-types`\n\n\n<!-- This is an auto-generated comment: release notes by coderabbit.ai -->\n## Summary by CodeRabbit\n\n* **Documentation**\n  * Added a new guide for **Custom Component Types**, explaining how to define custom component types via custom commands and how stack manifests resolve `components.<type>.<name>` for use in templates.\n  * Documented how merged `vars`, `settings`, and `env` are made available to templates.\n  * Expanded the components overview to point to **Custom Component Types** as an additional learning path.\n  * Updated navigation and the file-browser doc links to include the new page and its reference.\n  * Refreshed CLI command docs to reflect the updated built-in component types list.\n<!-- end of auto-generated comment: release notes by coderabbit.ai -->\n</details>\n\n<details>\n  <summary>feat: support description in component metadata @osterman (#2634)</summary>\n## what\n\n- Add an optional `description` field to component `metadata`.\n- Update the embedded, test-fixture, and published website JSON schemas to allow `metadata.description`.\n- Document the field in the component metadata reference and quick-start guides, and demo it in the quick-start example.\n- Add a schema validation test (`pkg/datafetcher/schema_metadata_validation_test.go`) verifying both the embedded and website schemas accept `metadata.description`.\n- Add a changelog blog post and a shipped roadmap milestone.\n\n## why\n\n- Lets users document the purpose of a component inline, right next to its configuration — especially useful when many components share the same Terraform root module with different configs.\n- The field is purely informational: it does not change how a component is processed, planned, or applied, so the change is safe and additive (component `metadata` is already a free-form map at runtime, so no Go changes were required).\n- Schema support gives editors auto-completion and validation for the new field.\n\n## references\n\n- Component metadata docs: [/stacks/components/component-metadata](https://atmos.tools/stacks/components/component-metadata)\n\n\n<!-- This is an auto-generated comment: release notes by coderabbit.ai -->\n## Summary by CodeRabbit\n\n## Release Notes\n\n* **New Features**\n  * Added an optional `metadata.description` field for components, allowing human-readable descriptions to appear in listings and editor validation.\n\n* **Documentation**\n  * Updated quick-start and component metadata docs, plus examples, to show how to set `metadata.description`.\n  * Added a blog post explaining the field and where it belongs in stack YAML.\n\n* **Tests**\n  * Added schema validation test coverage to confirm `metadata.description` is accepted and validated.\n\n* **Chores / CI**\n  * Improved YAML schema validation in the test workflow by using the in-repo schema and adjusting schema modelines for examples.\n<!-- end of auto-generated comment: release notes by coderabbit.ai -->\n</details>\n\n\n## 🚀 Enhancements\n\n<details>\n  <summary>fix(secrets): fast, credential-free atmos secret list @osterman (#2646)</summary>\n## what\n\n- Make `atmos secret list` require **no authenticated identity** and **never decrypt** — it only reports whether each secret is *set*. On a 72-component stack, listing drops from ~21–34s (it previously authenticated every component and decrypted every secret) to effectively instant.\n- Disable per-component authentication during secret-list stack enumeration.\n- Resolve SOPS initialization status from the file's cleartext key names — no age key, no decryption.\n- Rewrite **every** store's existence check (`Has`) to a non-decrypting metadata API: SSM `GetParameter` with `WithDecryption=false`, Secrets Manager `DescribeSecret`, GCP `GetSecretVersion`, Azure Key Vault properties pager, Vault KV metadata read, and a no-reveal 1Password check.\n- Add a tri-state `STATUS` (`initialized` / `missing` / `unknown`) plus a new `--verify` flag: remote-store status shows `unknown` by default; `--verify` contacts backends with a read/describe identity (never a decrypt identity) on a fully-scoped target.\n\n## why\n\n- Listing is introspection — it shows which secrets are declared and whether they exist, and never needs a plaintext value, so it should not force authentication or decryption (or require `kms:Decrypt`-style permissions).\n- The old path authenticated per component and fetched+decrypted every secret just to populate the status column, making `secret list` slow (and prone to hanging) on real-world stacks and unusable without cloud credentials.\n- Existence on a remote store still needs a read credential, so those rows now default to `unknown` (credential-free) and opt into a real check via `--verify`, while local backends (SOPS) always show accurate status for free.\n\n## references\n\n- Supersedes the per-component auth-cache approach in #2644 (its `atmos secret list` workload is fully addressed here); follows #2642.\n- Docs: `website/docs/cli/commands/secret/list.mdx`; changelog: `fast-credential-free-secret-list`.\n\n\n<!-- This is an auto-generated comment: release notes by coderabbit.ai -->\n## Summary by CodeRabbit\n\n## Release Notes\n\n* **New Features**\n  * Added `--verify` to `atmos secret list` for authoritative remote initialization checks; remote-backed secrets now show real status when enabled.\n\n* **Bug Fixes**\n  * Improved secret listing to be credential-free by default (no value retrieval/decryption). Remote-backed secrets display `unknown` unless verified.\n  * Standardized “initialized/missing/unknown/error” status behavior and `unknown` label rendering.\n\n* **Documentation**\n  * Updated `atmos secret list` docs and added a blog post covering the fast credential-free flow.\n\n* **Tests**\n  * Added coverage for `--verify`, `unknown` status, and credential-free/metadata-only existence checks.\n<!-- end of auto-generated comment: release notes by coderabbit.ai -->\n</details>\n\n<details>\n  <summary>fix(secrets): SOPS cloud-KMS secrets authenticate via Atmos identity @osterman (#2643)</summary>\n## what\n\n- `atmos secret` and `!secret` (during `terraform plan`) against a SOPS cloud-KMS backend now authenticate using the Atmos identity — `--identity` / `ATMOS_IDENTITY`, the per-provider `secrets.providers.<name>.identity`, or the stack/component effective identity — instead of requiring ambient cloud credentials.\n- The cloud is inferred from the SOPS file's master-key type at runtime (AWS KMS / GCP KMS / Azure Key Vault); there is no per-cloud `kind`. Credentials are injected into the in-process getsops encrypt/decrypt via `ApplyToMasterKey` (no process-environment mutation).\n- Refactors SOPS into its own package `pkg/secrets/providers/sops/` with a registry of per-cloud key handlers (`aws.go` / `gcp.go` / `azure.go`); the cloud-SDK credential building lives in the depguard-exempt `pkg/store/sopsauth/` bridge so the SOPS package imports no cloud SDK directly.\n- Threads the auth resolver + effective identity to the provider via a transient `AtmosConfiguration.SecretsAuth` seam, populated in both the `atmos secret` and terraform code paths.\n- Fixes the SOPS decrypt error to emit identity/permission hints for cloud-KMS files (derived from the file's actual key types) instead of the misleading age-key hint.\n\n## why\n\n- Resolves #2637: the documented `secrets.providers.<name>.identity` field and `--identity` were silently ignored for the SOPS cloud-KMS track, forcing every command to be wrapped in `atmos auth exec` even though Track-1 stores (SSM/ASM/Key Vault/Secret Manager) already authenticated via the identity.\n- The fix is additive and backward compatible: with no resolvable identity, the SOPS provider falls back to the ambient credential chain exactly as before. `kind` remains only for the legitimate age-vs-KMS keygen distinction.\n- Covered by a Floci KMS end-to-end test (ambient AWS creds cleared, identity-only `secret set`/`get` — the exact #2637 scenario, RED before this change) plus unit tests for key-service selection, per-cloud registry dispatch, identity precedence, and kind-aware error hints.\n\n## references\n\n- Closes #2637\n- `docs/fixes/2026-06-20-sops-cloud-kms-identity.md` (root cause, fix, and full backend audit)\n\n\n<!-- This is an auto-generated comment: release notes by coderabbit.ai -->\n## Summary by CodeRabbit\n\n* **New Features**\n  * Added identity-aware SOPS secret backends for AWS KMS, GCP KMS, and Azure Key Vault.\n  * Added backend-agnostic key generation support for secret providers.\n* **Bug Fixes**\n  * Fixed cloud KMS SOPS authentication so `atmos secret` and Terraform execution (including `!secret` during `terraform plan`) use the Atmos effective identity instead of ambient credentials.\n  * Improved SOPS key-service routing and decrypt/encrypt error hints for cloud KMS vs age.\n* **Documentation**\n  * Documented cloud KMS identity precedence and updated SOPS secrets configuration guidance.\n* **Tests**\n  * Added/updated identity-selection and SOPS KMS unit tests, plus a Floci KMS end-to-end test.\n<!-- end of auto-generated comment: release notes by coderabbit.ai -->\n</details>\n\n<details>\n  <summary>Add Atmos media kit and CI branding @osterman (#2636)</summary>\n## what\n\n- Add an Atmos media kit page, blog announcement, brandkit redirect, and generated ZIP download workflow.\n- Add logo, wordmark, animated gradient, Atmos CI, and Atmos AI SVG variants for light and dark surfaces.\n- Update native Terraform CI summaries and fixtures to use the Atmos CI lockup linking to https://atmos.tools/ci.\n\n## why\n\n- Provide a canonical source for Atmos brand assets and usage guidance.\n- Align CI summary branding with Atmos instead of the Cloud Posse logo.\n- Keep animated treatment assets downloadable and consistent across docs, media kit, and CI output.\n\n## references\n\n- Validation: `go test ./pkg/ci/plugins/terraform`\n- Validation: `pnpm exec docusaurus build`\n\n\n<!-- This is an auto-generated comment: release notes by coderabbit.ai -->\n## Summary by CodeRabbit\n\n* **New Features**\n  * Added an Atmos Media Kit page with a downloadable ZIP, logo previews, brand color palettes, and usage guidance.\n* **Documentation**\n  * Announced the Atmos Media Kit and added a Media Kit link to the website sidebar, plus a `/brandkit` redirect to `/media-kit`.\n* **Chores**\n  * Updated website build/dev flow and media-kit generation, increased Node memory for local runs, refreshed site footer/nav layout, and improved Pro logo sizing.\n  * Updated CI plan/apply and GitHub step summaries to use Atmos CI gradient branding.\n* **Tests**\n  * Updated template and golden-file expectations to match the new Atmos CI branding.\n<!-- end of auto-generated comment: release notes by coderabbit.ai -->\n</details>\n","mentions_count":1},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/342219374","assets_url":"https://api.github.com/repos/cloudposse/atmos/releases/342219374/assets","upload_url":"https://uploads.github.com/repos/cloudposse/atmos/releases/342219374/assets{?name,label}","html_url":"https://github.com/cloudposse/atmos/releases/tag/v1.222.0-rc.5","id":342219374,"author":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"node_id":"RE_kwDOEW4XoM4UZdpu","tag_name":"v1.222.0-rc.5","target_commitish":"main","name":"v1.222.0-rc.5","draft":false,"immutable":false,"prerelease":true,"created_at":"2026-06-19T17:39:00Z","updated_at":"2026-06-20T01:26:00Z","published_at":"2026-06-20T01:26:00Z","assets":[{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/452636339","id":452636339,"node_id":"RA_kwDOEW4XoM4a-q6z","name":"atmos_1.222.0-rc.5_darwin_amd64","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":238932752,"digest":"sha256:decb8d5abca69bc0ae7fe483fbd18d9a6e7f481909c3f84be11a3e45b66ab86b","download_count":2,"created_at":"2026-06-20T01:24:55Z","updated_at":"2026-06-20T01:25:03Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0-rc.5/atmos_1.222.0-rc.5_darwin_amd64"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/452636393","id":452636393,"node_id":"RA_kwDOEW4XoM4a-q7p","name":"atmos_1.222.0-rc.5_darwin_arm64","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":224410354,"digest":"sha256:4fc34d684ae17ecdbc9234c995ecc2849b65796b375ee8f0e619867834e77154","download_count":3,"created_at":"2026-06-20T01:25:02Z","updated_at":"2026-06-20T01:25:08Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0-rc.5/atmos_1.222.0-rc.5_darwin_arm64"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/452636480","id":452636480,"node_id":"RA_kwDOEW4XoM4a-q9A","name":"atmos_1.222.0-rc.5_freebsd_amd64","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":232833196,"digest":"sha256:8fb5ee2584ffe05f1db4f0fe14ac7abae6510fa93deff7a8eecfea386e8c9de6","download_count":0,"created_at":"2026-06-20T01:25:11Z","updated_at":"2026-06-20T01:25:16Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0-rc.5/atmos_1.222.0-rc.5_freebsd_amd64"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/452636420","id":452636420,"node_id":"RA_kwDOEW4XoM4a-q8E","name":"atmos_1.222.0-rc.5_freebsd_arm64","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":216662188,"digest":"sha256:fbe6f9a6a481bd7d000a3fcf7d81b0e3ccd067f4462fd5f5a73242ef35942d94","download_count":2,"created_at":"2026-06-20T01:25:03Z","updated_at":"2026-06-20T01:25:10Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0-rc.5/atmos_1.222.0-rc.5_freebsd_arm64"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/452636470","id":452636470,"node_id":"RA_kwDOEW4XoM4a-q82","name":"atmos_1.222.0-rc.5_linux_386","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":217362594,"digest":"sha256:71d2f39601f5630aad0aae5c46a6ee99c3f7316159cd7771786b59182c56af9d","download_count":0,"created_at":"2026-06-20T01:25:09Z","updated_at":"2026-06-20T01:25:15Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0-rc.5/atmos_1.222.0-rc.5_linux_386"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/452636429","id":452636429,"node_id":"RA_kwDOEW4XoM4a-q8N","name":"atmos_1.222.0-rc.5_linux_amd64","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":233676962,"digest":"sha256:e09875800dd2238a1b7cf9f2985bdd524dea280ca3712d6f9190132d92e26961","download_count":6,"created_at":"2026-06-20T01:25:04Z","updated_at":"2026-06-20T01:25:11Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0-rc.5/atmos_1.222.0-rc.5_linux_amd64"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/452636342","id":452636342,"node_id":"RA_kwDOEW4XoM4a-q62","name":"atmos_1.222.0-rc.5_linux_arm","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":217579682,"digest":"sha256:9a539a3edd20af460b35b9d850888cf7a2027cbc406c8e7ebea96bf0084cce18","download_count":0,"created_at":"2026-06-20T01:24:55Z","updated_at":"2026-06-20T01:25:03Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0-rc.5/atmos_1.222.0-rc.5_linux_arm"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/452636341","id":452636341,"node_id":"RA_kwDOEW4XoM4a-q61","name":"atmos_1.222.0-rc.5_linux_arm64","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":217448610,"digest":"sha256:e961e4f12cd571725a7a4b510e517a6274a7e074efff25f0c7e813393cb56beb","download_count":0,"created_at":"2026-06-20T01:24:55Z","updated_at":"2026-06-20T01:25:04Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0-rc.5/atmos_1.222.0-rc.5_linux_arm64"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/452636490","id":452636490,"node_id":"RA_kwDOEW4XoM4a-q9K","name":"atmos_1.222.0-rc.5_SHA256SUMS","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":1085,"digest":"sha256:8e748da1f6729ad0396d8ec5f88e9630ee74bc22a7408fd583632ad951a14823","download_count":1,"created_at":"2026-06-20T01:25:12Z","updated_at":"2026-06-20T01:25:12Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0-rc.5/atmos_1.222.0-rc.5_SHA256SUMS"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/452636478","id":452636478,"node_id":"RA_kwDOEW4XoM4a-q8-","name":"atmos_1.222.0-rc.5_windows_386.exe","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/x-ms-dos-executable","state":"uploaded","size":221944832,"digest":"sha256:e31b3fd6b7055495f76778d5f539ecee2c92ecc7b6220980babd4a9eec976b10","download_count":0,"created_at":"2026-06-20T01:25:10Z","updated_at":"2026-06-20T01:25:16Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0-rc.5/atmos_1.222.0-rc.5_windows_386.exe"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/452636421","id":452636421,"node_id":"RA_kwDOEW4XoM4a-q8F","name":"atmos_1.222.0-rc.5_windows_amd64.exe","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/x-ms-dos-executable","state":"uploaded","size":237584896,"digest":"sha256:15918d585777c454d9e8aad52c242019f2019591d34a0443857d2f1d2b2ead32","download_count":0,"created_at":"2026-06-20T01:25:04Z","updated_at":"2026-06-20T01:25:12Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0-rc.5/atmos_1.222.0-rc.5_windows_amd64.exe"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/452636340","id":452636340,"node_id":"RA_kwDOEW4XoM4a-q60","name":"atmos_1.222.0-rc.5_windows_arm64.exe","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/x-ms-dos-executable","state":"uploaded","size":218953216,"digest":"sha256:23dbabd60c8c21c6b96c89eac32638b865b17f8c2875fc59458a6198fb126715","download_count":0,"created_at":"2026-06-20T01:24:55Z","updated_at":"2026-06-20T01:25:02Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0-rc.5/atmos_1.222.0-rc.5_windows_arm64.exe"}],"tarball_url":"https://api.github.com/repos/cloudposse/atmos/tarball/v1.222.0-rc.5","zipball_url":"https://api.github.com/repos/cloudposse/atmos/zipball/v1.222.0-rc.5","body":"## 🚀 Enhancements\n\n<details>\n  <summary>Fix AWS store auth and add Floci E2E coverage @osterman (#2625)</summary>\n## what\n\n- Fix AWS SSM/Secrets Manager store auth during hooks, describe, and secret commands, including inherited identities and secret-store access enforcement.\n- Make slash kind notation canonical, add AWS store/secrets gists, document the fix, and add custom endpoint support for AWS, GCP Secret Manager, and Azure Key Vault.\n- Add opt-in Floci E2E tests and CI coverage for AWS, GCP, and Azure store/secrets workflows.\n\n## why\n\n- The reported SSM hook workflow could fall back to ambient AWS credentials or fail with a missing auth resolver even when the Terraform identity was valid.\n- The feature needed full-circle examples plus emulator-backed regression coverage so AWS stores and declared secrets stay working across providers.\n\n## references\n\n- No issue linked.\n\n<!-- This is an auto-generated comment: release notes by coderabbit.ai -->\n## Summary by CodeRabbit\n\n# Release Notes\n\n- **New Features**\n  - Standardized store backends on canonical `kind` identifiers (legacy `type` supported as aliases) and added clearer secret `scope: global` documentation.\n  - Added opt-in Floci-backed E2E coverage (AWS/GCP/Azure) and runnable AWS gist examples for declared secrets and store output loops.\n\n- **Bug Fixes**\n  - Fixed auth/credential resolver wiring for hook-driven and component inspection executions.\n  - Enforced `secret: true` store read restrictions (`!store`/`!store.get`/`atmos.Store` now reject); improved endpoint handling with lazy client initialization.\n\n- **Documentation**\n  - Updated stores/secrets/function docs and added Floci testing guidance.\n\n- **CI & Tests**\n  - Toolchain bumps, Codecov upload runs only when coverage exists, and added a `floci-go` job to the release pipeline.\n<!-- end of auto-generated comment: release notes by coderabbit.ai -->\n</details>\n\n<details>\n  <summary>Fix use-version before command resolution @osterman (#2629)</summary>\n## what\n\n- Run explicit `--use-version` / `ATMOS_USE_VERSION` re-exec before Cobra resolves subcommands.\n- Add regression coverage for env var, `--use-version=...`, and `--use-version ...` forms with commands unknown to the current binary.\n- We also took the liberty of adding a few unrelated, test-only coverage improvements to satisfy Codecov; these do not change production behavior.\n\n## why\n\n- Cobra rejected newly added commands before `PersistentPreRun` could switch Atmos versions.\n- This restores the workflow for testing new commands from `ref:`, `sha:`, and PR Atmos builds.\n\n## references\n\n- Closes #2624\n- Tested with `go test ./cmd -run 'UseVersion|UnknownSubcommand|ParseUseVersion'` and `go test ./pkg/version -run 'CheckAndReexec|UseVersion|RefVersion'`.\n\n\n<!-- This is an auto-generated comment: release notes by coderabbit.ai -->\n## Summary by CodeRabbit\n\n## Release Notes\n\n* **Bug Fixes**\n  * Improved handling of explicit version requests via `--use-version` or `ATMOS_USE_VERSION`, ensuring the correct Atmos version is selected earlier during startup—even when the command is not yet recognized.\n\n* **Tests**\n  * Expanded automated coverage for version re-execution timing, profiler and CLI override parsing, usage/path-resolution helpers, heatmap toggling, shell completion, docs link opening, color output modes, identity flag parsing, early `--chdir`, and packer error handling.\n  * Added HTTP request/response tests for Grok, Ollama, and OpenAI chat clients.\n<!-- end of auto-generated comment: release notes by coderabbit.ai -->\n</details>\n","mentions_count":1},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/341723801","assets_url":"https://api.github.com/repos/cloudposse/atmos/releases/341723801/assets","upload_url":"https://uploads.github.com/repos/cloudposse/atmos/releases/341723801/assets{?name,label}","html_url":"https://github.com/cloudposse/atmos/releases/tag/v1.222.0-rc.4","id":341723801,"author":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"node_id":"RE_kwDOEW4XoM4UXkqZ","tag_name":"v1.222.0-rc.4","target_commitish":"main","name":"v1.222.0-rc.4","draft":false,"immutable":false,"prerelease":true,"created_at":"2026-06-18T18:20:01Z","updated_at":"2026-06-19T02:16:36Z","published_at":"2026-06-19T02:16:36Z","assets":[{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/451784282","id":451784282,"node_id":"RA_kwDOEW4XoM4a7a5a","name":"atmos_1.222.0-rc.4_darwin_amd64","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":238915888,"digest":"sha256:992bd5b0016a5934408555e587388cd62b1b8630da721bcd9a4d4bf1b2824fbf","download_count":0,"created_at":"2026-06-19T02:15:39Z","updated_at":"2026-06-19T02:15:47Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0-rc.4/atmos_1.222.0-rc.4_darwin_amd64"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/451784018","id":451784018,"node_id":"RA_kwDOEW4XoM4a7a1S","name":"atmos_1.222.0-rc.4_darwin_arm64","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":224393362,"digest":"sha256:0cceaac57ad502211a1f941a30978bac291d523d439568a9f521fe2ed8f4537d","download_count":0,"created_at":"2026-06-19T02:15:26Z","updated_at":"2026-06-19T02:15:35Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0-rc.4/atmos_1.222.0-rc.4_darwin_arm64"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/451784014","id":451784014,"node_id":"RA_kwDOEW4XoM4a7a1O","name":"atmos_1.222.0-rc.4_freebsd_amd64","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":232816812,"digest":"sha256:188327c717720460c19faac3f8ff8c19112205d292ccd92c9e3301d2647ddc38","download_count":0,"created_at":"2026-06-19T02:15:26Z","updated_at":"2026-06-19T02:15:33Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0-rc.4/atmos_1.222.0-rc.4_freebsd_amd64"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/451784322","id":451784322,"node_id":"RA_kwDOEW4XoM4a7a6C","name":"atmos_1.222.0-rc.4_freebsd_arm64","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":216596652,"digest":"sha256:1582540bccedc17ed39eb3361eca601cdbb0a15befb19ff3cee3fedfc619f7b3","download_count":0,"created_at":"2026-06-19T02:15:43Z","updated_at":"2026-06-19T02:15:48Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0-rc.4/atmos_1.222.0-rc.4_freebsd_arm64"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/451784015","id":451784015,"node_id":"RA_kwDOEW4XoM4a7a1P","name":"atmos_1.222.0-rc.4_linux_386","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":217346210,"digest":"sha256:c3420b17162f7fc6277f0e9d0c276fe71124f9e1913a294e0f6b1c608b6d8233","download_count":0,"created_at":"2026-06-19T02:15:26Z","updated_at":"2026-06-19T02:15:33Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0-rc.4/atmos_1.222.0-rc.4_linux_386"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/451784288","id":451784288,"node_id":"RA_kwDOEW4XoM4a7a5g","name":"atmos_1.222.0-rc.4_linux_amd64","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":233652386,"digest":"sha256:a873fb858f3e4831e719c8bc44da8ed4996ef525c6e0468af7268849eadcf472","download_count":4,"created_at":"2026-06-19T02:15:40Z","updated_at":"2026-06-19T02:15:46Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0-rc.4/atmos_1.222.0-rc.4_linux_amd64"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/451784161","id":451784161,"node_id":"RA_kwDOEW4XoM4a7a3h","name":"atmos_1.222.0-rc.4_linux_arm","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":217514146,"digest":"sha256:79f7c3a5f10a252d3a3627d0ea9c4d4ee2c59e8018dff22845e321422336f1b1","download_count":0,"created_at":"2026-06-19T02:15:33Z","updated_at":"2026-06-19T02:15:39Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0-rc.4/atmos_1.222.0-rc.4_linux_arm"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/451784016","id":451784016,"node_id":"RA_kwDOEW4XoM4a7a1Q","name":"atmos_1.222.0-rc.4_linux_arm64","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":217383074,"digest":"sha256:e2dd95161289328b022522b909895d7b3d34603815346e43086c73f14982d0a4","download_count":0,"created_at":"2026-06-19T02:15:26Z","updated_at":"2026-06-19T02:15:35Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0-rc.4/atmos_1.222.0-rc.4_linux_arm64"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/451784331","id":451784331,"node_id":"RA_kwDOEW4XoM4a7a6L","name":"atmos_1.222.0-rc.4_SHA256SUMS","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":1085,"digest":"sha256:7fa4103cf161f5765b4325821178758a69d604abef369352d3b89083be2ee755","download_count":0,"created_at":"2026-06-19T02:15:44Z","updated_at":"2026-06-19T02:15:44Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0-rc.4/atmos_1.222.0-rc.4_SHA256SUMS"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/451784171","id":451784171,"node_id":"RA_kwDOEW4XoM4a7a3r","name":"atmos_1.222.0-rc.4_windows_386.exe","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/x-ms-dos-executable","state":"uploaded","size":221927936,"digest":"sha256:0ed1da27b7f577398e89da0cac9a8ab8349c9bb5eb9e6170a5328d67a04bdd0e","download_count":0,"created_at":"2026-06-19T02:15:34Z","updated_at":"2026-06-19T02:15:39Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0-rc.4/atmos_1.222.0-rc.4_windows_386.exe"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/451784211","id":451784211,"node_id":"RA_kwDOEW4XoM4a7a4T","name":"atmos_1.222.0-rc.4_windows_amd64.exe","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/x-ms-dos-executable","state":"uploaded","size":237566976,"digest":"sha256:ab9a56f7afd56df7a9220be3e927e24fde944445a94929c631e9d796fff4f6ed","download_count":0,"created_at":"2026-06-19T02:15:35Z","updated_at":"2026-06-19T02:15:43Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0-rc.4/atmos_1.222.0-rc.4_windows_amd64.exe"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/451784199","id":451784199,"node_id":"RA_kwDOEW4XoM4a7a4H","name":"atmos_1.222.0-rc.4_windows_arm64.exe","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/x-ms-dos-executable","state":"uploaded","size":218937344,"digest":"sha256:92cbd2367ced292d4a7e9da1e2cbf0a49761a18381eb72cf896e7c5d06766989","download_count":0,"created_at":"2026-06-19T02:15:35Z","updated_at":"2026-06-19T02:15:42Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0-rc.4/atmos_1.222.0-rc.4_windows_arm64.exe"}],"tarball_url":"https://api.github.com/repos/cloudposse/atmos/tarball/v1.222.0-rc.4","zipball_url":"https://api.github.com/repos/cloudposse/atmos/zipball/v1.222.0-rc.4","body":"## 🚀 Enhancements\n\n<details>\n  <summary>fix(toolchain): harden cosign verifier bootstrap @osterman (#2627)</summary>\n## what\n\n- Keep verifier bootstrap version resolution latest-first, using the existing authenticated GitHub/Aqua lookup path.\n- Add a `sigstore/cosign@v3.0.6` fallback only when latest-version lookup fails.\n- Add Renovate regex-manager coverage for the fallback cosign version so the safety pin is updateable.\n- Update installer tests to prove latest wins when available, cosign falls back when lookup fails, and non-pinned verifier lookup errors still surface.\n\n## why\n\n- Prevent OpenTofu toolchain installs from failing when cosign auto-install hits a slow or unavailable GitHub releases API.\n- Avoid making the fallback version the default forever; normal installs still use the latest resolved cosign release when GitHub lookup succeeds.\n- Preserve existing escape hatches: existing `cosign` on `PATH` still wins, and `verifier_install: path_only` still disables auto-install.\n\n## references\n\n- Failing run: https://github.com/cloudposse/atmos/actions/runs/27661641040/job/81808473011\n- Fallback cosign release: https://github.com/sigstore/cosign/releases/tag/v3.0.6\n\n<!-- This is an auto-generated comment: release notes by coderabbit.ai -->\n## Summary by CodeRabbit\n\n## Release Notes\n\n* **Bug Fixes**\n  * Improved reliability of verifier bootstrap installation by introducing a safe fallback for Cosign when “latest” version lookups fail, reducing dependence on temporary registry issues.\n\n* **Tests**\n  * Updated and expanded version-resolution coverage to validate new “latest” behavior, including fallback selection and call-attempt expectations across registries.\n  * Refined scenarios to ensure “latest” is not requested in flows where it shouldn’t be.\n\n* **Chores**\n  * Enhanced automated update rules to keep the Cosign bootstrap version aligned with the defined fallback.\n<!-- end of auto-generated comment: release notes by coderabbit.ai -->\n</details>\n","mentions_count":1},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/341127842","assets_url":"https://api.github.com/repos/cloudposse/atmos/releases/341127842/assets","upload_url":"https://uploads.github.com/repos/cloudposse/atmos/releases/341127842/assets{?name,label}","html_url":"https://github.com/cloudposse/atmos/releases/tag/v1.222.0-rc.3","id":341127842,"author":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"node_id":"RE_kwDOEW4XoM4UVTKi","tag_name":"v1.222.0-rc.3","target_commitish":"main","name":"v1.222.0-rc.3","draft":false,"immutable":false,"prerelease":true,"created_at":"2026-06-17T02:25:40Z","updated_at":"2026-06-18T02:10:55Z","published_at":"2026-06-18T02:10:55Z","assets":[{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/450784120","id":450784120,"node_id":"RA_kwDOEW4XoM4a3mt4","name":"atmos_1.222.0-rc.3_darwin_amd64","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":238915872,"digest":"sha256:65485ba84e80fac9ed8dfbb8e7a65d5e2d36aebda061247ffd9d66701b8127dd","download_count":0,"created_at":"2026-06-18T02:09:53Z","updated_at":"2026-06-18T02:10:01Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0-rc.3/atmos_1.222.0-rc.3_darwin_amd64"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/450784124","id":450784124,"node_id":"RA_kwDOEW4XoM4a3mt8","name":"atmos_1.222.0-rc.3_darwin_arm64","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":224393346,"digest":"sha256:04bbe7cc2952f4e9ec9d21a92fd323d037c3c02a4a996ba699ae657941304d91","download_count":1,"created_at":"2026-06-18T02:09:53Z","updated_at":"2026-06-18T02:10:00Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0-rc.3/atmos_1.222.0-rc.3_darwin_arm64"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/450784212","id":450784212,"node_id":"RA_kwDOEW4XoM4a3mvU","name":"atmos_1.222.0-rc.3_freebsd_amd64","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":232812716,"digest":"sha256:45c4e2de2b0b5b27fba2ab988f887e264e6229663a52cd0e87438452a8b3805d","download_count":0,"created_at":"2026-06-18T02:10:01Z","updated_at":"2026-06-18T02:10:08Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0-rc.3/atmos_1.222.0-rc.3_freebsd_amd64"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/450784003","id":450784003,"node_id":"RA_kwDOEW4XoM4a3msD","name":"atmos_1.222.0-rc.3_freebsd_arm64","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":216596652,"digest":"sha256:656fa71a2d262bf0d8cf534f3012ec1ec6b1723ba5734adb8b98f1e7a789d09c","download_count":0,"created_at":"2026-06-18T02:09:44Z","updated_at":"2026-06-18T02:09:52Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0-rc.3/atmos_1.222.0-rc.3_freebsd_arm64"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/450784143","id":450784143,"node_id":"RA_kwDOEW4XoM4a3muP","name":"atmos_1.222.0-rc.3_linux_386","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":217342114,"digest":"sha256:ffc6967ffa2df0c5014221ddfcf7844fd138edfcd933c23bfdc17ca8975d23e2","download_count":0,"created_at":"2026-06-18T02:09:55Z","updated_at":"2026-06-18T02:10:06Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0-rc.3/atmos_1.222.0-rc.3_linux_386"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/450784197","id":450784197,"node_id":"RA_kwDOEW4XoM4a3mvF","name":"atmos_1.222.0-rc.3_linux_amd64","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":233652386,"digest":"sha256:e9813856008d56fbc7d3dda663d145ed7babdd7dd0618a1542026bf7e849ea6c","download_count":10,"created_at":"2026-06-18T02:10:00Z","updated_at":"2026-06-18T02:10:08Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0-rc.3/atmos_1.222.0-rc.3_linux_amd64"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/450783999","id":450783999,"node_id":"RA_kwDOEW4XoM4a3mr_","name":"atmos_1.222.0-rc.3_linux_arm","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":217514146,"digest":"sha256:a10dbb8bf2d1fa1d409903deea7ae9bfb25649af17cbf771888f0243437fd080","download_count":0,"created_at":"2026-06-18T02:09:44Z","updated_at":"2026-06-18T02:09:53Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0-rc.3/atmos_1.222.0-rc.3_linux_arm"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/450784001","id":450784001,"node_id":"RA_kwDOEW4XoM4a3msB","name":"atmos_1.222.0-rc.3_linux_arm64","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":217383074,"digest":"sha256:0ef0ce4031b588c567684f60ca6c53a09bd8696218a156d5dba9ad05754861bb","download_count":0,"created_at":"2026-06-18T02:09:44Z","updated_at":"2026-06-18T02:09:54Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0-rc.3/atmos_1.222.0-rc.3_linux_arm64"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/450784265","id":450784265,"node_id":"RA_kwDOEW4XoM4a3mwJ","name":"atmos_1.222.0-rc.3_SHA256SUMS","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":1085,"digest":"sha256:a80305748d7163d94a2c0abf5068b1bd8c88f0d4c6e8e290b1d2f6487f22913c","download_count":3,"created_at":"2026-06-18T02:10:06Z","updated_at":"2026-06-18T02:10:06Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0-rc.3/atmos_1.222.0-rc.3_SHA256SUMS"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/450784000","id":450784000,"node_id":"RA_kwDOEW4XoM4a3msA","name":"atmos_1.222.0-rc.3_windows_386.exe","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/x-ms-dos-executable","state":"uploaded","size":221926400,"digest":"sha256:4e6b893e4487bf63dfc85778301c597ad2703a7c52cec962e10ce4c1bf5acc57","download_count":0,"created_at":"2026-06-18T02:09:44Z","updated_at":"2026-06-18T02:09:55Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0-rc.3/atmos_1.222.0-rc.3_windows_386.exe"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/450784149","id":450784149,"node_id":"RA_kwDOEW4XoM4a3muV","name":"atmos_1.222.0-rc.3_windows_amd64.exe","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/x-ms-dos-executable","state":"uploaded","size":237565440,"digest":"sha256:520918999cb59861ccab3df428316af96f8d248cf055bb71cfadbade156a6cb8","download_count":0,"created_at":"2026-06-18T02:09:55Z","updated_at":"2026-06-18T02:10:04Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0-rc.3/atmos_1.222.0-rc.3_windows_amd64.exe"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/450784256","id":450784256,"node_id":"RA_kwDOEW4XoM4a3mwA","name":"atmos_1.222.0-rc.3_windows_arm64.exe","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/x-ms-dos-executable","state":"uploaded","size":218936320,"digest":"sha256:c68287547db4bc09c22a8e1052edc3030c7f51e49b50049d24683a4ca095c5ca","download_count":0,"created_at":"2026-06-18T02:10:05Z","updated_at":"2026-06-18T02:10:10Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0-rc.3/atmos_1.222.0-rc.3_windows_arm64.exe"}],"tarball_url":"https://api.github.com/repos/cloudposse/atmos/tarball/v1.222.0-rc.3","zipball_url":"https://api.github.com/repos/cloudposse/atmos/zipball/v1.222.0-rc.3","body":"## 🚀 Enhancements\n\n<details>\n  <summary>test: stabilize Terraform cache coverage @osterman (#2620)</summary>\n## what\n\n- Add environment overrides for `components.terraform.cache.enabled` and `components.terraform.cache.location`, plus docs in the Terraform config and environment variable references.\n- Add focused registry-cache coverage, including Windows-safe trust command unit tests and a non-golden acceptance test with an isolated cache location.\n- Stabilize acceptance CI provider reuse with a process-level `TF_PLUGIN_CACHE_DIR` under the Atmos XDG cache root, and bump the CI cache key so `actions/cache` saves a fresh provider-plugin cache.\n\n## why\n\n- The native registry cache should be testable on Windows only after its loopback certificate is trusted, but it should not be enabled globally where cold/warm cache state can flip snapshots or screenshots.\n- Windows timeout mitigation should use Terraform’s provider plugin cache, which avoids the native cache proxy TLS trust problem.\n- The new environment overrides make targeted cache dogfooding possible without editing shared fixture `atmos.yaml` files.\n\n## references\n\n- Related context from #2607.\n- Validated with `go test ./pkg/config -run 'TestViperBindEnv_.*Cache'`, `go test ./pkg/terraform/cache -run 'Test.*Trust|Test.*Windows'`, `go test ./tests -run TestTerraformRegistryCache -timeout 10m`, and `git diff --check`.\n\n\n<!-- This is an auto-generated comment: release notes by coderabbit.ai -->\n\n## Summary by CodeRabbit\n\n* **New Features**\n  * Added Terraform registry cache configuration with `enabled` and `location` options to control caching behavior.\n  * Introduced new environment variables `ATMOS_COMPONENTS_TERRAFORM_CACHE_ENABLED` and `ATMOS_COMPONENTS_TERRAFORM_CACHE_LOCATION` for cache control.\n\n* **Documentation**\n  * Updated Terraform component configuration documentation with registry cache examples and environment variable references.\n\n* **Tests**\n  * Added acceptance tests for Terraform registry cache functionality.\n\n<!-- end of auto-generated comment: release notes by coderabbit.ai -->\n</details>\n","mentions_count":1},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/340492257","assets_url":"https://api.github.com/repos/cloudposse/atmos/releases/340492257/assets","upload_url":"https://uploads.github.com/repos/cloudposse/atmos/releases/340492257/assets{?name,label}","html_url":"https://github.com/cloudposse/atmos/releases/tag/v1.222.0-rc.2","id":340492257,"author":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"node_id":"RE_kwDOEW4XoM4US3_h","tag_name":"v1.222.0-rc.2","target_commitish":"main","name":"v1.222.0-rc.2","draft":false,"immutable":false,"prerelease":true,"created_at":"2026-06-16T17:03:14Z","updated_at":"2026-06-17T02:14:04Z","published_at":"2026-06-17T02:14:04Z","assets":[{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/449801009","id":449801009,"node_id":"RA_kwDOEW4XoM4az2sx","name":"atmos_1.222.0-rc.2_darwin_amd64","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":238903504,"digest":"sha256:5ea818f78065e0206122ccf5e072ca25ccfb6f91e4a45814d57e67574ed5d18b","download_count":1,"created_at":"2026-06-17T02:12:54Z","updated_at":"2026-06-17T02:13:01Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0-rc.2/atmos_1.222.0-rc.2_darwin_amd64"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/449800741","id":449800741,"node_id":"RA_kwDOEW4XoM4az2ol","name":"atmos_1.222.0-rc.2_darwin_arm64","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":224393266,"digest":"sha256:65432999b7a7aca03d57e5724fbd7a16fc57e786c15923927d8eb1ea0a002a75","download_count":1,"created_at":"2026-06-17T02:12:36Z","updated_at":"2026-06-17T02:12:46Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0-rc.2/atmos_1.222.0-rc.2_darwin_arm64"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/449800875","id":449800875,"node_id":"RA_kwDOEW4XoM4az2qr","name":"atmos_1.222.0-rc.2_freebsd_amd64","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":232804524,"digest":"sha256:bfae09e629070f538a51b8294c206c1f64c8e94a70d3d718288eb75137ff52ee","download_count":1,"created_at":"2026-06-17T02:12:43Z","updated_at":"2026-06-17T02:12:52Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0-rc.2/atmos_1.222.0-rc.2_freebsd_amd64"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/449800911","id":449800911,"node_id":"RA_kwDOEW4XoM4az2rP","name":"atmos_1.222.0-rc.2_freebsd_arm64","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":216596652,"digest":"sha256:1d4328c6a9eb6644b5ac86fba0994a002defbe8feba27984a73b7f8818ad0883","download_count":1,"created_at":"2026-06-17T02:12:46Z","updated_at":"2026-06-17T02:12:53Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0-rc.2/atmos_1.222.0-rc.2_freebsd_arm64"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/449800738","id":449800738,"node_id":"RA_kwDOEW4XoM4az2oi","name":"atmos_1.222.0-rc.2_linux_386","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":217333922,"digest":"sha256:caa238caa9499623165ecc232b0f9cff11be1c02592363be6dcd925b70467e5c","download_count":2,"created_at":"2026-06-17T02:12:36Z","updated_at":"2026-06-17T02:12:46Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0-rc.2/atmos_1.222.0-rc.2_linux_386"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/449800740","id":449800740,"node_id":"RA_kwDOEW4XoM4az2ok","name":"atmos_1.222.0-rc.2_linux_amd64","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":233644194,"digest":"sha256:cb2d5bdc1b76377b04915627b5db57e4634e38998e1a456894a3ee6ad2d57e17","download_count":4,"created_at":"2026-06-17T02:12:36Z","updated_at":"2026-06-17T02:12:46Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0-rc.2/atmos_1.222.0-rc.2_linux_amd64"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/449800739","id":449800739,"node_id":"RA_kwDOEW4XoM4az2oj","name":"atmos_1.222.0-rc.2_linux_arm","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":217514146,"digest":"sha256:8f85fe739971591c4bdd0bbb26405fbd5af2ea5277fe1bd46f8dc32afdc0ed31","download_count":1,"created_at":"2026-06-17T02:12:36Z","updated_at":"2026-06-17T02:12:43Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0-rc.2/atmos_1.222.0-rc.2_linux_arm"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/449801022","id":449801022,"node_id":"RA_kwDOEW4XoM4az2s-","name":"atmos_1.222.0-rc.2_linux_arm64","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":217383074,"digest":"sha256:62abad289f9692ea1930aa1e5597d729c3ac8a35e07c6046f0da76caf5a609ee","download_count":1,"created_at":"2026-06-17T02:12:55Z","updated_at":"2026-06-17T02:13:02Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0-rc.2/atmos_1.222.0-rc.2_linux_arm64"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/449801027","id":449801027,"node_id":"RA_kwDOEW4XoM4az2tD","name":"atmos_1.222.0-rc.2_SHA256SUMS","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":1085,"digest":"sha256:2be669a1036c714efafdd9f6e1e7e1f0d5fffc0a8f27ae80df1f499221b9d90d","download_count":1,"created_at":"2026-06-17T02:12:56Z","updated_at":"2026-06-17T02:12:56Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0-rc.2/atmos_1.222.0-rc.2_SHA256SUMS"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/449800912","id":449800912,"node_id":"RA_kwDOEW4XoM4az2rQ","name":"atmos_1.222.0-rc.2_windows_386.exe","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/x-ms-dos-executable","state":"uploaded","size":221904896,"digest":"sha256:f65ccc753c0a9bfa288d3f6bef081f8deb75d8aab210a1b80310eb0986624fe6","download_count":1,"created_at":"2026-06-17T02:12:46Z","updated_at":"2026-06-17T02:12:55Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0-rc.2/atmos_1.222.0-rc.2_windows_386.exe"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/449800914","id":449800914,"node_id":"RA_kwDOEW4XoM4az2rS","name":"atmos_1.222.0-rc.2_windows_amd64.exe","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/x-ms-dos-executable","state":"uploaded","size":237542912,"digest":"sha256:751516a2a9a560c4de2f226f3e597761f724a24bc43be1ef285849fe8b85b902","download_count":1,"created_at":"2026-06-17T02:12:46Z","updated_at":"2026-06-17T02:12:55Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0-rc.2/atmos_1.222.0-rc.2_windows_amd64.exe"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/449800997","id":449800997,"node_id":"RA_kwDOEW4XoM4az2sl","name":"atmos_1.222.0-rc.2_windows_arm64.exe","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/x-ms-dos-executable","state":"uploaded","size":218915840,"digest":"sha256:58d5510e6bc168d1f65d2a128814830c9f293690f54850ebf7407aa339cb9b1d","download_count":1,"created_at":"2026-06-17T02:12:52Z","updated_at":"2026-06-17T02:12:59Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0-rc.2/atmos_1.222.0-rc.2_windows_arm64.exe"}],"tarball_url":"https://api.github.com/repos/cloudposse/atmos/tarball/v1.222.0-rc.2","zipball_url":"https://api.github.com/repos/cloudposse/atmos/zipball/v1.222.0-rc.2","body":"## 🚀 Enhancements\n\n<details>\n  <summary>refactor(utils): drop dead helpers and hand-rolled SliceContainsString @osterman (#2608)</summary>\n## what\n\n- Replace the hand-rolled `SliceContainsString` / `SliceContainsStringHasPrefix` / `SliceContainsStringStartsWith` helpers with stdlib `slices.Contains` / `slices.ContainsFunc` across ~39 call sites, and remove the helpers from `pkg/utils`.\n- Delete nine dead exported functions that had zero callers anywhere: `ExtractAtmosConfig`, `GetGitHubRepoReleases`, `GetGitHubReleaseByTag`, `GetGitHubLatestRelease`, `PrintAsHcl`, `NewHighlightWriter` (plus the now-orphaned `HighlightWriter` type/method), `GetAtmosConfigJSON`, `PrintAsJSONToFileDescriptor`, and `PrintAsYAMLWithConfig` — including the now-empty `config_utils.go` and cascaded-unused imports/aliases.\n- Convert two `depends_on` dynamic errors in `stack_utils.go` to wrapped static errors (`ErrDependencyResolution`); their messages now carry a `dependency resolution failed:` prefix.\n\n## why\n\n- First step in dismantling `pkg/utils`, one of the repo's historical \"dumping grounds\" — `CLAUDE.md` already forbids adding to it, so this begins draining it.\n- `slices.Contains` is the identical O(n) scan as the deleted helper (the hot path in `yaml_utils.go` already uses an O(1) map), so there is no behavior or performance change from the swap; it also drops a per-call `perf.Track` defer.\n- The static-error conversion satisfies the `err113` lint gate after a flagged `if/else` chain was restructured into early returns, and aligns with the mandatory static-error policy.\n\n## references\n\n- Internal cleanup; no issue. Follow-up PRs will relocate the remaining `pkg/utils` files into purpose-built packages (`pkg/yaml`, `pkg/filesystem`, `pkg/data`, etc.).\n\n\n<!-- This is an auto-generated comment: release notes by coderabbit.ai -->\n## Summary by CodeRabbit\n\n## Release Notes\n\n* **Refactor**\n  * Updated internal string-slice membership checks to use Go’s standard library for consistency across Terraform and YAML/tag processing.\n  * Removed deprecated command wrapper entry points and other unused internal helpers to simplify the command surface area.\n\n* **Bug Fixes**\n  * Improved CI step-summary rendering to respect GitHub Actions output size limits, preventing overly large “Changed/Failed Components” sections.\n\n* **Tests**\n  * Added coverage for deploy/apply/plan auto-approve handling and vendor tag/component validation.\n<!-- end of auto-generated comment: release notes by coderabbit.ai -->\n</details>\n\n<details>\n  <summary>fix(terraform): restore init + workspace in terraform shell, add --skip-init @osterman (#2616)</summary>\n## what\n\n- Restore `terraform init` and Terraform workspace `select`/`new` to `atmos terraform shell` so the interactive shell again starts in an **initialized** component and the **correct workspace** (not `default`).\n- Extract a provisioner-free `executeTerraformInitCommand` from `executeTerraformInitPhase` so the shell can run `init` without re-firing the `before.terraform.init` provisioners it already runs (no double execution). Main `ExecuteTerraform` pipeline behavior is unchanged.\n- The shell now resolves the terraform/tofu binary (and toolchain), generates backend/provider-override files, and assembles the full component environment before launching — matching the shared pipeline.\n- Add a `--skip-init` opt-out to `atmos terraform shell` (reuses the existing terraform flag; no new flag definition). Workspace selection stays governed by `workspaces_enabled`.\n- Add regression tests for the init → workspace → shell ordering, the `--skip-init` decoupling, and the shell's `shouldRunTerraformInit`/`shouldSkipWorkspaceSetup` contract; document `--skip-init` in the command docs.\n\n## why\n\n- This was an accidental regression introduced in **v1.202.0** by #1813, which migrated `terraform shell` to a standalone `ExecuteTerraformShell` and silently dropped the `init` + workspace steps that the shared `ExecuteTerraform` pipeline used to run.\n- The result contradicted the published docs (which promise the command generates a backend file and creates the component's workspace) and forced users to pin old versions.\n- `--with-secrets` behavior is preserved: secrets are still kept out of the on-disk varfile and withheld from the shell unless explicitly requested.\n\n## references\n\n- Regression introduced in #1813 (first released in v1.202.0).\n\n\n<!-- This is an auto-generated comment: release notes by coderabbit.ai -->\n## Summary by CodeRabbit\n\n* **New Features**\n  * Added `--skip-init` flag to `terraform shell`, allowing you to start the interactive shell without running `terraform init`. You can also set it via `ATMOS_SKIP_INIT`. Workspace selection behavior remains governed by existing `workspaces_enabled` rules.\n* **Documentation**\n  * Updated `terraform shell` command docs to describe the new `--skip-init` option, including how it interacts with workspace selection and how to use `ATMOS_SKIP_INIT`.\n<!-- end of auto-generated comment: release notes by coderabbit.ai -->\n</details>\n\n<details>\n  <summary>fix(templates): honor ignore_missing_template_values for stack name_template (#2345) @aknysh (#2619)</summary>\n## what\r\n\r\n- Route the global `templates.settings.ignore_missing_template_values` flag into every stack `name_template` rendering site. Previously all 11 name-template `ProcessTmpl(...)` call sites passed a hardcoded `false`, so the flag was silently ignored for name-template rendering.\r\n- Sites updated: atlantis stack name, EKS cluster name, spacelift admin/stack name (describe affected), `describe locals` name, spacelift utils, terraform workspace, terraform generate backends/varfiles, the shared name-template util, and validate stacks.\r\n- Add `TestBuildTerraformWorkspace_IgnoreMissingTemplateValues` asserting both directions (flag off → error; flag on → `<no value>`).\r\n- Incidental cleanup: `gofumpt` reformatting two adjacent pre-existing `fmt.Errorf` calls in `stack_utils.go` - `err113` debt under `golangci-lint --new-from-rev=origin/main`. Converted them to the mandated static-wrapped-error pattern (new sentinels `ErrInvalidDependsOn` / `ErrInvalidSettingsDependsOn` in `errors/errors.go`) with tests covering both resolution branches and the `errors.Is` behavior.\r\n\r\n## why\r\n\r\n- When a user sets `templates.settings.ignore_missing_template_values: true`, they still hit hard errors like `map has no entry for key \"...\"` whenever the error originated from rendering the stack `name_template` — because the name-template `ProcessTmpl` sites bypassed the flag.\r\n- The fix is behavior-preserving: the flag defaults to `false`, so existing configurations render exactly as before; behavior only changes for users who explicitly opt in.\r\n- The `err113` conversion follows the repository's mandated static-error pattern and keeps the pre-commit/CI lint green; messages are unchanged.\r\n\r\n## references\r\n\r\n- Closes #2345\r\n- Fix doc: `docs/fixes/2026-06-15-name-template-ignore-missing-template-values.md`\r\n\r\n\r\n<!-- This is an auto-generated comment: release notes by coderabbit.ai -->\n## Summary by CodeRabbit\n\n## Summary by CodeRabbit\n\n* **Bug Fixes**\n  * Updated template rendering to consistently honor `ignore_missing_template_values` across stack- and dependency-related name derivations (including Terraform workspace and generated stack naming).\n  * Added clearer error handling for invalid `depends_on` inputs via dedicated sentinel errors.\n\n* **Tests**\n  * Added regression tests covering enabled/disabled `ignore_missing_template_values` behavior and dependency resolution success/failure.\n\n* **Documentation**\n  * Added a documentation page explaining the corrected `ignore_missing_template_values` behavior for stack name template rendering.\n<!-- end of auto-generated comment: release notes by coderabbit.ai -->\n</details>\n","mentions_count":2},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/339875402","assets_url":"https://api.github.com/repos/cloudposse/atmos/releases/339875402/assets","upload_url":"https://uploads.github.com/repos/cloudposse/atmos/releases/339875402/assets{?name,label}","html_url":"https://github.com/cloudposse/atmos/releases/tag/v1.222.0-rc.1","id":339875402,"author":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"node_id":"RE_kwDOEW4XoM4UQhZK","tag_name":"v1.222.0-rc.1","target_commitish":"main","name":"v1.222.0-rc.1","draft":false,"immutable":false,"prerelease":true,"created_at":"2026-06-15T22:21:35Z","updated_at":"2026-06-16T02:14:18Z","published_at":"2026-06-16T02:14:18Z","assets":[{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/448760417","id":448760417,"node_id":"RA_kwDOEW4XoM4av4ph","name":"atmos_1.222.0-rc.1_darwin_amd64","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":238891168,"digest":"sha256:be0660c6ff5bb32cef38d5578e4300eaa95a973e9e9ff153ebdc9564b86810c9","download_count":1,"created_at":"2026-06-16T02:13:19Z","updated_at":"2026-06-16T02:13:29Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0-rc.1/atmos_1.222.0-rc.1_darwin_amd64"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/448760421","id":448760421,"node_id":"RA_kwDOEW4XoM4av4pl","name":"atmos_1.222.0-rc.1_darwin_arm64","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":224376722,"digest":"sha256:a88a95d7d888c1256aac6c59c5533bcca6911f7d91d5d6c543cae2983bdc44b0","download_count":3,"created_at":"2026-06-16T02:13:20Z","updated_at":"2026-06-16T02:13:28Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0-rc.1/atmos_1.222.0-rc.1_darwin_arm64"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/448760348","id":448760348,"node_id":"RA_kwDOEW4XoM4av4oc","name":"atmos_1.222.0-rc.1_freebsd_amd64","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":232788140,"digest":"sha256:b9dd9ed3dca8afe10a850dfaf89d8fdd9275c1dce1393229e2a6366819f62b98","download_count":1,"created_at":"2026-06-16T02:13:12Z","updated_at":"2026-06-16T02:13:21Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0-rc.1/atmos_1.222.0-rc.1_freebsd_amd64"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/448760481","id":448760481,"node_id":"RA_kwDOEW4XoM4av4qh","name":"atmos_1.222.0-rc.1_freebsd_arm64","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":216596652,"digest":"sha256:bc358d160ebc0e0dc6c05bab00138a98944a06c374e4ef3fad7d808f238e7258","download_count":1,"created_at":"2026-06-16T02:13:27Z","updated_at":"2026-06-16T02:13:36Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0-rc.1/atmos_1.222.0-rc.1_freebsd_arm64"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/448760346","id":448760346,"node_id":"RA_kwDOEW4XoM4av4oa","name":"atmos_1.222.0-rc.1_linux_386","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":217321634,"digest":"sha256:24c6bc33b6527ea6ff3ebe95a6cbdcd759d2c86babb9117942a34927a021e685","download_count":1,"created_at":"2026-06-16T02:13:12Z","updated_at":"2026-06-16T02:13:19Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0-rc.1/atmos_1.222.0-rc.1_linux_386"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/448760483","id":448760483,"node_id":"RA_kwDOEW4XoM4av4qj","name":"atmos_1.222.0-rc.1_linux_amd64","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":233631906,"digest":"sha256:0e395e004efd1a531e98c72a6d033b16891c2388438a83a0cce8d8221ca9de4f","download_count":6,"created_at":"2026-06-16T02:13:28Z","updated_at":"2026-06-16T02:13:37Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0-rc.1/atmos_1.222.0-rc.1_linux_amd64"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/448760487","id":448760487,"node_id":"RA_kwDOEW4XoM4av4qn","name":"atmos_1.222.0-rc.1_linux_arm","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":217448610,"digest":"sha256:a3d1fac310ed0078aa61254a0a7d67ae1badf524ed65a0cfe4126ce6dca77c6c","download_count":1,"created_at":"2026-06-16T02:13:28Z","updated_at":"2026-06-16T02:13:36Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0-rc.1/atmos_1.222.0-rc.1_linux_arm"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/448760349","id":448760349,"node_id":"RA_kwDOEW4XoM4av4od","name":"atmos_1.222.0-rc.1_linux_arm64","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":217383074,"digest":"sha256:26f7f602d8102214b5cc49ff8334a693c97a8c9bddb7d501be30e4a30d811690","download_count":1,"created_at":"2026-06-16T02:13:12Z","updated_at":"2026-06-16T02:13:20Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0-rc.1/atmos_1.222.0-rc.1_linux_arm64"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/448760533","id":448760533,"node_id":"RA_kwDOEW4XoM4av4rV","name":"atmos_1.222.0-rc.1_SHA256SUMS","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":1085,"digest":"sha256:cc9e649af44b3b0e8afe199a124c7757ef7e2234dd1c82e27bb71d366c368ef5","download_count":2,"created_at":"2026-06-16T02:13:30Z","updated_at":"2026-06-16T02:13:30Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0-rc.1/atmos_1.222.0-rc.1_SHA256SUMS"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/448760347","id":448760347,"node_id":"RA_kwDOEW4XoM4av4ob","name":"atmos_1.222.0-rc.1_windows_386.exe","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/x-ms-dos-executable","state":"uploaded","size":221891584,"digest":"sha256:aea85ff456aa39a148b6d42daa1bbcb118acdbe9776e8b28ea8ba5ebcabc33fb","download_count":1,"created_at":"2026-06-16T02:13:12Z","updated_at":"2026-06-16T02:13:20Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0-rc.1/atmos_1.222.0-rc.1_windows_386.exe"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/448760422","id":448760422,"node_id":"RA_kwDOEW4XoM4av4pm","name":"atmos_1.222.0-rc.1_windows_amd64.exe","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/x-ms-dos-executable","state":"uploaded","size":237529088,"digest":"sha256:fed90559677918a0ce435dd08a6a2fc98c7ee6dff4e31754ec0f511784f5cfc1","download_count":1,"created_at":"2026-06-16T02:13:20Z","updated_at":"2026-06-16T02:13:27Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0-rc.1/atmos_1.222.0-rc.1_windows_amd64.exe"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/448760434","id":448760434,"node_id":"RA_kwDOEW4XoM4av4py","name":"atmos_1.222.0-rc.1_windows_arm64.exe","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/x-ms-dos-executable","state":"uploaded","size":218904576,"digest":"sha256:a7ad807a301678d8250220758362a8ffc85651fbefa50ee546ba1ea4fa794182","download_count":1,"created_at":"2026-06-16T02:13:21Z","updated_at":"2026-06-16T02:13:27Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0-rc.1/atmos_1.222.0-rc.1_windows_arm64.exe"}],"tarball_url":"https://api.github.com/repos/cloudposse/atmos/tarball/v1.222.0-rc.1","zipball_url":"https://api.github.com/repos/cloudposse/atmos/zipball/v1.222.0-rc.1","body":"<details>\n  <summary>feat: terminal steps - tty/interactive fields and exec step type @osterman (#2602)</summary>\n## what\n\n**Terminal steps for custom commands and workflows** — three related capabilities:\n\n- `interactive: true` — attach host stdin and let the step own Ctrl-C. Atmos suspends its SIGINT-exit handler while the step runs (new `pkg/signals` suspension registry consulted by the `main.go` signal handler).\n- `tty: true` — allocate a pseudo-terminal (reusing `pkg/terminal/pty`, same engine as `atmos devcontainer attach`). The command sees a real TTY; secret masking is applied to PTY output. With `interactive: true`, the host terminal switches to raw mode so Ctrl-C flows through the PTY to the child.\n- `type: exec` — replace the Atmos process entirely (shell `exec` semantics): `execve` of the system shell on Unix (env, working directory, and terminal inherited natively; `ATMOS_SHLVL` unchanged), spawn-and-propagate-exit-code emulation on Windows. Validated to be the final step; `tty`/`interactive`/`retry`/`timeout`/`output` are rejected on exec steps.\n\nArchitecture: all logic lives in narrow packages — `pkg/process` (`RunShellStep` routing, `RunShellSession`, `ReplaceShellSession`), `pkg/schema` (validation), `pkg/signals` (interrupt suspension). `cmd/` and `internal/exec` contain only inline switch-case call sites; `pkg/runner` and the step handler share the same routing.\n\nAlso fixes in `pkg/terminal/pty` found along the way:\n- stdin copier no longer blocks completion (it's detached, docker-CLI pattern)\n- session teardown is bounded: when grandchildren (e.g. aws ssm's `session-manager-plugin`) keep the PTY slave open after the child exits, output drains on a 1s deadline instead of hanging with the terminal in raw mode\n- `DisableStdinForward` for `-t`-without-`-i` semantics\n\n## why\n\nCustom commands had no way to hand the terminal to an interactive process:\n\n```yaml\ncommands:\n  - name: ssh\n    steps:\n      - type: shell\n        command: \"exec aws ssm start-session --target {{ .Arguments.instance_id }}\"\n```\n\nran the SSM session as a piped, masked subprocess: full-screen rendering broke, and Ctrl-C inside the session killed Atmos itself (global SIGINT handler exits 130), killing the orphaned session with SIGPIPE.\n\nWith this change:\n\n```yaml\ncommands:\n  - name: ssh\n    steps:\n      - type: shell\n        tty: true\n        interactive: true\n        command: \"aws ssm start-session --target {{ .Arguments.instance_id }}\"\n```\n\nbehaves like `docker run -it` (supervised: masking preserved, more steps can follow), and:\n\n```yaml\n      - type: exec\n        command: \"aws ssm start-session --target {{ .Arguments.instance_id }}\"\n```\n\nhands the process over entirely (launcher: native job control, zero proxy overhead, must be the last step).\n\n## references\n\n- Reported in SweetOps Slack (SSM session via custom command gets a mangled terminal and dies with SIGPIPE on Ctrl-C); teardown hang + raw-terminal-after-exit reproduced live on this PR and fixed\n- Docs: [Interactive and TTY Steps](https://atmos.tools/cli/configuration/commands#interactive-and-tty-steps)\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\n\n<!-- This is an auto-generated comment: release notes by coderabbit.ai -->\n## Summary by CodeRabbit\n\n* **New Features**\n  * Added `tty` and `interactive` options for `shell` steps, and introduced `exec` step type for process replacement.\n* **Behavior**\n  * Improved terminal/TTY handling, including Ctrl-C ownership, PTY session behavior, and more reliable exit-code propagation.\n  * “Silent” exit codes now skip themed error rendering.\n* **Validation**\n  * Enforced `exec` steps must be the final step and disallow incompatible fields; improved error hints.\n* **Documentation**\n  * Updated workflow/CLI docs and added a blog post with usage guidance.\n* **Tests / Fixes**\n  * Expanded coverage for shell sessions, PTY stdin forwarding/teardown, exec replacement, signals, and schema validation.\n<!-- end of auto-generated comment: release notes by coderabbit.ai -->\n</details>\n\n<details>\n  <summary>feat(secrets): declarative secrets management with !secret, CRUD CLI, and masking @osterman (#1911)</summary>\n## what\n\nImplements the **Secrets Management PRD** end to end — a GitOps-friendly, multi-cloud secrets workflow built on top of the existing store registry (not a parallel backend). Secrets are **declared** in stack config (committed to git) and their **values** live in a cloud secret backend or a SOPS-encrypted file, managed with a Vercel-like CLI and resolved at runtime with a new `!secret` YAML function.\n\n### Stores (`pkg/store`)\n- `StoreConfig` gains `secret: true` (subsystem membership) and `kind` (cloud/thing) with legacy `type` mapping; `!store` against a `secret: true` store is now an error (\"use `!secret`\").\n- New `DeletableStore` / `StatusStore` / `SecretAwareStore` interfaces; AWS SSM writes `SecureString` when used as a secret backend and gains `Delete`/`Has`.\n- **New store backends:** AWS Secrets Manager and HashiCorp Vault (KV v2). Registry refactored to a table-driven builder map; `kind`↔`type` compatibility.\n\n### Secrets core (`pkg/secrets`)\n- `service`, declaration `registry`, `resolver`, `validator`, `kinds`, and a leaf `pkg/secrets/providers/` subpackage with a store-adapter (track 1) and a native **SOPS** provider (track 2: `age`/`aws-kms`/`gcp-kms`/`gpg`).\n- SOPS providers can be defined in `atmos.yaml`, **globally in a stack** (`secrets:` top-level merges into every component), or under a single component.\n\n### `!secret` + masking (the headline)\n- `!secret NAME [| path ...] [| default ...]` wired into the live YAML pipeline, with automatic masker registration.\n- **Mask-without-retrieval:** inspection commands (`describe`, `list`) resolve `!secret` to `<MASKED>` **without contacting the backend** when masking is on (the default) — so you can inspect a stack with **no cloud credentials**. Value-producing commands (`secret get`, `terraform plan/apply`) always retrieve; `--mask`/`ATMOS_MASK` only controls redaction of display output.\n- Sensitive Terraform outputs (`sensitive = true`) auto-register with the masker as they flow through `!terraform.output` / `atmos.Component()` / `describe`.\n\n### CLI (`cmd/secret`)\n`init`, `set` (alias `add`), `get`, `delete` (alias `rm`), `list`, `pull`, `push`, `import`, `validate`.\n\n### Stack processing\n`secrets` is now a first-class inheritable component section, plus a global stack-level `secrets:` block that merges into every component.\n\n### Docs + example\n- Full Docusaurus docs: `atmos secret` overview + all 9 subcommands, secrets configuration page, `!secret` function page; blog post (with an embedded example) and a roadmap milestone.\n- **`examples/sops-secrets/`** — fully self-contained, age-encrypted, **no cloud credentials**. Bundled `atmos test` custom command (`.atmos.d/test.yaml`) proves the full lifecycle end to end (set → encrypted-at-rest → get → list → validate → masked-without-credentials inspection → reveal-needs-key).\n\n## why\n\nThere was no unified way to manage human-provisioned secrets in Atmos — stores were designed for machine-written Terraform outputs, and the historical workaround (Chamber) was AWS-only. This adds explicit, declarative secret registration so a secret must be declared before it can be set, read, or resolved, and makes \"inspect a stack\" decoupled from \"authenticate to the secret backend.\"\n\n## references\n\n- PRD: `docs/prd/secrets-management.md` and `docs/prd/secrets-masking/`\n- Example: `examples/sops-secrets/` (run `atmos test`)\n\n## notes / follow-ups\n\n- Fixed a pre-existing init-ordering bug where the global `--mask=false` **flag** did not disable the early-initialized I/O masker (only `ATMOS_MASK=false` did). `io.ReconcileMasking()` now reconciles the masker after flags are parsed, so `--mask=false` and `ATMOS_MASK=false` behave identically.\n- `pkg/store` backend implementations could be moved into a `pkg/store/providers/` subpackage (mirroring `pkg/secrets/providers/`) — deferred to a dedicated follow-up PR since it touches ~30 external call-sites.\n- Base-component (`metadata.component`) inheritance of the `secrets` section is not wired yet (component-level + `import:` + global-stack inheritance all work).\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\n<!-- This is an auto-generated comment: release notes by coderabbit.ai -->\n## Summary by CodeRabbit\n\n* **New Features**\n  * First-class secrets management CLI: `secret init`, `set/add`, `get`, `delete/rm`, `list`, `pull`, `push`, `import`, `validate`, plus `exec`, `shell`, and `keygen`.\n  * SOPS-backed secrets with collision-safe placement and secure inspection by default.\n  * Terraform integration: secret values are injected via `TF_VAR_*`, and secret-bearing values are omitted from generated varfiles by default (with optional shell export).\n* **Documentation**\n  * Added PRDs/blog and updated secrets examples and masking guidance.\n* **Bug Fixes**\n  * Masking behavior now consistently follows `--mask` across inspection-style commands.\n* **Tests**\n  * Expanded unit/integration coverage for secrets, masking, Terraform, and providers.\n* **Chores**\n  * Updated license inventory and CI/test reliability tweaks.\n<!-- end of auto-generated comment: release notes by coderabbit.ai -->\n</details>\n","mentions_count":1},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/339290956","assets_url":"https://api.github.com/repos/cloudposse/atmos/releases/339290956/assets","upload_url":"https://uploads.github.com/repos/cloudposse/atmos/releases/339290956/assets{?name,label}","html_url":"https://github.com/cloudposse/atmos/releases/tag/v1.222.0-rc.0","id":339290956,"author":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"node_id":"RE_kwDOEW4XoM4UOStM","tag_name":"v1.222.0-rc.0","target_commitish":"main","name":"v1.222.0-rc.0","draft":false,"immutable":false,"prerelease":true,"created_at":"2026-06-14T23:39:45Z","updated_at":"2026-06-15T01:39:11Z","published_at":"2026-06-15T01:39:11Z","assets":[{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/447714684","id":447714684,"node_id":"RA_kwDOEW4XoM4ar5V8","name":"atmos_1.222.0-rc.0_darwin_amd64","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":220864032,"digest":"sha256:afd65ea52696fb3c56fbbdaefdf582d12bed6bf4a221dfc3c9c1256845fe8a19","download_count":1,"created_at":"2026-06-15T01:38:13Z","updated_at":"2026-06-15T01:38:20Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0-rc.0/atmos_1.222.0-rc.0_darwin_amd64"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/447714643","id":447714643,"node_id":"RA_kwDOEW4XoM4ar5VT","name":"atmos_1.222.0-rc.0_darwin_arm64","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":206787026,"digest":"sha256:551a9237c9eb3213160cc6c05b2e123b8e52747a945f06d1b4e3275195431cd6","download_count":2,"created_at":"2026-06-15T01:38:09Z","updated_at":"2026-06-15T01:38:17Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0-rc.0/atmos_1.222.0-rc.0_darwin_arm64"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/447714589","id":447714589,"node_id":"RA_kwDOEW4XoM4ar5Ud","name":"atmos_1.222.0-rc.0_freebsd_amd64","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":215044268,"digest":"sha256:cd21bf0e0dd14780632265aa33209d3a9f74ea57c601c61f24e1d67fa4801a66","download_count":1,"created_at":"2026-06-15T01:38:00Z","updated_at":"2026-06-15T01:38:08Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0-rc.0/atmos_1.222.0-rc.0_freebsd_amd64"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/447714587","id":447714587,"node_id":"RA_kwDOEW4XoM4ar5Ub","name":"atmos_1.222.0-rc.0_freebsd_arm64","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":199426220,"digest":"sha256:4cf9d8bfc324df13e354abec606fff7b27b517be66e475906019ddd22d1775ab","download_count":1,"created_at":"2026-06-15T01:38:00Z","updated_at":"2026-06-15T01:38:09Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0-rc.0/atmos_1.222.0-rc.0_freebsd_arm64"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/447714703","id":447714703,"node_id":"RA_kwDOEW4XoM4ar5WP","name":"atmos_1.222.0-rc.0_linux_386","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":200704162,"digest":"sha256:d35e1ea73a086173681924c6cffaaea4262fd35fb2e2ecde80a3da898e79cdd6","download_count":1,"created_at":"2026-06-15T01:38:17Z","updated_at":"2026-06-15T01:38:23Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0-rc.0/atmos_1.222.0-rc.0_linux_386"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/447714590","id":447714590,"node_id":"RA_kwDOEW4XoM4ar5Ue","name":"atmos_1.222.0-rc.0_linux_amd64","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":215859362,"digest":"sha256:543ebb7a4b7f4ee1dd2b06c32112d58d129725b3104fbf7ab31a4070f4352362","download_count":8,"created_at":"2026-06-15T01:38:00Z","updated_at":"2026-06-15T01:38:08Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0-rc.0/atmos_1.222.0-rc.0_linux_amd64"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/447714647","id":447714647,"node_id":"RA_kwDOEW4XoM4ar5VX","name":"atmos_1.222.0-rc.0_linux_arm","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":200802466,"digest":"sha256:0e2b1a31330fe8dd4205ef5331f615ede18c839ae0c813faa224145295182bcd","download_count":1,"created_at":"2026-06-15T01:38:09Z","updated_at":"2026-06-15T01:38:16Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0-rc.0/atmos_1.222.0-rc.0_linux_arm"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/447714701","id":447714701,"node_id":"RA_kwDOEW4XoM4ar5WN","name":"atmos_1.222.0-rc.0_linux_arm64","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":200278178,"digest":"sha256:950612edc091fe48b4c9e498e221cbc902d987739233f31a08de0666d55213b3","download_count":1,"created_at":"2026-06-15T01:38:17Z","updated_at":"2026-06-15T01:38:24Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0-rc.0/atmos_1.222.0-rc.0_linux_arm64"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/447714713","id":447714713,"node_id":"RA_kwDOEW4XoM4ar5WZ","name":"atmos_1.222.0-rc.0_SHA256SUMS","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":1085,"digest":"sha256:33b5ade3d57c6b95817cf65eef1f0457e8fc37e2ddf1d3cda77e5532197e66ef","download_count":2,"created_at":"2026-06-15T01:38:21Z","updated_at":"2026-06-15T01:38:21Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0-rc.0/atmos_1.222.0-rc.0_SHA256SUMS"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/447714644","id":447714644,"node_id":"RA_kwDOEW4XoM4ar5VU","name":"atmos_1.222.0-rc.0_windows_386.exe","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/x-ms-dos-executable","state":"uploaded","size":205072384,"digest":"sha256:fc6eb50a65048c3bc314bcbabb84ee74345a9c88fc93cc7a5d4dd3b12f957d94","download_count":1,"created_at":"2026-06-15T01:38:09Z","updated_at":"2026-06-15T01:38:16Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0-rc.0/atmos_1.222.0-rc.0_windows_386.exe"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/447714699","id":447714699,"node_id":"RA_kwDOEW4XoM4ar5WL","name":"atmos_1.222.0-rc.0_windows_amd64.exe","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/x-ms-dos-executable","state":"uploaded","size":219564544,"digest":"sha256:f4954d9921bacfb8ecab53b1846e06452822dd2b4f165fce38e037a41148203d","download_count":2,"created_at":"2026-06-15T01:38:16Z","updated_at":"2026-06-15T01:38:24Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0-rc.0/atmos_1.222.0-rc.0_windows_amd64.exe"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/447714588","id":447714588,"node_id":"RA_kwDOEW4XoM4ar5Uc","name":"atmos_1.222.0-rc.0_windows_arm64.exe","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/x-ms-dos-executable","state":"uploaded","size":201606656,"digest":"sha256:a584baab758361c5b9f0b199f4dcaf5355024915a78a6d6a511bc83f182d0ed7","download_count":1,"created_at":"2026-06-15T01:38:00Z","updated_at":"2026-06-15T01:38:13Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.222.0-rc.0/atmos_1.222.0-rc.0_windows_arm64.exe"}],"tarball_url":"https://api.github.com/repos/cloudposse/atmos/tarball/v1.222.0-rc.0","zipball_url":"https://api.github.com/repos/cloudposse/atmos/zipball/v1.222.0-rc.0","body":"<details>\n  <summary>feat(terraform): registry cache, RC management, and multi-platform mirror @osterman (#2582)</summary>\n## what\n\n- Add a transparent Terraform/OpenTofu **registry cache**: an ephemeral local HTTPS network-mirror proxy (`pkg/http/proxy`, `pkg/terraform/{cache,registry}`) that caches providers and modules in the canonical `filesystem_mirror` layout, enabled with `components.terraform.cache.enabled: true`.\n- Add the `atmos terraform cache` command group — `list`, `stats`, `prune`, `delete`, plus `mirror` (alias `warm`) for eager multi-platform pre-seeding and `trust`/`untrust` for the proxy certificate.\n- Add declarative Terraform **CLI-config (`.terraformrc`) management** via `components.terraform.rc`, exposed to the subprocess through `TF_CLI_CONFIG_FILE`/`TOFU_CLI_CONFIG_FILE`.\n- Add a first-class `components.terraform.platforms` setting (target `<os>_<arch>` list) that drives **both** eager `atmos terraform cache mirror` pre-seeding (`--all`/`--components`/`--query`/`-s`, package-manager-style TUI, `--format json|yaml`) **and** automatic completion of `.terraform.lock.hcl`.\n- Keep `.terraform.lock.hcl` complete across platforms: a built-in `after.terraform.init` provisioner runs `terraform/tofu providers lock -platform=…` for the declared `platforms` whenever a customized provider installation method (the default plugin cache, or the registry cache) is active. Because it runs after `init`, it sees the fully JIT-vendored and code-generated working directory, so the generated provider set (including stack-config provider versions) is what gets locked — and committed lock files install cleanly on every platform in a fleet.\n- Generate and cache a self-signed loopback certificate so the proxy can serve HTTPS (required by Terraform/OpenTofu network mirrors); trusted automatically via `SSL_CERT_FILE` on Linux/CI and via a one-time `atmos terraform cache trust` on macOS/Windows.\n- Add `examples/caching` (auto-installs OpenTofu via the toolchain), PRDs, command + configuration docs, blog posts, and a roadmap update.\n\n## why\n\n- Repeated and CI runs re-download the same providers and modules; the cache eliminates that, keeps runs working through registry outages, and preserves the exact versions a deployment used.\n- Atmos enables a provider plugin cache (`TF_PLUGIN_CACHE_DIR`) by default, and network mirrors behave the same way: Terraform can no longer record the registry's signed cross-platform checksums, so `init` writes a `.terraform.lock.hcl` with hashes for only the current platform and prints the \"Incomplete lock file information for providers\" warning. Declaring `components.terraform.platforms` lets Atmos complete the lock automatically for every target platform.\n- The lazy proxy only caches the host platform, so mixed CI/developer fleets and air-gapped reproducible builds need declarative multi-platform pre-seeding — `components.terraform.platforms` + `cache mirror` provide it.\n- Declarative `rc` lets teams manage provider mirrors, credentials, and other CLI-config directives from `atmos.yaml` instead of per-machine `.terraformrc` files.\n\n## references\n\n- Closes #2150\n- `docs/prd/terraform-registry-cache.md`, `docs/prd/terraform-rc-management.md`, `docs/prd/terraform-registry-cache-tls.md`\n\n\n<!-- This is an auto-generated comment: release notes by coderabbit.ai -->\n## Summary by CodeRabbit\n\n# Release Notes\n\n* **New Features**\n  * Added an experimental Terraform/OpenTofu registry cache with disk-backed mirroring, metadata freshness controls (TTL + stale-while-revalidate), per-key locking, and a savings report.\n  * Added `atmos terraform cache` subcommands: `list`/`stats` (table/JSON/YAML output), `prune` (`--older-than`, `--dry-run`, `--all`), `delete <key>`, `mirror` (`warm` alias, optional eager pre-seeding).\n  * Added `trust`/`untrust` for HTTPS certificate trust on macOS/Windows (actionable when untrusted).\n\n* **Documentation**\n  * Added/updated guides and CLI references for registry cache, CLI RC management (`components.terraform.rc`), and all cache subcommands.\n<!-- end of auto-generated comment: release notes by coderabbit.ai -->\n</details>\n\n<details>\n  <summary>feat: Atmos Git — foundational capability for GitOps enablement @osterman (#2597)</summary>\n## what\n\nAtmos Git: Git becomes a foundational platform capability, on par with Toolchain, Auth, and Hooks — the enablement layer for GitOps workflows where Atmos commits generated artifacts to a source-of-truth repository. PRD: `docs/prd/git-ops.md`.\n\n- **Top-level `git` config** — `git.repositories.<name>` declares managed repositories (uri, branch, remote, clone depth/filter/single-branch/submodules, `auth.identity`, `commit.signing`/`commit.author`, `push.retries`), `git.hooks` declares local Git hooks, `git.list` configures list output. Workdirs default to automatic XDG cache locations (`$XDG_CACHE_HOME/atmos/git/repositories/<name>`) so the native CI cache captures and restores managed clones.\n- **`pkg/git` service** — provider registry (registry pattern) with the `cli` provider in v1 (chosen because GitHub STS materializes credentials as `GIT_CONFIG_*` env vars, which subprocess git honors and go-git ignores). Clone is defined as *reconcile* (clone-if-absent, else fetch + checkout + ff-only) so stale CI-cache restores are just faster clones. Safety rules: ff-only pull, no force push ever, push retry-with-rebase on non-fast-forward rejection, path-scoped commits that fail on unrelated dirty files, worktree path-traversal validation, per-invocation commit author injection (CI runners need no `user.name`), provenance trailers (`Atmos-Stack`, `Atmos-Component`, `Atmos-Source-SHA`).\n- **`atmos git` command group** — `clone`, `pull`, `status`, `diff`, `commit`, `push`, `list`, `clean`, plus `git hooks install|uninstall|run`, registered under the **Git** help group. `--all` bulk operations (bounded concurrency, attempt-all with `errors.Join`). Clone accepts configured names, plain URLs, and go-getter `git::...?ref=&depth=` URIs. No-arg clone in native CI (`ci.enabled: true`) infers the current repository from CI metadata and clones into the workspace — an `actions/checkout` replacement. `atmos list git-repositories` alias registered.\n- **`git` hook kind** — publishes generated artifacts on lifecycle events (`after.terraform.apply`, ...) to the current repository by default or a named managed repository, with templated commit messages, trailers, clean no-ops, and push-after-commit with retry. Inherits `--skip-hooks` and `on_failure`.\n- **Local Git hook shims** — `atmos git hooks install` writes worktree-aware `.git/hooks/*` shims (marker-protected, `--force` to overwrite, warns when `core.hooksPath` is set); `run` dispatches configured commands with stdin forwarding and exit-code propagation.\n- **Error handling** — new sentinels (`ErrGitRepositoryNotFound`, `ErrGitAuthFailed`, `ErrGitPushRejected`, `ErrGitDirtyUnmanagedFiles`, `ErrGitPathEscapesWorktree`, `ErrGitHookNotConfigured`, `ErrGitRepositoryRequired`, `ErrGitProviderNotFound`) with error-builder hints and exit-code mapping. Git stderr streams to the masked writer and is never embedded in error chains.\n- **Docs & example** — command pages under `website/docs/cli/commands/git/`, `git` configuration reference, hook kind docs, changelog blog post (`atmos-gitops`), roadmap milestone (CI/CD Simplification initiative), and a GitOps publishing demo at `examples/gitops` (reconcile → review → publish against a managed deployment repo via custom commands).\n\n### What this is — and isn't\n\nAtmos owns the **publishing side** of GitOps: render → diff → commit → push, with centralized safety rules. Reconciliation stays with the consumer — Argo CD or Flux pulls from the repository, or CI applies on merge. There are no agents and no drift-correction loop in Atmos itself (explicit non-goal in the PRD); Atmos is the producer feeding the reconciler. This also isn't a replacement for the existing GitHub Actions plan/apply integration — it's the Git plumbing those pipelines use.\n\n## why\n\nGitOps workflows have always needed glue: ad hoc scripts to render manifests into deployment repos, commit them, survive push races, and wire credentials. Atmos already owns rendering, lifecycle events, toolchain, and credentials (GitHub STS) — this PR gives it the Git operations between them, with centralized safety rules instead of per-pipeline shell scripts. It is the foundation for Kubernetes deployment-repository provisioning (Argo CD / Flux rendered-manifest publishing, on the kubernetes component branch) and a future `github` provider for pull-request-based publishing to protected branches.\n\n## references\n\n- PRD: `docs/prd/git-ops.md` (in this PR)\n- Coverage: `pkg/git` 86%, `pkg/git/providers/cli` 88%, `pkg/hooks/kinds/git` 94%, `cmd/git` 81%\n- Related: native CI cache (XDG-root archiving) and the Kubernetes component branch (consumes `provision.git` next)\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\n\n<!-- This is an auto-generated comment: release notes by coderabbit.ai -->\n## Summary by CodeRabbit\n\n## Release Notes\n\n* **New Features**\n  * Added the experimental `atmos git` command group: `clone`, `pull` (fast-forward-only), `status`, `diff`, `commit`, `push` (retries on contention), `clean`, `list`, `init`, plus `hooks` (`install`, `run`, `uninstall`).\n  * Introduced managed Git repositories in `atmos.yaml` (`git.repositories`) with deterministic workdirs, `git::` URI query params (`ref`, `depth`), CI no-arg checkout, and concurrent `--all` operations.\n  * `atmos git list` now supports configurable columns/formatting and optional status probing.\n\n* **Documentation**\n  * Added/updated CLI, configuration, GitOps, and hook documentation for the new Git surfaces.\n<!-- end of auto-generated comment: release notes by coderabbit.ai -->\n</details>\n\n<details>\n  <summary>feat: support dotenv files in !include @osterman (#1930)</summary>\n## Summary\n\nAdds explicit dotenv file support to the existing `!include` YAML function. Dotenv files now resolve to maps, so they can be used directly in CLI and stack `env` sections and with YAML merge keys.\n\n```yaml\nenv:\n  <<: !include .env\n  AWS_REGION: us-east-2\n```\n\nDotenv files can also be layered with YAML merge sequences. This uses YAML's `<<` merge-key syntax, the same YAML mechanism commonly used with anchors and aliases:\n\n```yaml\nenv:\n  <<:\n    - !include .env.local\n    - !include .env\n  AWS_REGION: us-east-2\n```\n\nYAML merge sequence precedence is earlier item wins, and inline keys under `env` override all merged values.\n\n## What Changed\n\n- Parse `.env`, `.env.*`, and exact `*.env` filenames as dotenv files when used with `!include`\n- Support `env: !include .env` and `env: { <<: !include .env }` / block merge forms in stack config\n- Support dotenv `!include` in `atmos.yaml` `env`, including merge sequences for layered dotenv files\n- Preserve `!include.raw` behavior for raw file contents\n- Keep `.envrc` and `foo.env.local` unsupported/raw; Atmos does not auto-load or execute dotenv files\n- Preserve YAML custom tags during schema validation so `env: !include .env` satisfies stack manifest schema rules\n- Update the stack manifest JSON schema description for `env` to document the `!include` string form\n- Document dotenv includes in both CLI `env` and stack `env` docs, including YAML merge-key behavior, include path resolution, and layered files\n- Add a short blog post for explicit dotenv inclusion\n- Add a roadmap milestone entry for the shipped dotenv `!include` support\n- Add coverage-focused tests for dotenv merge-key retry handling, include path helpers, case-preservation helpers, and YAML custom-tag conversion\n- Harden the LocalStack demo provider config to use the local edge endpoint directly, path-style S3, and skip AWS account-ID discovery so Terraform does not hang before reaching LocalStack in CI\n\n## Tests\n\n- `cd examples/demo-localstack && ATMOS_IDENTITY=false go run ../.. describe component demo -s dev --format json --logs-level Off | jq '.providers.aws'`\n- `cd examples/demo-localstack && ATMOS_IDENTITY=false go run ../.. validate stacks --logs-level Off`\n- `go test ./pkg/config ./pkg/validator ./pkg/filetype`\n- `go test ./internal/exec -run 'TestGenerateProviderOverrides|TestGenerateProviderOverridesForAliases|TestProcessStackConfigProviderSection'`\n- `go test ./pkg/config ./pkg/validator -coverprofile=.context/dotenv-include-coverage.out`\n- `go test ./pkg/utils -run 'TestInclude(Dotenv|ExtensionBased|RawFunction|WithNoExtension)'`\n- `node -e \"import('./website/src/data/roadmap.js').then(() => console.log('roadmap import ok'))\"`\n- `git diff --check`\n- Real stack manifest schema regression: `env: !include .env` validates against `tests/fixtures/schemas/atmos/atmos-manifest/1.0/atmos-manifest.json`\n- Commit hooks passed: go-fumpt, Go build, go mod tidy, golangci-lint, whitespace/EOF/large-file checks\n\nCloses DEV-2990\n\n</details>\n\n<details>\n  <summary>feat(ci): GitHub Actions build cache (atmos ci cache) @osterman (#2579)</summary>\n## what\n\n- Add a **CI build cache** that restores the well-known Atmos cache root (`~/.cache/atmos` — toolchain binaries, vendored components, remote import clones, provider/plugin caches) at startup and saves it at exit, using the same store `actions/cache` uses (GitHub Actions **Cache Service v2**).\n- New `atmos ci cache` subcommands: `restore`, `save`, `list`, `delete` — so the lifecycle can run in one invocation or be spread across CI steps.\n- New `ci.cache` configuration block (`enabled`, `auto: off|restore|save|both`, `root`, `paths`, `key`, `restore_keys`, `compression`) with `ATMOS_CI_CACHE_*` env overrides.\n- Model it as a CI-provider **capability** (`provider.CacheProvider` + `ci.DetectCache()`) with a backend registry (`pkg/ci/cache`) and a GitHub Actions implementation (`pkg/ci/cache/github`), mirroring the existing artifact subsystem; outside a runner it's a clean no-op.\n- Consolidate the default toolchain install path under the XDG **cache** root (`~/.cache/atmos/toolchain`) so a single cache captures it; add a PRD, command/config docs, blog post, and roadmap entry.\n\n## why\n\n- In CI, every job re-downloads the toolchain, providers, and modules from upstream — wasting time/bandwidth and exposing runs to transient and rate-limit failures. Persisting the cache root across jobs makes executions faster, more reliable, and reduces supply-chain exposure.\n- Teams otherwise hand-wire an `actions/cache` step and own the `key`/`path` logic themselves; Atmos already knows its cache root and can derive a stable key from `toolchain.lock.yaml` + OS/arch, so it's two settings to enable.\n- Cache entries are write-once; a per-run state marker makes automatic and manual usage idempotent (an exact-key hit on restore skips the save), so the same operations work whether triggered automatically or via the subcommands.\n\n## references\n\n- PRD: `docs/prd/native-ci/framework/ci-cache.md`\n- Docs: `/cli/commands/ci/cache` and `/cli/configuration/ci/cache`\n- GitHub Actions Cache Service v2 (the store `actions/cache` uses)\n\n\n<!-- This is an auto-generated comment: release notes by coderabbit.ai -->\n## Summary by CodeRabbit\n\n* **New Features**\n  * Added native CI build caching: `atmos ci cache` group with `paths`, `restore`, `save`, `list`, and `delete`, including GitHub Actions-backed caching, admin list/delete, and template-based key/restore-key generation.\n  * Automatic restore-on-start and save-on-exit when enabled and cache-capable; provider capability is respected outside supported CI.\n* **Documentation**\n  * New/updated docs for CLI commands, `ci.cache` configuration, PRD/blog, and supporting GitHub Actions.\n* **Tests**\n  * Expanded unit/integration coverage for archive safety, key/config resolution, backend behavior, manager lifecycle, and CLI output.\n* **Chores**\n  * Updated acceptance caching, snapshots/docs, and aligned toolchain default install path with XDG cache.\n<!-- end of auto-generated comment: release notes by coderabbit.ai -->\n</details>\n\n\n## 🚀 Enhancements\n\n<details>\n  <summary>fix(flags): scope --skip-hooks to the terraform command subtree @osterman (#2578)</summary>\n## what\n\n- **Scope `--skip-hooks` to the terraform command subtree.** The flag (and `ATMOS_SKIP_HOOKS`) moved off the global flag set onto `atmos terraform` and its subcommands, so it no longer appears in the help of unrelated commands (`auth`, `helmfile`, `atlantis`, `toolchain`, `about`, `secret`, …). Lifecycle hooks only ever run on `terraform plan/apply/deploy`.\n- **Stop tracking native-ci CI scratch output.** `tests/fixtures/scenarios/native-ci/{github-output,github-step-summary}.txt` are runtime artifacts; gitignored and untracked (matching the newer `native-ci-gha-plan` scenario).\n- **Standardize the CLI test suite on OpenTofu.** The suite forces `ATMOS_COMPONENTS_TERRAFORM_COMMAND=tofu` via a single test-harness default, gates every binary-invoking test on a precondition so a missing binary skips cleanly (instead of baking \"executable file not found\" into goldens), and sanitizes the harness-injected env var out of debug snapshots. A small parity set (`terraform -help/-version passthrough`) opts back into terraform.\n- **Provision test tooling via the Atmos toolchain (dogfooding).** `TestMain` installs any missing pinned binary (terraform/tofu/packer/helmfile/helm) through the Atmos toolchain itself and prepends it to `PATH` — \"install as necessary\", so CI (which supplies them via `setup-*` actions) downloads nothing while local runs become self-contained. No host binaries (brew, etc.) required.\n\n## why\n\n- `--skip-hooks` on every command was misleading — hooks only run on terraform. Mirrors the existing `--github-token`/toolchain scoping precedent.\n- The native-ci scratch files were tracked, so every local run without terraform dirtied them. They're CI artifacts, not fixtures.\n- Test runs depended on whatever terraform/tofu binary was on the host; a missing binary silently corrupted golden snapshots and tracked fixtures. Standardizing on a single, license-clean (MPL) OpenTofu — with explicit preconditions — makes the suite deterministic and host-independent. The product runtime default stays `terraform`; only tests change.\n- Provisioning tools through the toolchain dogfoods the feature and removes the dependency on host-installed binaries, so the suite runs the same way everywhere.\n\n## references\n\n- Follows the `--github-token`/toolchain flag-scoping precedent in `pkg/flags/global_builder.go`.\n\n\n<!-- This is an auto-generated comment: release notes by coderabbit.ai -->\n## Summary by CodeRabbit\n\n* **New Features**\n  * Added `--skill` flag for AI context features across CLI commands (requires `--ai`).\n\n* **Changes**\n  * Moved `--skip-hooks` from global flags to the `atmos terraform` command flags.\n  * `--skip-hooks` applies to Terraform subcommands (plan/apply/deploy) and supports both no-value usage and comma-separated hook-name selection.\n\n* **Documentation**\n  * Added/updated `--skip-hooks` documentation under Terraform command usage.\n  * Removed `--skip-hooks` and `ATMOS_SKIP_HOOKS` from core global flag/environment variable references; updated hooks documentation accordingly.\n<!-- end of auto-generated comment: release notes by coderabbit.ai -->\n</details>\n\n<details>\n  <summary>fix(toolchain): retry cosign verification on transport-level network errors @osterman (#2604)</summary>\n## what\n\n- Add a `transportFlakeMarkers` allowlist to the cosign retry classifier (`pkg/toolchain/verification/signature_rekor.go`) so transport-level network errors are retried like other transient Sigstore Rekor flakes:\n  - `stream error: stream ID` (Go `net/http2` stream errors — covers all HTTP/2 error codes and both send/recv variants)\n  - `connection reset by peer`\n  - `TLS handshake timeout`\n  - `i/o timeout`\n  - `unexpected EOF`\n- Extend `TestClassifyCosignError` with the exact error observed in CI plus one case per new marker, and add `TestRunCosignWithRetry_RecoversFromTransportFlake` covering end-to-end retry recovery.\n\n## why\n\nCI failed on `TestToolchainCustomCommands_InstallAllTools/Install_tofu` while `toolchain install opentofu/opentofu@1.9.0` was verifying the download signature. Cosign's query to the Sigstore Rekor transparency log died with:\n\n```\nsearching log query: stream error: stream ID 1; INTERNAL_ERROR; received from peer\n```\n\nAtmos already retries cosign flakes (`runCosignWithRetry`, 5 attempts with exponential backoff), but the retryable classification is a deliberate allowlist that only recognized Rekor *HTTP response* flakes (`searchLogQueryBadRequest`, the `IEEE_P1363` decode error, and 5xx scoped to the tlog retrieve endpoint). An HTTP/2 transport error matched none of the markers, so it surfaced on the first attempt with no retry.\n\nBroadening to transport-level failures is safe within the allowlist's design rule: the allowlist exists so a real signature verdict (tampering, identity mismatch, expired cert) is never silently retried away. A transport failure means the request never completed and no verdict was rendered, so retrying it categorically cannot mask tampering. Existing negative tests (tampered artifact, identity mismatch, generic failure) continue to assert those still fail on the first attempt.\n\n## references\n\n- Observed failure: Acceptance Tests (linux), `TestToolchainCustomCommands_InstallAllTools/Install_tofu`\n\n\n<!-- This is an auto-generated comment: release notes by coderabbit.ai -->\n## Summary by CodeRabbit\n\n* **Bug Fixes**\n  * Signature verification now automatically retries on transient network/transport failures (e.g., HTTP/2 stream errors, connection resets, TLS handshake/timeouts, I/O timeouts, unexpected EOF), improving reliability during temporary infrastructure disruptions.\n* **Tests**\n  * Added tests that validate retry behavior and recovery from transport-layer flakes.\n<!-- end of auto-generated comment: release notes by coderabbit.ai -->\n</details>\n","mentions_count":1},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/338810366","assets_url":"https://api.github.com/repos/cloudposse/atmos/releases/338810366/assets","upload_url":"https://uploads.github.com/repos/cloudposse/atmos/releases/338810366/assets{?name,label}","html_url":"https://github.com/cloudposse/atmos/releases/tag/v1.221.1","id":338810366,"author":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"node_id":"RE_kwDOEW4XoM4UMdX-","tag_name":"v1.221.1","target_commitish":"main","name":"v1.221.1","draft":false,"immutable":false,"prerelease":false,"created_at":"2026-06-12T20:22:38Z","updated_at":"2026-06-12T21:20:51Z","published_at":"2026-06-12T21:20:51Z","assets":[{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/446053761","id":446053761,"node_id":"RA_kwDOEW4XoM4alj2B","name":"atmos_1.221.1_darwin_amd64","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":220002208,"digest":"sha256:862510d45eca3d8b23798ca8d8eba6f83d232d9fd572e760dc960d1266d4cd9b","download_count":19,"created_at":"2026-06-12T21:12:39Z","updated_at":"2026-06-12T21:12:48Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.221.1/atmos_1.221.1_darwin_amd64"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/446053842","id":446053842,"node_id":"RA_kwDOEW4XoM4alj3S","name":"atmos_1.221.1_darwin_arm64","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":206025810,"digest":"sha256:04541a77f72a85c84acf776681c409a2d1f62d6e51165cab36fabe9bf89fc4a5","download_count":90,"created_at":"2026-06-12T21:12:48Z","updated_at":"2026-06-12T21:12:58Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.221.1/atmos_1.221.1_darwin_arm64"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/446053848","id":446053848,"node_id":"RA_kwDOEW4XoM4alj3Y","name":"atmos_1.221.1_freebsd_amd64","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":214204588,"digest":"sha256:f93c3e3d51c664f22cd3b15d92ad7f4032ee85e5811b74a39c18f8272180f939","download_count":1,"created_at":"2026-06-12T21:12:49Z","updated_at":"2026-06-12T21:12:59Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.221.1/atmos_1.221.1_freebsd_amd64"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/446053942","id":446053942,"node_id":"RA_kwDOEW4XoM4alj42","name":"atmos_1.221.1_freebsd_arm64","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":198705324,"digest":"sha256:ee540b21d77606468dd951b03a2109928602a7633d186ecb4ef73012e2514374","download_count":1,"created_at":"2026-06-12T21:12:58Z","updated_at":"2026-06-12T21:13:05Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.221.1/atmos_1.221.1_freebsd_arm64"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/446053762","id":446053762,"node_id":"RA_kwDOEW4XoM4alj2C","name":"atmos_1.221.1_linux_386","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":199942306,"digest":"sha256:e5a2ef346702a40a37178db83fb660b68a03c1ede524b0c31fc4490d55bd9938","download_count":2,"created_at":"2026-06-12T21:12:39Z","updated_at":"2026-06-12T21:12:48Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.221.1/atmos_1.221.1_linux_386"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/446053840","id":446053840,"node_id":"RA_kwDOEW4XoM4alj3Q","name":"atmos_1.221.1_linux_amd64","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":215019682,"digest":"sha256:cfccf964ec748f72e840c1facef3901f7f536f66728d3b36e8e070674d5b4635","download_count":21969,"created_at":"2026-06-12T21:12:48Z","updated_at":"2026-06-12T21:12:58Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.221.1/atmos_1.221.1_linux_amd64"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/446053953","id":446053953,"node_id":"RA_kwDOEW4XoM4alj5B","name":"atmos_1.221.1_linux_arm","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":200016034,"digest":"sha256:917c780f12777ae3bb99f598c5c246afcaff66be2deeec8214b597f592c182f5","download_count":1,"created_at":"2026-06-12T21:13:00Z","updated_at":"2026-06-12T21:13:06Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.221.1/atmos_1.221.1_linux_arm"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/446053763","id":446053763,"node_id":"RA_kwDOEW4XoM4alj2D","name":"atmos_1.221.1_linux_arm64","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":199491746,"digest":"sha256:5a76968de2f947943d14d4cfaff12f1b78f856a2a251e6fe71d37c4306f5de6c","download_count":1831,"created_at":"2026-06-12T21:12:39Z","updated_at":"2026-06-12T21:12:48Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.221.1/atmos_1.221.1_linux_arm64"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/446053967","id":446053967,"node_id":"RA_kwDOEW4XoM4alj5P","name":"atmos_1.221.1_SHA256SUMS","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":1030,"digest":"sha256:1d45ba95945c7a8f69994e02581b85c73c62d1f8aa948685431865fd332d4c12","download_count":954,"created_at":"2026-06-12T21:13:01Z","updated_at":"2026-06-12T21:13:01Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.221.1/atmos_1.221.1_SHA256SUMS"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/446053760","id":446053760,"node_id":"RA_kwDOEW4XoM4alj2A","name":"atmos_1.221.1_windows_386.exe","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/x-ms-dos-executable","state":"uploaded","size":204290048,"digest":"sha256:df4eb37e4d1a10ebd882680ac8f3114d038496432c0d0609e5199897e55ed26e","download_count":9,"created_at":"2026-06-12T21:12:39Z","updated_at":"2026-06-12T21:12:48Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.221.1/atmos_1.221.1_windows_386.exe"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/446053843","id":446053843,"node_id":"RA_kwDOEW4XoM4alj3T","name":"atmos_1.221.1_windows_amd64.exe","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/x-ms-dos-executable","state":"uploaded","size":218712576,"digest":"sha256:b23dbfa92a686b656ce9eaf66c0346712c6b8df7b47d328b0e017328353101e9","download_count":38,"created_at":"2026-06-12T21:12:48Z","updated_at":"2026-06-12T21:12:59Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.221.1/atmos_1.221.1_windows_amd64.exe"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/446053940","id":446053940,"node_id":"RA_kwDOEW4XoM4alj40","name":"atmos_1.221.1_windows_arm64.exe","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/x-ms-dos-executable","state":"uploaded","size":200844288,"digest":"sha256:d4a4b2b7f50eed62cf4c792c384fc9235951e6cb71a32b6cd2c244ec74cce1a3","download_count":5,"created_at":"2026-06-12T21:12:58Z","updated_at":"2026-06-12T21:13:07Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.221.1/atmos_1.221.1_windows_arm64.exe"}],"tarball_url":"https://api.github.com/repos/cloudposse/atmos/tarball/v1.221.1","zipball_url":"https://api.github.com/repos/cloudposse/atmos/zipball/v1.221.1","body":"<details>\r\n  <summary>feat(ci): migrate demo-localstack to Floci (rename to demo-floci) @osterman (#2599)</summary>\r\n\r\n## what\r\n\r\n- Replace the LocalStack image with **Floci** (`floci/floci:1.5.23`, pinned) for the AWS-emulator demo\r\n- **Rename the example** `examples/demo-localstack` → `examples/demo-floci`, and the CI job `[localstack] demo-localstack` → `[floci] demo-floci`\r\n- Rename all emulator-facing names inside the example: mixin (`stacks/mixins/floci.yaml`), YAML anchor (`&floci_url`), auth identity (`floci-superuser`), custom commands (`atmos floci up|down|restart|reset|status`), compose service/container\r\n- Decouple the `vendor-globs` test from this demo: it vendors `**/demo-localstack/*` **from origin/main at test time**, so a rename would break it in this PR (main has no `demo-floci` yet) and on every unmerged branch afterward. It now targets `examples/demo-helmfile` (identical root file set), keeping it green before and after merge\r\n- Drop LocalStack-specific service-container config Floci doesn't need (`SERVICES`, `DEBUG`, docker.sock mount, 4510-4559 port range — this demo only touches STS/IAM/S3)\r\n- Update devcontainer bootstrap, examples index, and website file-browser plugin references\r\n\r\n## why\r\n\r\nLocalStack EOL'd Community Edition: the OSS repo was archived in March 2026, the unified image now requires an account + auth token, and hosted infrastructure is being dismantled — the `localhost.localstack.cloud` DNS breakage fixed in #2598 was collateral from that wind-down. Staying on the unpatched 2023-era `localstack:1.4.0` image means depending on a dead project whose vendor is actively turning things off.\r\n\r\nFloci is the community's drop-in replacement (MIT, no auth token, same 4566 edge port and credential pattern) and is already used by the Terraform DAG scheduler integration tests (`tests/terraform_floci_dag_test.go`).\r\n\r\n## merge checklist (branch protection)\r\n\r\n`[localstack] demo-localstack` is a **required status check** on `main`. Merge order:\r\n\r\n1. Merge #2598 first (under the current rule)\r\n2. Update the required check on `main`: `[localstack] demo-localstack` → `[floci] demo-floci`\r\n3. Merge this PR\r\n4. Other branches pick everything up by merging `main` (which they already need for the #2598 DNS fix)\r\n\r\n## verification\r\n\r\n- CI: the Floci-backed demo job passed in 1m50s (vs LocalStack's ~3m; Floci's native binary boots in ~26ms vs ~15s)\r\n- Local: full `atmos test` (validate + plan/apply/destroy × 3 stacks) passed against `floci/floci:1.5.23` under podman\r\n- `vendor-globs` CLI test executed for real against remote `main` (not skipped) with the new `demo-helmfile` glob — passed\r\n\r\n## references\r\n\r\n- Stacked on #2598 (localhost endpoint fix — the DNS root-cause fix this builds on)\r\n- LocalStack Community EOL: https://blog.localstack.cloud/the-road-ahead-for-localstack/\r\n- Floci: https://github.com/floci-io/floci\r\n\r\n\r\n<!-- This is an auto-generated comment: release notes by coderabbit.ai -->\r\n## Summary by CodeRabbit\r\n\r\n* **New Features**\r\n  * Added demo-floci example and Atmos CLI commands to manage the Floci emulator (start/stop/restart/reset/status).\r\n\r\n* **Documentation**\r\n  * Updated example READMEs and compose guidance with Floci setup, port/credentials, and Terraform tips.\r\n\r\n* **CI**\r\n  * CI workflows switched demo coverage from LocalStack to Floci.\r\n\r\n* **Tests**\r\n  * Added offline test for demo-floci and updated demo-related test expectations.\r\n\r\n* **Chores**\r\n  * Updated local demo startup script, demo manifests, and website tags to use Floci.\r\n<!-- end of auto-generated comment: release notes by coderabbit.ai -->\r\n</details>\r\n\r\n<details>\r\n  <summary>feat(testing): add pact consumer contracts for Atmos Pro API @goruha (#2588)</summary>\r\n\r\n## what\r\n\r\n- Add pact consumer contract tests for all 8 Atmos Pro API endpoints in `pkg/pro/`\r\n- Add `github.com/pact-foundation/pact-go/v2` as a dev dependency\r\n- Generate `pacts/atmos-AtmosPro.json` — the consumer contract file checked into version control\r\n- Add a \"Pact Contract Testing\" section to the README with setup and usage instructions\r\n- Add Spec Kit workflow artifacts (`.specify/`, `specs/`) and related Claude skills\r\n\r\n## why\r\n\r\n- Consumer contract tests run the real `AtmosProAPIClient` against a pact mock server, so any change to request/response shapes in `pkg/pro/` is caught locally before it reaches the live Atmos Pro API\r\n- Tests are isolated behind `//go:build pact` and never run in the standard `go test ./...` suite, keeping the default CI pipeline unaffected\r\n- Checking `pacts/atmos-AtmosPro.json` into version control makes API surface drift visible in PR diffs\r\n\r\n## references\r\n\r\n- [Pact Go documentation](https://docs.pact.io/implementation_guides/go/readme)\r\n- Covered endpoints: `UploadAffectedStacks`, `LockStack`, `UnlockStack`, `ExchangeOIDCToken`, `GetGitHubOIDCToken`, `UploadInstances`, `UploadInstanceStatus`, `CreateCommit`\r\n\r\n</details>\r\n\r\n<details>\r\n  <summary>fix(ci): use localhost endpoints in LocalStack demo to avoid DNS hangs @osterman (#2598)</summary>\r\n\r\n## what\r\n\r\n- Switch the `demo-localstack` example's AWS provider endpoints from `https://localhost.localstack.cloud:4566` to `http://localhost:4566`\r\n- Enable `s3_use_path_style: true` so S3 operations don't depend on wildcard `*.localhost.localstack.cloud` DNS/TLS\r\n- Add `skip_requesting_account_id: true` so provider configure doesn't block on identity lookups\r\n- Update the example README to document the settings and the expected \"AWS account ID not found for provider\" warning\r\n\r\n## why\r\n\r\nThe `[localstack] demo-localstack` CI job started hanging until the 20-minute timeout across **all branches** beginning 2026-06-10 ~02:18 UTC, with no corresponding code change (identical commits both passed and failed; the LocalStack image is pinned at `1.4.0` with the same build hash in green and red runs).\r\n\r\nRoot cause: `localhost.localstack.cloud` is a public DNS record hosted by LocalStack that resolves to `127.0.0.1`. After LocalStack EOL'd Community Edition (repo archived March 2026), their DNS zone was restructured on **2026-06-08 18:53 UTC** (SOA serial; the record is now a freshly delegated Route53 subzone). GitHub's Azure runners began intermittently failing to resolve the name ~31h later as resolver caches expired. The Terraform AWS provider treats DNS failure as retryable and backs off past the job timeout — hanging silently before its first API call.\r\n\r\nEvidence:\r\n\r\n- Every failed run hangs at the identical point: after `terraform workspace new dev-demo`, before the provider's first API call. The LocalStack container log shows exactly one completed request (`sts.GetSessionToken => 200` — issued by atmos auth, which uses `http://localhost:4566` and always succeeds). The provider's first call via `localhost.localstack.cloud` never arrives.\r\n- A/B proof: on `osterman/fix-post-merge-sha`, a run with the old endpoints timed out at 13:43 UTC; the identical change in this PR passed at 13:53 UTC (run 27281214186).\r\n\r\nExtending the timeout would not help — the provider's retry backoff exceeds any reasonable limit when DNS is failing.\r\n\r\n## references\r\n\r\n- Failing runs (examples): 27248701025, 27283701712, 27282384395, 27300390150 — all cancelled at the 20-min `[localstack]` job timeout\r\n- Green run with this exact change: 27281214186\r\n- LocalStack Community EOL: https://blog.localstack.cloud/the-road-ahead-for-localstack/ (the DNS zone change itself is unannounced)\r\n\r\n<!-- This is an auto-generated comment: release notes by coderabbit.ai -->\r\n\r\n## Summary by CodeRabbit\r\n\r\n* **Documentation**\r\n  * Updated LocalStack example documentation and configuration for improved CI compatibility, clarifying expected Terraform behavior and configuration settings.\r\n\r\n<!-- end of auto-generated comment: release notes by coderabbit.ai -->\r\n</details>\r\n\r\n\r\n## 🚀 Enhancements\r\n\r\n<details>\r\n  <summary>fix(exec): preserve empty lists as empty (not null) in YAML function processing @AleksandrMatveev (#2603)</summary>\r\n\r\n## what\r\n\r\n- Fix empty-list stack variables (e.g. `attributes: []`) being written as `null` in the generated `*.terraform.tfvars.json`.\r\n- The `[]any` branch of `processNodesWithContext` now seeds its accumulator with `make([]any, 0, len(v))` instead of a nil slice, so empty lists stay empty (non-nil).\r\n- Add a regression test (`TestProcessNodesPreservesEmptyLists`) covering top-level, nested, and `!unset`-emptied lists, asserting they remain non-nil and serialize to JSON `[]` rather than `null`.\r\n\r\n## why\r\n\r\n- An empty list collapsed to a nil slice during YAML-function processing. A nil slice renders as `[]` in YAML (so `atmos describe` looked correct) but marshals to `null` in JSON, so the generated tfvars contained `\"attributes\": null`.\r\n- Terraform/OpenTofu then fails on that value in functions that reject null where a list is expected:\r\n  ```\r\n  Error: Invalid function argument\r\n    while calling concat(seqs...)\r\n    Invalid value for \"seqs\" parameter: argument must not be null.\r\n  ```\r\n- This is a regression introduced when the `!unset` YAML function was added: the slice branch was changed from index-assignment into a pre-sized slice to `append` onto a nil slice, to support dropping items. Bisected to commit `28678366`. The fix keeps the `!unset` skip semantics while restoring non-nil empty-list behavior.\r\n\r\nMinimal repro — stack var `empty_list: []`:\r\n\r\n| | before | after |\r\n|---|---|---|\r\n| `empty_list` in generated tfvars | `null` | `[]` |\r\n| non-empty lists | preserved | preserved |\r\n\r\n## references\r\n\r\n- Regression introduced by the `!unset` YAML function feature (commit `28678366`)\r\n\r\n<!-- This is an auto-generated comment: release notes by coderabbit.ai -->\r\n## Summary by CodeRabbit\r\n\r\n* **Bug Fixes**\r\n  * Empty lists are now preserved and serialized as JSON arrays ([]) rather than null across top-level, nested, and unset-cleared lists.\r\n\r\n* **Tests**\r\n  * Added a regression test to verify empty-list preservation and updated CLI snapshot expectations to use empty arrays instead of null.\r\n<!-- end of auto-generated comment: release notes by coderabbit.ai -->\r\n</details>\r\n\r\n<details>\r\n  <summary>Fix optional toolchain signature 404 handling @osterman (#2601)</summary>\r\n\r\n## what\r\n\r\n- Treat missing toolchain signature and attestation evidence as skipped under `signatures: when_available` instead of failing installs.\r\n- Pre-download remote SLSA and Minisign sidecars so missing files follow the same optional policy as other signature evidence.\r\n- Add regression coverage for the tflint GitHub attestation 404 case, required-mode failures, missing SLSA/Minisign/Cosign evidence, and invalid signature failures.\r\n\r\n## why\r\n\r\n- Keeps package verification non-breaking by default while still failing when available evidence does not validate.\r\n- Fixes installs like `terraform-linters/tflint`, where `gh attestation verify` can return HTTP 404 because no attestation exists even though checksum verification can pass.\r\n- Preserves strict behavior for `signatures: required`.\r\n\r\n## references\r\n\r\n- Reported from a `terraform-linters/tflint` install on Atmos 1.220.0 where `gh attestation verify` returned HTTP 404 for missing attestations.\r\n\r\n<!-- This is an auto-generated comment: release notes by coderabbit.ai -->\r\n## Summary by CodeRabbit\r\n\r\n* **New Features**\r\n  * Fetch remote signature sidecars automatically with temporary storage and cleanup.\r\n  * Treat certain transient attestation service stream errors as retryable.\r\n\r\n* **Bug Fixes**\r\n  * Better handling of missing or unavailable signature/provenance/attestation evidence — mark as skipped when optional, fail when required.\r\n  * More consistent enforcement across verification paths.\r\n\r\n* **Tests**\r\n  * Added tests covering skip vs. required behaviors and retry classification.\r\n<!-- end of auto-generated comment: release notes by coderabbit.ai -->\r\n</details>\r\n\r\n<details>\r\n  <summary>fix(ansible): forward `-- <args>` passthrough to ansible-playbook @mtb-xt (#2594)</summary>\r\n\r\n## what\r\n\r\n- Fix `atmos ansible playbook <component> -s <stack> -- <ansible-args>` failing with a misleading `Unknown command \\`<component>\\`` error.\r\n- `playbookCmd` now uses a separator-aware argument validator instead of `cobra.ExactArgs(1)`: it requires exactly one positional component, counting only the arguments **before** a `--` separator.\r\n- Adds regression tests for the `--` passthrough path.\r\n\r\n## why\r\n\r\n- `cobra.ExactArgs(1)` counts every positional argument, including the ansible-playbook passthrough tokens captured after `--`. Any invocation using `--` (e.g. `-- --check`, `-- --tags web`, `-- --limit host`) therefore tripped argument validation with 2+ \"positional\" args, and the root `UsageFunc` rendered that failure as an `Unknown command` error naming the component.\r\n- This made it impossible to forward native `ansible-playbook` flags, even though the command help documents `[options]` and points at the ansible-playbook CLI docs, and the executor (`buildCommandArgs`) already appends `info.AdditionalArgsAndFlags` to the command.\r\n- `cobra.ArgsLenAtDash()` returns `-1` when no `--` is present, so the validator still checks the full slice for the common case and keeps the original \"exactly one component\" contract.\r\n\r\n### Before\r\n\r\n```console\r\n$ atmos ansible playbook myapp -s prod -- --check\r\nError: Unknown command `myapp` for `atmos ansible playbook`\r\n```\r\n\r\n### After\r\n\r\n```console\r\n$ atmos ansible playbook myapp -s prod --dry-run -- --check\r\nansible-playbook --extra-vars @/.../prod-myapp.ansible.vars.yaml -i inventory/hosts.yml --check playbook.yml\r\n```\r\n\r\n## references\r\n\r\n- No existing issue; reproducible on every release that ships `atmos ansible playbook` (verified on v1.220.0).\r\n- Ansible check mode and other passthrough flags: https://docs.ansible.com/ansible/latest/cli/ansible-playbook.html\r\n\r\n\r\n<!-- This is an auto-generated comment: release notes by coderabbit.ai -->\r\n## Summary by CodeRabbit\r\n\r\n* **New Features**\r\n  * Forward additional args after `--` verbatim to the underlying playbook command; positional validation ignores these passthrough args.\r\n\r\n* **Bug Fixes**\r\n  * Require exactly one component before `--` and return clear validation errors when missing or duplicated.\r\n\r\n* **Tests**\r\n  * Added comprehensive tests for separator-aware parsing, validation, and passthrough behavior, including prompt-aware validation scenarios.\r\n<!-- end of auto-generated comment: release notes by coderabbit.ai -->\r\n</details>\r\n","mentions_count":4},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/336948167","assets_url":"https://api.github.com/repos/cloudposse/atmos/releases/336948167/assets","upload_url":"https://uploads.github.com/repos/cloudposse/atmos/releases/336948167/assets{?name,label}","html_url":"https://github.com/cloudposse/atmos/releases/tag/v1.221.0","id":336948167,"author":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"node_id":"RE_kwDOEW4XoM4UFWvH","tag_name":"v1.221.0","target_commitish":"main","name":"v1.221.0","draft":false,"immutable":false,"prerelease":false,"created_at":"2026-06-10T14:33:04Z","updated_at":"2026-06-10T18:40:26Z","published_at":"2026-06-10T18:40:26Z","assets":[{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/443216751","id":443216751,"node_id":"RA_kwDOEW4XoM4aavNv","name":"atmos_1.221.0_darwin_amd64","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":219919344,"digest":"sha256:48d3649ea1aa3b20aab2a6e504c9532bd0017cfdcefae53e8a202c51d13eba88","download_count":7,"created_at":"2026-06-10T00:36:45Z","updated_at":"2026-06-10T00:36:51Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.221.0/atmos_1.221.0_darwin_amd64"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/443216767","id":443216767,"node_id":"RA_kwDOEW4XoM4aavN_","name":"atmos_1.221.0_darwin_arm64","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":205925794,"digest":"sha256:61a2d9d38c6558127d549b2d0ee3cf3059d7b560b5cca98d4fb34583f53107a9","download_count":36,"created_at":"2026-06-10T00:36:46Z","updated_at":"2026-06-10T00:36:53Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.221.0/atmos_1.221.0_darwin_arm64"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/443216824","id":443216824,"node_id":"RA_kwDOEW4XoM4aavO4","name":"atmos_1.221.0_freebsd_amd64","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":214122668,"digest":"sha256:ffdc3050c4f8f4e858c6d67cc106774df246de9fe778d986cec35d9d07793077","download_count":1,"created_at":"2026-06-10T00:36:52Z","updated_at":"2026-06-10T00:36:59Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.221.0/atmos_1.221.0_freebsd_amd64"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/443216831","id":443216831,"node_id":"RA_kwDOEW4XoM4aavO_","name":"atmos_1.221.0_freebsd_arm64","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":198574252,"digest":"sha256:1bc862470540274b9d6e745a4bea6bfb72db0849b4e519e432510e79865c833e","download_count":1,"created_at":"2026-06-10T00:36:53Z","updated_at":"2026-06-10T00:36:58Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.221.0/atmos_1.221.0_freebsd_arm64"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/443216749","id":443216749,"node_id":"RA_kwDOEW4XoM4aavNt","name":"atmos_1.221.0_linux_386","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":199864482,"digest":"sha256:5ea285c60fca97ae41cf828f1bb01ec18559d533405206aaf282a5da3fc4ddcd","download_count":2,"created_at":"2026-06-10T00:36:44Z","updated_at":"2026-06-10T00:36:50Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.221.0/atmos_1.221.0_linux_386"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/443216753","id":443216753,"node_id":"RA_kwDOEW4XoM4aavNx","name":"atmos_1.221.0_linux_amd64","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":214937762,"digest":"sha256:ec6a3ce207083006e68ab1cd08faaa4c8f33d4920c9d47fb51341b056a9512eb","download_count":3706,"created_at":"2026-06-10T00:36:45Z","updated_at":"2026-06-10T00:36:53Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.221.0/atmos_1.221.0_linux_amd64"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/443216673","id":443216673,"node_id":"RA_kwDOEW4XoM4aavMh","name":"atmos_1.221.0_linux_arm","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":200016034,"digest":"sha256:afec189d7910c2990539759eca3175ce92708ed10b901439fae1b52c2d252efb","download_count":1,"created_at":"2026-06-10T00:36:38Z","updated_at":"2026-06-10T00:36:46Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.221.0/atmos_1.221.0_linux_arm"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/443216672","id":443216672,"node_id":"RA_kwDOEW4XoM4aavMg","name":"atmos_1.221.0_linux_arm64","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":199360674,"digest":"sha256:fa889425dc4102692ea41e48c88ed5c69b6c8bf185c8ab15762708a9080a1c37","download_count":425,"created_at":"2026-06-10T00:36:38Z","updated_at":"2026-06-10T00:36:44Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.221.0/atmos_1.221.0_linux_arm64"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/443216834","id":443216834,"node_id":"RA_kwDOEW4XoM4aavPC","name":"atmos_1.221.0_SHA256SUMS","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":1030,"digest":"sha256:0b22a11894656b7256f1d9aec838058e1ef630d5869f0941a92ae24c3359de25","download_count":53,"created_at":"2026-06-10T00:36:54Z","updated_at":"2026-06-10T00:36:54Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.221.0/atmos_1.221.0_SHA256SUMS"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/443216671","id":443216671,"node_id":"RA_kwDOEW4XoM4aavMf","name":"atmos_1.221.0_windows_386.exe","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/x-ms-dos-executable","state":"uploaded","size":204210176,"digest":"sha256:47fab08a2039e78772a680e30ad115566885dc61aeb373036f067a1f9cfe6e92","download_count":4,"created_at":"2026-06-10T00:36:38Z","updated_at":"2026-06-10T00:36:44Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.221.0/atmos_1.221.0_windows_386.exe"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/443216818","id":443216818,"node_id":"RA_kwDOEW4XoM4aavOy","name":"atmos_1.221.0_windows_amd64.exe","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/x-ms-dos-executable","state":"uploaded","size":218628096,"digest":"sha256:5f1435debff2e4dd3a1a3f1f721c83297f436fbef7d951b33f1eee91390fd97f","download_count":18,"created_at":"2026-06-10T00:36:51Z","updated_at":"2026-06-10T00:36:57Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.221.0/atmos_1.221.0_windows_amd64.exe"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/443216670","id":443216670,"node_id":"RA_kwDOEW4XoM4aavMe","name":"atmos_1.221.0_windows_arm64.exe","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/x-ms-dos-executable","state":"uploaded","size":200763904,"digest":"sha256:144714c70d8275c39f34a5678999a5e37ced10750cd49a5be41f513c3fca2110","download_count":5,"created_at":"2026-06-10T00:36:38Z","updated_at":"2026-06-10T00:36:44Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.221.0/atmos_1.221.0_windows_arm64.exe"}],"tarball_url":"https://api.github.com/repos/cloudposse/atmos/tarball/v1.221.0","zipball_url":"https://api.github.com/repos/cloudposse/atmos/zipball/v1.221.0","body":"<details>\r\n  <summary>feat: describe affected evaluates all provisioned component sections @osterman (#2573)</summary>\r\n\r\n## what\r\n\r\n- Fix `atmos describe affected` so it detects changes in **every** provisioned component section, not just `vars`/`env`/`settings`/`metadata`/`source`/`provision`.\r\n- Newly evaluated sections: `providers`, `required_providers` (provider versions), `required_version`, `hooks`, `generate`, `backend`, `backend_type`, `remote_state_backend`, `remote_state_backend_type`, `auth`, `command`, and `dependencies` — including scalar sections (previously only map sections were compared).\r\n- Add a configurable `describe.affected.sections` setting in `atmos.yaml` that fully replaces the evaluated set (e.g. to track a custom section or narrow the list); `metadata`/`settings` are always evaluated.\r\n- Refactor the three component processors to a single table-driven comparison, add a documented \"Evaluated sections\" list, tests, a changelog blog post, and a roadmap milestone.\r\n\r\n## why\r\n\r\n- The comparison ran against a hand-maintained allow-list that had drifted out of sync with what Atmos actually merges into a component, so changes to `providers`, `hooks`, provider versions, `backend`, etc. were silently missed — a false negative that could let CI pipelines skip components that genuinely changed.\r\n- The table is now tied (via comments) to the sections written in `stack_processor_merge.go`, and the new config setting gives users an escape hatch so the bug class can't quietly return.\r\n- `locals`, `overrides`, `inheritance`, and `retry` are intentionally excluded (they either fold into other sections or are execution-time only).\r\n\r\n## references\r\n\r\n- Docs: [Evaluated sections](https://atmos.tools/cli/commands/describe/affected#evaluated-sections) and [`describe.affected.sections`](https://atmos.tools/cli/configuration/describe)\r\n\r\n\r\n<!-- This is an auto-generated comment: release notes by coderabbit.ai -->\r\n## Summary by CodeRabbit\r\n\r\n* **New Features**\r\n  * Describe now evaluates and reports changes across a comprehensive set of top-level component sections (including scalar sections) with per-section reasons; first changed section becomes the headline reason.\r\n  * Added configurable describe.affected.sections to fully replace the default evaluated set (metadata/settings remain always evaluated).\r\n\r\n* **Documentation**\r\n  * Blog and CLI/config docs updated with evaluated-sections details, output reason entries, and configuration examples.\r\n\r\n* **Tests**\r\n  * Added tests for section evaluation, equality behavior, remote-locator logic, and override/no-false-positive cases.\r\n\r\n* **Chores**\r\n  * Updated snapshots, roadmap, CI workflow pins, link-checker exclusions, and changelog guidance.\r\n<!-- end of auto-generated comment: release notes by coderabbit.ai -->\r\n</details>\r\n\r\n<details>\r\n  <summary>feat(hooks): terraform init lifecycle hooks + --skip-hooks before-* fix @osterman (#2574)</summary>\r\n\r\n## what\r\n\r\n- **Fix `--skip-hooks` for before-* hooks.** Previously it only skipped `after-*` hooks; `before-terraform-plan/apply/deploy` hooks ran regardless. Now `--skip-hooks` (skip all) and `--skip-hooks=name1,name2` (skip by name) are honored symmetrically for before and after events.\r\n- **Add `before-terraform-init` and `after-terraform-init` lifecycle hooks** for the `atmos terraform init` command. `after-terraform-init` is new; `before-terraform-init` was documented but never dispatched to user hooks — now it fires. They run through the same `runHooks`/`RunAll` path, so the skip fix applies to them too.\r\n- Add tests (real parsed Cobra flag, not `viper.Set`), strengthen hook-inheritance coverage with a fixture proving top-level `terraform.hooks:` is inherited by every component (and `components.terraform.hooks:` is not), update the Hooks docs, blog post, and roadmap.\r\n\r\n## why\r\n\r\n- `--skip-hooks` is a global flag bound to Viper inside `RunE`, but before-* hooks run earlier in `PreRunE` — so `viper.GetString(\"skip-hooks\")` never saw the CLI value and before-hooks fired anyway. The flag is now resolved directly from the parsed command (Viper/`ATMOS_SKIP_HOOKS` fallback), mirroring how `--ci` and `--verbose` are read in `PreRunE`.\r\n- Init had no user-hook surface at all: `init.go` wired no hooks and the `BeforeTerraformInit` event was never dispatched. Wiring `PreRunE`/`PostRunE` on the init command (like plan/apply/deploy) closes the lifecycle gap so teams can validate tooling, vendor sources, or notify systems around `terraform init` declaratively.\r\n- The previous skip tests injected via `viper.Set` with a `nil` command, sidestepping the exact flag-binding lifecycle that was broken — which is how the bug shipped; the new tests fail against the old implementation.\r\n\r\n## references\r\n\r\n- Hooks documentation: `/stacks/hooks`\r\n- Note: `before-/after-terraform-init` fire on the explicit `atmos terraform init`, not the implicit init that plan/apply run.\r\n\r\n\r\n<!-- This is an auto-generated comment: release notes by coderabbit.ai -->\r\n## Summary by CodeRabbit\r\n\r\n* **New Features**\r\n  * Added Terraform init lifecycle event: after-terraform-init (alongside before-terraform-init); Terraform-scoped default hooks can be inherited by Terraform components.\r\n* **Bug Fixes**\r\n  * Fixed --skip-hooks precedence so CLI flag reliably overrides env/config and consistently skips before/after hook phases.\r\n  * Clarified hook scope handling so misplaced hook keys aren’t incorrectly applied.\r\n* **Documentation**\r\n  * Blog, docs, and roadmap updated to describe init hook events and skip-hooks behavior.\r\n* **Tests**\r\n  * Expanded coverage for hook inheritance, scope, init wiring, event filtering, and skip-hooks CLI behavior.\r\n* **Chores**\r\n  * CI Codecov step made non-fatal for transient upload errors.\r\n<!-- end of auto-generated comment: release notes by coderabbit.ai -->\r\n</details>\r\n\r\n<details>\r\n  <summary>feat(auth): share single OIDC session across aws/iam-identity-center providers @Benbentwo (#2553)</summary>\r\n\r\n## what\r\n\r\n- Refactors the `aws/iam-identity-center` (AWS SSO) provider so that multiple providers pointing at the same SSO portal (identical `start_url` + `region`) share a single OIDC token — one browser flow now unlocks every provider instead of one flow per provider.\r\n- Adds silent refresh-token renewal via `ssooidc:CreateToken` with `grant_type=refresh_token`, so a single browser interaction holds for the full portal session (~8h) rather than re-prompting every hour.\r\n- Introduces an in-process `sessionTokenStore` (keyed by `sha1(start_url|region)`) with per-session mutexes that single-flight concurrent device-auth flows; re-keys the on-disk cache from `aws-sso/<provider>/token.json` to `aws-sso/sessions/<sha1>.json` in the AWS SDK `ssocreds`-compatible format.\r\n- Adds the design PRD (`docs/prd/aws-sso-session-support.md`), a changelog blog post, and a shipped roadmap milestone under the Unified Authentication initiative.\r\n\r\n## why\r\n\r\n- A common setup has one provider per environment (dev/staging/prod) all backed by the same corporate SSO portal; previously `atmos auth login` launched the browser flow once per provider, contradicting AWS's own \"credentials have been shared successfully\" single-sign-in experience.\r\n- The legacy flow re-ran the full browser interaction on every ~1h access-token expiry and keyed its cache by provider name, so renaming a provider silently invalidated a still-valid token — both are eliminated here with zero `atmos.yaml` config changes.\r\n\r\n## references\r\n\r\n- PRD: `docs/prd/aws-sso-session-support.md`\r\n- AWS CLI token provider docs: https://docs.aws.amazon.com/cli/latest/userguide/sso-configure-profile-token.html\r\n- AWS SDK for Go v2 `ssocreds`: https://pkg.go.dev/github.com/aws/aws-sdk-go-v2/credentials/ssocreds\r\n\r\n\r\n<!-- This is an auto-generated comment: release notes by coderabbit.ai -->\r\n## Summary by CodeRabbit\r\n\r\n* **New Features**\r\n  * Shared AWS SSO sessions across providers for the same portal (start URL + region), reducing duplicate logins and browser prompts.\r\n  * Silent refresh via refresh tokens to renew credentials without a browser; per-session locking prevents concurrent device-auth flows.\r\n  * Session-keyed on-disk cache (compatible with AWS SDK patterns); logout clears shared session data; added session telemetry.\r\n\r\n* **Documentation**\r\n  * Product spec and blog post describing session sharing, cache format, refresh behavior, and rollout plan.\r\n\r\n* **Tests**\r\n  * Added/updated tests validating session sharing, cache semantics, isolation, refresh logic, and concurrency.\r\n<!-- end of auto-generated comment: release notes by coderabbit.ai -->\r\n</details>\r\n\r\n<details>\r\n  <summary>feat: implement !append YAML function for list concatenation @osterman (#1513)</summary>\r\n\r\n## what\r\n- Implements the `!append` YAML function that allows fine-grained control over list merging behavior in Atmos stack configurations\r\n- Lists tagged with `!append` will be concatenated with base values instead of replaced\r\n- Adds comprehensive unit tests and integration test fixtures\r\n\r\n## why\r\n- Resolves the ongoing challenge of needing to concatenate lists on a case-by-case basis\r\n- Currently, users have to fall back to using maps instead of lists when they need append behavior\r\n- This is particularly important for fields like `depends_on` where appending is often the desired behavior rather than replacement\r\n- The `!append` tag provides opt-in, per-field control that works alongside the global `list_merge_strategy` setting\r\n\r\n## Key Features\r\n- **Opt-in behavior**: Only lists explicitly tagged with `!append` use append mode\r\n- **Works alongside global settings**: The `!append` tag works independently of the global `list_merge_strategy` setting\r\n- **Nested support**: Works with deeply nested configurations\r\n- **Backward compatible**: No impact on existing configurations without the tag\r\n\r\n## Example Usage\r\n```yaml\r\n# base.yaml\r\ncomponents:\r\n  terraform:\r\n    eks:\r\n      settings:\r\n        depends_on:\r\n          - vpc\r\n          - iam-role\r\n\r\n# override.yaml\r\ncomponents:\r\n  terraform:\r\n    eks:\r\n      settings:\r\n        depends_on: !append  # This tag indicates append mode\r\n          - rds\r\n          - elasticache\r\n          \r\n# Result: depends_on = [vpc, iam-role, rds, elasticache]\r\n```\r\n\r\n## Testing\r\n- ✅ All unit tests pass\r\n- ✅ Build succeeds without errors\r\n- ✅ Linting passes with no issues\r\n- ✅ Code follows Atmos conventions and patterns\r\n\r\n## references\r\n- Linear issue: [DEV-2980](https://linear.app/cloudposse/issue/DEV-2980/implement-append-function)\r\n- Documentation: [`!append` YAML function](https://atmos.tools/functions/yaml/append)\r\n- Changelog: blog post `append-yaml-function`; roadmap milestone updated (Extensibility initiative)\r\n\r\n<!-- This is an auto-generated comment: release notes by coderabbit.ai -->\r\n## Summary by CodeRabbit\r\n\r\n- **New Features**\r\n  - Added a !append YAML function to append items to lists during configuration merging (per-field, preserves order, supports nested lists/maps, interacts with global list-merge strategies).\r\n- **Tests**\r\n  - Added comprehensive unit and integration tests covering append-tag helpers, parsing, merging, and end-to-end scenarios.\r\n- **Documentation**\r\n  - Added docs, examples, blog post, and index updates explaining !append usage and behavior.\r\n- **Chores**\r\n  - Updated website roadmap/metadata and package config; added a sentinel error alias.\r\n<!-- end of auto-generated comment: release notes by coderabbit.ai -->\r\n\r\n</details>\r\n\r\n<details>\r\n  <summary>feat: add !unset YAML function to delete keys from configuration @osterman (#1521)</summary>\r\n\r\n## what\r\n- Add new `!unset` YAML function that completely removes keys from configuration during inheritance and merging\r\n- Implement processing in both stack merging (`yaml_func_utils.go`) and config loading (`process_yaml.go`)\r\n- Add comprehensive unit tests for all functionality\r\n- Create documentation with examples and use cases\r\n- Update YAML functions index documentation\r\n\r\n## why\r\n- Users need a way to explicitly remove inherited configuration values, not just override them with `null`\r\n- Current workarounds require physically removing or commenting out keys in parent configurations\r\n- This addresses GitHub issue #227: \"A YAML way of undefining a value without removing the key\"\r\n- Provides fine-grained control over configuration inheritance in complex stack hierarchies\r\n\r\n## Key Features\r\n- **Complete removal**: Unlike setting to `null`, `!unset` completely removes the key from configuration\r\n- **Inheritance control**: Child configurations can remove values inherited from parents\r\n- **Works everywhere**: Functions in all Atmos configuration sections (vars, settings, env, metadata, etc.)\r\n- **Type-safe**: Operates after YAML parsing, ensuring no syntax breakage\r\n- **Respects skip list**: Can be disabled via skip list if needed\r\n\r\n## Examples\r\n\r\n### Basic Usage\r\n```yaml\r\n# parent.yaml\r\ncomponents:\r\n  terraform:\r\n    vpc:\r\n      vars:\r\n        enable_nat_gateway: true\r\n        enable_vpn_gateway: true\r\n\r\n# child.yaml\r\nimport:\r\n  - parent\r\n\r\ncomponents:\r\n  terraform:\r\n    vpc:\r\n      vars:\r\n        enable_vpn_gateway: !unset  # Completely removes this key\r\n```\r\n\r\n### Removing Nested Values\r\n```yaml\r\nconfig:\r\n  database:\r\n    host: \"prod.db.example.com\"\r\n    backup_enabled: true\r\n\r\n# Override:\r\nconfig:\r\n  database:\r\n    backup_enabled: !unset  # Remove backup config\r\n    host: \"dev.db.example.com\"\r\n```\r\n\r\n## Testing\r\nAll tests pass:\r\n- ✅ Unit tests for config processing\r\n- ✅ Unit tests for stack processing\r\n- ✅ Integration tests with other YAML functions\r\n- ✅ Skip list functionality tests\r\n- ✅ Inheritance scenario tests\r\n\r\n## references\r\n- Closes #227\r\n- Related to #267 (YAML Explicit Typing support)\r\n\r\n<!-- This is an auto-generated comment: release notes by coderabbit.ai -->\r\n\r\n## Summary by CodeRabbit\r\n\r\n* **New Features**\r\n  * Added a YAML !unset function to remove keys or list items during config processing and inheritance. Works at any depth, supports multiple unsets, and coexists with other YAML functions.\r\n* **Tests**\r\n  * Introduced comprehensive tests covering flat and nested structures, arrays, multiple/nested unsets, inheritance scenarios, and edge cases.\r\n* **Documentation**\r\n  * Added dedicated docs and examples for !unset, including usage in stack manifests, nested removals, list handling, and guidance on expected behavior.\r\n\r\n<!-- end of auto-generated comment: release notes by coderabbit.ai -->\r\n</details>\r\n\r\n<details>\r\n  <summary>feat(imports): cache remote stack-import clones (dedup + opt-in TTL) @osterman (#2571)</summary>\r\n\r\n## what\r\n\r\n- Clone each remote (Git) stack-import **source repository at most once per Atmos invocation** instead of once per import — all subdir imports of the same repo now resolve from a single shared clone (within-run dedup, spanning both `describe affected` passes).\r\n- Add an opt-in **`ttl`** to reuse the cloned source **across runs** until it expires: per-import (`ttl:` in the import map form) and a global `imports.ttl` default in `atmos.yaml`. With no `ttl`, the source refreshes once per run so mutable refs like `?ref=main` stay fresh.\r\n- Wire the default git-subdir resolve path through the existing `ensureSourceDir`, add per-session fetch tracking + TTL freshness (timestamp persisted in the `.atmos-source-ready` marker), and extract a shared `duration.IsExpired`/`IsZeroTTL` that the source provisioner now reuses.\r\n- Update JSON schemas, add unit tests, document \"Caching Remote Imports\" in `stacks/imports.mdx`, add a changelog blog post, and add a roadmap milestone.\r\n\r\n## why\r\n\r\n- For hub-and-spoke repos pulling a shared catalog via remote imports, `atmos describe affected` was re-cloning the hub repo once per import (~68–87×/run, ~7–11 min total), and a warm `actions/cache` of `~/.cache/atmos/stack-imports/` was ignored because the subdir path re-cloned unconditionally.\r\n- Within-run dedup collapses those clones to one per repo (the ~80% win, no staleness risk); the opt-in `ttl` lets CI reuse the clone across runs (warm cache skips the clone entirely) while keeping mutable refs fresh by default. Shallow clones (`depth=1`) were already in use — the win is not re-cloning the same repo repeatedly.\r\n\r\n## references\r\n\r\n- Cached sources live under the XDG cache dir (`~/.cache/atmos/stack-imports/`, honoring `XDG_CACHE_HOME`).\r\n- Builds on the source-provisioning TTL mechanism (`pkg/duration`, `pkg/provisioner/source`).\r\n- Changelog: `website/blog/2026-06-05-faster-remote-stack-imports.mdx`\r\n\r\n\r\n<!-- This is an auto-generated comment: release notes by coderabbit.ai -->\r\n## Summary by CodeRabbit\r\n\r\n* **New Features**\r\n  * Per-import `ttl` and global `imports.ttl` for optional cross-run caching of remote stack imports.\r\n  * Each unique remote Git source is cloned at most once per invocation and shared across nested imports.\r\n  * Improved cache freshness semantics, including explicit zero-ttl behavior.\r\n\r\n* **Documentation**\r\n  * Added caching guide, TTL examples, XDG cache guidance, and a blog post.\r\n\r\n* **Tests**\r\n  * Added tests for TTL parsing/expiration and remote import caching behavior.\r\n<!-- end of auto-generated comment: release notes by coderabbit.ai -->\r\n</details>\r\n\r\n<details>\r\n  <summary>[codex] consolidate terraform bulk execution on scheduler @shirkevich (#2466)</summary>\r\n\r\n## Summary\r\n\r\n- route Terraform `--all`, `--components`, and `--query` through the scheduler-backed Terraform adapter\r\n- build Terraform dependency graphs from `dependencies.components` first, with `settings.depends_on` fallback\r\n- preserve query-path auth manager setup, store resolver bridging, YAML function processing, and per-component CI hook capture\r\n- includes cloudposse/atmos#2348 identity/auth fixes in this stack so local `--identity terraform` testing works\r\n- include the credential-store concurrency-safety prerequisite discovered by concurrency validation\r\n- keep effective scheduler concurrency fixed at `1` for this PR\r\n\r\n## Stacking\r\n\r\nThis PR is stacked on PR 2 and targets `codex/dag-scheduler-core`.\r\n\r\nPR 4 is #2468 and is stacked on this branch to introduce plan-only `--max-concurrency` wiring.\r\n\r\nSupersedes the earlier fork-headed draft #2462 now that the stack branches exist in `cloudposse/atmos`.\r\n\r\n## Draft note\r\n\r\nThis branch is back to the intended PR 3 review shape: Terraform `--all`, `--components`, and `--query` share the graph-backed scheduler path, but execution remains sequential.\r\n\r\nThe temporary `ATMOS_EXPERIMENTAL_DAG_MAX_CONCURRENCY` validation hook has been removed. User-visible plan concurrency now belongs to PR 4.\r\n\r\nThis branch retains the narrow credential-store concurrency-safety prerequisite discovered during validation:\r\n- credential-store initialization no longer mutates global Viper env bindings per component and preserves `ATMOS_KEYRING_TYPE` precedence\r\n\r\n## Validation\r\n\r\n- `go test ./pkg/scheduler ./pkg/scheduler/adapters ./internal/exec -run TestExecuteTerraformQuery|TestExecuteTerraformQueryNoMatches|TestBuildTerraformDependencyGraph|TestExecuteTerraformAllUsesGraphBackedSequentialOrder|TestExecuteTerraformComponentsUsesGraphBackedSequentialOrder|TestExecuteTerraformQueryUsesGraphBackedSequentialOrder|TestExecuteTerraformKeepsIndependentComponentsSequential|TestBuildTerraformGraph`\r\n- `go test ./pkg/auth/credentials`\r\n- `go test -race ./pkg/auth/credentials -run TestNewCredentialStoreWithConfig_ConcurrentInitialization`\r\n- `go test ./pkg/auth ./internal/exec -run TestCreateAndAuthenticateManagerWithAtmosConfig|TestSetupTerraformAuth|TestProcessComponentConfig_PropagatesAuthManager|TestProcessComponentConfig_AuthManagerGuardBranches`\r\n- built `build/atmos` and live-tested against a downstream stack with `terraform plan --all` and an explicit identity\r\n\r\n## Validation findings carried forward\r\n\r\n- The first concurrency-4 validation run exposed an auth race: per-component credential-store initialization called global `viper.BindEnv`, causing `fatal error: concurrent map writes`. This PR fixes that narrowly in `pkg/auth/credentials`.\r\n- Higher-concurrency validation also showed local Terraform working-directory contention when multiple logical aliases share one physical Terraform component directory. PR 4 keeps path-based locking while introducing plan concurrency.\r\n\r\n## Follow-up discussion\r\n\r\nThe longer-term way to unlock true parallelism for aliases sharing one physical Terraform folder would be per-node isolated workdirs plus isolated `TF_DATA_DIR` and generated files. That needs repo-owner discussion because it changes the operator debugging model: Atmos would need to decide whether and how to retain those per-node copies for inspection, how `atmos terraform shell` maps to them, and how cleanup/debug artifacts are managed.\r\n\r\n\r\n<!-- This is an auto-generated comment: release notes by coderabbit.ai -->\r\n## Summary by CodeRabbit\r\n\r\n* **New Features**\r\n  * Graph-backed Terraform scheduler with deterministic dependency order, reversed destroy order, per-resource serialization, concurrency control, per-component output capture/hooks, and signal-aware cancellation.\r\n  * New Terraform run options: --failure-mode, --max-concurrency, log-order, hide (including no-changes), and execution-summary file.\r\n  * Line-prefixing writer for prefixed log output.\r\n\r\n* **Bug Fixes**\r\n  * Credential keyring type now respects ATMOS_KEYRING_TYPE and is safe for concurrent init.\r\n  * Workdir sync/hash skips Terraform/OpenTofu runtime dirs.\r\n  * More tolerant Git repo opening for worktrees.\r\n\r\n* **Tests**\r\n  * Large expansion of tests covering scheduler behavior, CLI options, concurrency, logging, auth, and new utilities.\r\n<!-- end of auto-generated comment: release notes by coderabbit.ai -->\r\n</details>\r\n\r\n<details>\r\n  <summary>feat: install Atmos from a branch or tag with --use-version=ref:<name> @osterman (#2569)</summary>\r\n\r\n## what\r\n\r\n- Add a `ref:<name>` version spec to `--use-version` (and `version.use` in `atmos.yaml` / `ATMOS_USE_VERSION`) that installs Atmos from the latest commit of a **branch or tag**, e.g. `atmos --use-version=ref:main version`.\r\n- Accepts branch names, tag names, and slash-qualified refs for disambiguation: `ref:main`, `ref:release/v1.199`, `ref:v1.199.0`, `ref:heads/main`, `ref:tags/v1.199.0`.\r\n- Resolves the ref to its full commit SHA via the GitHub API, then reuses the existing `sha:` install/cache path unchanged; ref versions always re-execute and fail hard on resolution errors.\r\n- Docs (`version/use.mdx`), a `minor` blog post, and a roadmap milestone.\r\n\r\n## why\r\n\r\n- Previously `--use-version` only accepted PR numbers (`pr:1234`), commit SHAs (`sha:ceb7526`), and releases — a branch name like `main` was rejected, even though branch/tag pushes already publish the same `build-artifacts-*` from the `Tests` workflow.\r\n- `ref:` lets you pin a moving target once (`ref:main`) instead of chasing a new `sha:` after every merge, making it trivial to test unreleased fixes on a branch.\r\n- The ref is re-resolved on every run so a mutable branch always tracks the latest build, while the SHA-keyed cache avoids reinstalling when the ref hasn't moved. Resolving to the **full** SHA also sidesteps GitHub's `head_sha` filter, which only matches full (not short) SHAs.\r\n\r\n## references\r\n\r\n- Docs: [Version Pinning](https://atmos.tools/cli/configuration/version/use)\r\n- Changelog: `website/blog/2026-06-04-use-version-ref.mdx`\r\n\r\n\r\n<!-- This is an auto-generated comment: release notes by coderabbit.ai -->\r\n## Summary by CodeRabbit\r\n\r\n* **New Features**\r\n  * Support for git branches/tags via --use-version=ref: (resolves refs to commit SHAs and uses existing artifact download/cache).\r\n\r\n* **Behavior Changes**\r\n  * CI artifact selection now prefers the newest workflow run that contains the platform artifact (may pick in-progress or failed runs if they include the artifact).\r\n  * Re-exec/version switching treats ref: like immutable versions (resolve → install/cache).\r\n\r\n* **Bug Fixes**\r\n  * Clearer, user-friendly error when a ref does not exist (with actionable hints).\r\n\r\n* **Documentation**\r\n  * Added CLI docs, blog post, and roadmap entry describing ref: usage and caching.\r\n<!-- end of auto-generated comment: release notes by coderabbit.ai -->\r\n</details>\r\n\r\n<details>\r\n  <summary>feat: Add custom component types for custom commands @osterman (#1904)</summary>\r\n\r\n## Summary\r\n\r\n- Implement shell completion for semantic-typed flags and arguments (component/stack types)\r\n- Add interactive prompting for missing required semantic-typed values\r\n- Support custom component types in shell completions\r\n\r\n## What Changed\r\n\r\n- New custom component type provider system (`pkg/component/custom`)\r\n- Shell completion for semantic-typed arguments and flags in custom commands\r\n- Interactive prompting for missing required semantic-typed values\r\n- Extended command schema to support semantic types and components\r\n- Comprehensive test coverage for completion and prompting functionality\r\n\r\n## Why This Matters\r\n\r\nThis feature enables custom commands to provide superior developer experience through:\r\n- Tab completion for component and stack arguments/flags\r\n- Interactive prompts for required semantic-typed values\r\n- Support for custom component types beyond built-in types\r\n\r\n\r\n## References\r\n- closes #1787 \r\n- closes #444\r\n- closes #438\r\n\r\n<!-- This is an auto-generated comment: release notes by coderabbit.ai -->\r\n## Summary by CodeRabbit\r\n\r\n* **New Features**\r\n  * Custom component types with registry support, CLI integration, and template access to resolved component data.\r\n  * Enhanced CLI semantic completion and interactive prompting for selecting component and stack values.\r\n  * Aggregated component listing across stacks for discovery and completion.\r\n\r\n* **Documentation**\r\n  * New guides, examples, and blog post demonstrating custom component types and workflows.\r\n  * Schema updates to validate custom component manifests.\r\n\r\n* **Tests**\r\n  * Broad test coverage for completion, providers, processing, and stack handling.\r\n<!-- end of auto-generated comment: release notes by coderabbit.ai -->\r\n</details>\r\n\r\n<details>\r\n  <summary>docs(gists): add Atmos + Packer + GitHub Actions AMI pipeline gist @aknysh (#2560)</summary>\r\n\r\n## what\r\n\r\n- Add a new gist at `gists/aws-ami-packer-github-actions/` demonstrating an end-to-end AWS AMI pipeline with **Atmos + Packer + GitHub Actions**:\r\n  - Build a hardened **Amazon Linux 2023** AMI with Packer, orchestrated by Atmos.\r\n  - Validate it on a live test instance, optionally scan it, and gate promotion behind a **manual approval**.\r\n  - Tag the approved image `ScanStatus=approved` and **share it across AWS accounts**.\r\n- Drive the whole build from **stack configuration** (no hardcoded HCL) and operate the result through a tree of `atmos ami` custom commands (get-ami-id, tag, share, launch/terminate test instances, …).\r\n- Include reference **IAM/OIDC** policies and an org **SCP** that enforces \"launch only approved AMIs\".\r\n- Wire the gist into the docs-site file browser (tags + related-docs links) and announce it with a blog post.\r\n\r\n## why\r\n\r\n- \"How do I use Atmos + Packer to build AMIs, and automate the build → approve → share process?\" is a frequent community question. This gist is a vendor-neutral, copy-and-adapt reference recipe that combines several Atmos features into one production-shaped workflow.\r\n- Like all [gists](https://atmos.tools/gists), it's shared as-is (not part of the CI-tested examples), so users adapt it to their environment and Atmos version.\r\n\r\n## references\r\n\r\n- Gist: `gists/aws-ami-packer-github-actions/`\r\n- Blog post: `website/blog/2026-06-01-gist-aws-ami-packer-github-actions.mdx`\r\n\r\n\r\n<!-- This is an auto-generated comment: release notes by coderabbit.ai -->\r\n## Summary by CodeRabbit\r\n\r\n* **New Features**\r\n  * Added a complete gist showing an end-to-end AMI build/validate/approve/share pipeline using Atmos + Packer + GitHub Actions, with reusable setup and tool-install steps, approval gate, optional vulnerability scan, and cross-account sharing.\r\n\r\n* **Documentation**\r\n  * Added detailed README, customization checklist, policy templates, and a blog post documenting setup, governance (OIDC, IAM, SCP), local execution, and cleanup guidance.\r\n<!-- end of auto-generated comment: release notes by coderabbit.ai -->\r\n</details>\r\n\r\n<details>\r\n  <summary>feat: add !git.* repository YAML functions and atmos.Resolve template func @osterman (#2558)</summary>\r\n\r\n## what\r\n\r\n- Add five new `!git.*` YAML functions that expose Git repository metadata from the `origin` remote: `!git.repository` (the `<owner>/<repo>` slug, e.g. `cloudposse/atmos`), `!git.owner`, `!git.name`, `!git.host`, and `!git.url`.\r\n- Add the `atmos.Resolve` template function, which evaluates any Atmos YAML-function string (`!git.*`, `!exec`, `!store`, `!terraform.output`, …) at template-render time so its result can be composed with other strings and template variables in a single value.\r\n- The new YAML functions are parsed generically (GitHub/GitLab/Bitbucket/Azure DevOps), support a fallback value, and work in both stack/component processing and `atmos.yaml` config preprocessing.\r\n- Includes unit tests, per-function docs, two changelog posts, a roadmap update, and a follow-up PRD.\r\n\r\n## why\r\n\r\n- Users needed the repository slug (and its parts) for tagging resources and building backend paths, previously only achievable by shelling out via `!exec echo ${GITHUB_REPOSITORY:-$(git remote get-url origin | sed …)}`.\r\n- A bare YAML tag owns the entire scalar and Atmos renders Go templates *before* YAML functions, so composing a function result with extra text (e.g. prefixing `workspace_key_prefix` with the repo slug) was impossible without `!exec`; `atmos.Resolve` makes that composition native:\r\n  ```yaml\r\n  workspace_key_prefix: '{{ atmos.Resolve .settings.context.repo }}/{{ or .metadata.name .metadata.component }}'\r\n  ```\r\n\r\n## references\r\n\r\n- Extends the existing Git YAML function family from the [Git YAML Functions](https://atmos.tools/changelog/git-yaml-functions) changelog.\r\n- Docs: `/functions/yaml/git.repository`, `/functions/template/atmos.Resolve`.\r\n- Follow-up: `docs/prd/lazy-yaml-function-template-values.md` (lazy-Stringer auto-deref so `{{ .settings.context.repo }}` evaluates without `atmos.Resolve`).\r\n\r\n\r\n<!-- This is an auto-generated comment: release notes by coderabbit.ai -->\r\n## Summary by CodeRabbit\r\n\r\n* **New Features**\r\n  * Added Git repository metadata YAML functions (!git.repository, !git.owner, !git.name, !git.host, !git.url).\r\n  * Added atmos.Resolve template function to evaluate YAML functions during template rendering for inline composition.\r\n\r\n* **Documentation**\r\n  * Added PRD, docs pages, blog posts, and roadmap entries describing the new YAML functions and atmos.Resolve.\r\n\r\n* **Tests**\r\n  * Added tests covering Git YAML tag resolution and the new template Resolve behavior.\r\n\r\n* **Chores**\r\n  * Updated link-checker configuration to exclude slow/intermittent targets.\r\n<!-- end of auto-generated comment: release notes by coderabbit.ai -->\r\n</details>\r\n\r\n<details>\r\n  <summary>feat(stacks): template variables in import paths from earlier imports @osterman (#2554)</summary>\r\n\r\n## what\r\n\r\n- Render Go templates in stack `import:` paths (local paths and a remote import's Git `?ref=`) against the `settings`/`vars`/`env` accumulated from imports listed **earlier** in the same manifest, plus the import's own `context`.\r\n- A single variable (e.g. `settings.context.deployment_repo_version`, set once in a `_defaults`) can now pin both a remote catalog import's ref and the component `source.version`.\r\n- Only the import **path** string is rendered; imported file **content** templating and its deferral are unchanged. Missing values are a hard error (with hints) unless `ignore_missing_template_values` is set; `skip_templates_processing` or a disabled templating engine leaves the path literal.\r\n- Adds the `ErrImportPathTemplate` sentinel, a fixture scenario + unit tests, docs (\"Referencing Earlier Imports in Import Paths\"), a changelog blog post, and a roadmap milestone.\r\n\r\n## why\r\n\r\n- Keep `dev` and `prod` in one repo while isolating prod from dev changes: dev uses local catalogs/sources, prod imports a versioned catalog and pins the component source to an immutable ref — both driven by one variable.\r\n- Previously the component `source.version` template worked (resolved late, at component processing) but the import `?ref=` had to be hard-coded, because imports are resolved before that context exists. This closes that gap so both come from the same variable.\r\n\r\n## references\r\n\r\n- Docs: `/stacks/imports#referencing-earlier-imports-in-import-paths`\r\n- Builds on remote stack imports (#2528) and the git context YAML functions (#2537)\r\n\r\n\r\n<!-- This is an auto-generated comment: release notes by coderabbit.ai -->\r\n## Summary by CodeRabbit\r\n\r\n* **New Features**\r\n  * Import paths now support Go-template rendering, letting paths reference settings, vars, and env from earlier imports in the same manifest.\r\n\r\n* **Bug Fixes**\r\n  * Templating failures in import paths now surface a clear error; options added to ignore or skip unresolved import templates.\r\n\r\n* **Documentation**\r\n  * Added docs and a blog post with examples and operational guidance for templated import paths.\r\n<!-- end of auto-generated comment: release notes by coderabbit.ai -->\r\n</details>\r\n\r\n<details>\r\n  <summary>Add ECR Public authentication: `aws/ecr-public` integration and `atmos aws ecr login --public` @osterman (#2231)</summary>\r\n\r\n## what\r\n\r\nAdd **ECR Public** authentication to Atmos for authenticated access to `public.ecr.aws`, solving Docker rate limiting on public ECR images. Two entry points:\r\n\r\n- **`atmos aws ecr login --public`** — direct, zero-config login using ambient AWS credentials (the AWS SDK default chain: env, shared config/profile, SSO, IMDS/IRSA/ECS), or `--public --identity <name>` to use a specific identity. Ideal for CI.\r\n- **`aws/ecr-public` integration kind** — for automatic login on `atmos auth login` and identity linking.\r\n\r\nKey changes:\r\n- **Command** (`cmd/aws/ecr/login.go`): new `--public` flag on `atmos aws ecr login`; ambient-credential and identity-based ECR Public login paths; mutually exclusive with a positional integration argument and `--registry`.\r\n- **Cloud layer** (`pkg/auth/cloud/aws/ecr_public.go`): `GetPublicAuthorizationToken()` calls `ecrpublic:GetAuthorizationToken`, always in us-east-1.\r\n- **Integration layer** (`pkg/auth/integrations/aws/ecr_public.go`): `ECRPublicIntegration` factory registering the `aws/ecr-public` kind, with region validation at config time. Implements the full `Integration` interface including `Cleanup()` (docker logout) and `Environment()` (`DOCKER_CONFIG`).\r\n- **Region validation**: rejects unsupported regions (only us-east-1 and us-west-2 have service endpoints; auth is us-east-1 only).\r\n- **Tests**: cloud-layer and integration-layer unit tests (token retrieval, region validation, cleanup, error handling) with a generated mock ECR Public client; command tests for the `--public` flag and mode validation.\r\n- **Documentation**: `atmos aws ecr login` command reference (added `--public` flag), ECR authentication tutorial, and a PRD (`docs/prd/ecr-public-authentication.md`).\r\n- **Blog post + roadmap**: announcement and a shipped milestone linking to the changelog.\r\n\r\n> Note: this branch has been merged up to `main`. Following #2144 (`atmos auth ecr-login` → `atmos aws ecr login`), ECR login lives under the `aws` namespace, and the integration was adapted to `main`'s evolved `Integration` interface (exported `BuildAWSConfigFromCreds`, new `Cleanup`/`Environment` methods).\r\n\r\n## why\r\n\r\nDocker pulls from `public.ecr.aws` hit rate limits when unauthenticated. This blocks CI workflows, especially those using `cloudposse/github-action-docker-build-push` which pulls BuildKit/binfmt images on every run. Authenticated pulls have significantly higher (or no) rate limits.\r\n\r\nBecause `public.ecr.aws` is global, **any** valid AWS credentials unlock authenticated pulls — so `--public` with ambient credentials \"just works\" in CI with zero configuration. ECR Public otherwise differs from private ECR: it uses the `ecrpublic` SDK service, a bearer token instead of SigV4, a hardcoded us-east-1 auth region, and a fixed `public.ecr.aws` registry URL. It requires `ecr-public:GetAuthorizationToken` and `sts:GetServiceBearerToken` IAM permissions.\r\n\r\n## references\r\n\r\n- [ECR Public Authentication Tutorial](/tutorials/ecr-authentication) — configuration examples, multi-environment setup.\r\n- [`atmos aws ecr login` Command Reference](/cli/commands/aws/ecr-login) — command usage, `--public` flag, integration configuration.\r\n- [ECR Public Blog Post](website/blog/2026-05-30-ecr-public-authentication.mdx) — announcement and use cases.\r\n- PRD: `docs/prd/ecr-public-authentication.md`.\r\n- AWS Docs: [ECR Public APIs](https://docs.aws.amazon.com/AmazonECR/latest/public/what-is-service.html).\r\n\r\n\r\n<!-- This is an auto-generated comment: release notes by coderabbit.ai -->\r\n## Summary by CodeRabbit\r\n\r\n* **New Features**\r\n  * ECR Public authentication (aws/ecr-public) with atmos aws ecr login --public, identity-driven auto-provisioning, and enforced us-east-1 auth.\r\n\r\n* **Documentation**\r\n  * Tutorials, blog post, and roadmap updated with ECR Public examples, permissions, CI guidance, and troubleshooting.\r\n\r\n* **Bug Fixes**\r\n  * Improved identity selection UX (confirmation message) and safer CLI behavior for non‑TTY identity selection.\r\n\r\n* **Tests**\r\n  * Extensive unit and integration tests covering ECR Public flows and CLI routing.\r\n\r\n* **Chores**\r\n  * NOTICE/dependencies updated and minor .gitignore tweak.\r\n<!-- end of auto-generated comment: release notes by coderabbit.ai -->\r\n</details>\r\n\r\n<details>\r\n  <summary>feat(auth): Atmos Pro STS — JIT GitHub token broker for CI @osterman (#2546)</summary>\r\n\r\n## what\r\n\r\n- Add a new auth provider `kind: atmos/pro` that authenticates the Atmos CLI **to Atmos Pro** by federating the GitHub Actions runner's OIDC token into an Atmos Pro session JWT (v1 is OIDC-only).\r\n- Add a new auth integration `kind: github/sts` — a just-in-time GitHub token broker for CI. On login it mints short-lived, scoped GitHub App installation tokens via `POST /api/v1/sts`, materializes them as per-owner `GIT_CONFIG_*` URL rewrites (`env` or `file` mode), and revokes them at command-end (via `atmos auth exec` in CI) and on `atmos auth logout`.\r\n- Add a passthrough `kind: atmos/pro` identity, a keyring-registered `ProCredentials` type, realm scoping for integration state, and `via.provider` binding for integrations (in addition to `via.identity`).\r\n- Add `ATMOS_PRO_GITHUB_TOKEN`, preferred by Atmos-native git operations (vendoring, `source:` provisioning, go-getter) ahead of `ATMOS_GITHUB_TOKEN`/`GITHUB_TOKEN`.\r\n- Add the PRD (`docs/prd/atmos-pro-sts.md`), a changelog blog post, a shipped roadmap milestone, and configuration docs; full unit-test coverage for the provider, identity, integration, keyring round-trip, `via.provider` matching, revoke gating, and token precedence.\r\n\r\n## why\r\n\r\n- Fetching private Terraform modules, Atmos `source:` components, and vendored artifacts in CI today requires a long-lived, over-privileged GitHub credential (PAT, machine user, or deploy key) sitting in a CI secret — a standing breach risk that can't be scoped per-run.\r\n- Atmos Pro STS replaces that with least-privilege, deny-by-default, short-lived tokens minted at the start of a run and revoked at the end — with **zero `.tf` changes** (the injected `GIT_CONFIG_*` rewrites are honored by both go-getter and Terraform's native git), and multi-org support because tokens are minted per `(installation, permission-set)`.\r\n- Built into Atmos CLI core (CI-native, OIDC-aware) rather than as a GitHub Action, modeled on the existing `aws/ecr`/`aws/eks` integrations; the workflow only needs `permissions: id-token: write`.\r\n\r\n## references\r\n\r\n- PRD: `docs/prd/atmos-pro-sts.md` (includes deferred Future Work: moving Pro connection config under `auth`, unifying `pkg/pro` onto auth-issued sessions, and broadening command-end revoke beyond `atmos auth exec`)\r\n- Changelog: `website/blog/2026-05-29-atmos-pro-github-sts.mdx`\r\n\r\n\r\n<!-- This is an auto-generated comment: release notes by coderabbit.ai -->\r\n## Summary by CodeRabbit\r\n\r\n* **New Features**\r\n  * Atmos Pro GitHub token broker: new atmos/pro provider + github/sts integration for just-in-time GitHub tokens (env or git-config modes) with realm-scoped state and optional token export.\r\n  * ATMOS_PRO_GITHUB_TOKEN added as preferred GitHub token source.\r\n  * CI-gated automatic token revocation on command exit/logout.\r\n  * Ambient credential broker registry to auto-provision env vars for remote reads.\r\n\r\n* **Documentation**\r\n  * PRD, docs, and blog post for Atmos Pro STS and usage guidance.\r\n<!-- end of auto-generated comment: release notes by coderabbit.ai -->\r\n</details>\r\n\r\n<details>\r\n  <summary>docs: re-date custom commands step types blog post to 2026-05-30 @osterman (#2550)</summary>\r\n\r\n## what\r\n\r\n- Re-dated the \"25+ Interactive Step Types\" blog post from `2026-01-03` to `2026-05-30`.\r\n- Renamed the file prefix (`git mv`, history preserved) and added a matching `date: 2026-05-30` frontmatter field.\r\n\r\n## why\r\n\r\n- Aligns the post's publish date with its actual release timing so it surfaces correctly in the changelog feed.\r\n- Adds the explicit `date:` field to match the repo convention (e.g. `2026-05-28-git-yaml-functions.mdx`).\r\n- The `slug` is unchanged, so the published URL stays the same.\r\n\r\n## references\r\n\r\n- N/A — docs-only date adjustment, no user-facing code change.\r\n\r\n\r\n<!-- This is an auto-generated comment: release notes by coderabbit.ai -->\r\n\r\n## Summary by CodeRabbit\r\n\r\n* **Documentation**\r\n  * Published comprehensive guide to custom commands and workflow step types, featuring 25+ interactive step types with usage examples, including input collection, output formatting, and variable passing conventions for enhanced automation capabilities.\r\n\r\n<!-- review_stack_entry_start -->\r\n\r\n[![Review Change Stack](https://storage.googleapis.com/coderabbit_public_assets/review-stack-in-coderabbit-ui.svg)](https://app.coderabbit.ai/change-stack/cloudposse/atmos/pull/2550?utm_source=github_walkthrough&utm_medium=github&utm_campaign=change_stack)\r\n\r\n<!-- review_stack_entry_end -->\r\n\r\n<!-- end of auto-generated comment: release notes by coderabbit.ai -->\r\n</details>\r\n\r\n<details>\r\n  <summary>fix(website): use consistent brand-blue announcement bar @osterman (#2551)</summary>\r\n\r\n## what\r\n\r\n- Removed the per-announcement `backgroundColor`/`textColor` overrides from `website/src/data/announcements.js` so every announcement bar entry inherits the brand-blue (`#3578e5`) / white-text defaults from the `--announcement-bar-*` CSS variables.\r\n- Documented the convention in the file header so future announcements don't reintroduce per-entry colors.\r\n\r\n## why\r\n\r\n- The announcement bar cycled through a rainbow of saturated Tailwind-600 colors (emerald green, violet, cyan, amber, red, indigo, teal...) that looked like \"crayola\" against the site's dark, near-black theme.\r\n- A single restrained, on-brand color reads as sophisticated and consistent with the rest of the dark site, and matches the bar's original styling.\r\n\r\n## references\r\n\r\n- N/A (website cosmetic change)\r\n\r\n\r\n<!-- This is an auto-generated comment: release notes by coderabbit.ai -->\r\n\r\n## Summary by CodeRabbit\r\n\r\n* **Refactor**\r\n  * Standardized announcement bar styling configuration to use shared CSS variables instead of per-announcement color settings, improving consistency across announcements.\r\n\r\n<!-- review_stack_entry_start -->\r\n\r\n[![Review Change Stack](https://storage.googleapis.com/coderabbit_public_assets/review-stack-in-coderabbit-ui.svg)](https://app.coderabbit.ai/change-stack/cloudposse/atmos/pull/2551?utm_source=github_walkthrough&utm_medium=github&utm_campaign=change_stack)\r\n\r\n<!-- review_stack_entry_end -->\r\n\r\n<!-- end of auto-generated comment: release notes by coderabbit.ai -->\r\n</details>\r\n\r\n<details>\r\n  <summary>feat: Implement workflow step types with registry pattern (DEV-263, DEV-2969) @osterman (#1899)</summary>\r\n\r\n## what\r\n\r\n- Add 20+ step types across 4 categories (Interactive, Output, UI, Command) with extensible registry pattern\r\n- Support Go template variable passing between steps (e.g., `{{ .steps.step1.value }}`)\r\n- Implement per-step output modes: viewport (pager), raw (passthrough), log (grouped), none (silent)\r\n- Interactive handlers with TTY detection and clear error messages in CI environments\r\n\r\n## why\r\n\r\nAddresses DEV-263 (add input type to workflows) and DEV-2969 (add viewport support). Enables users to build complex multi-step workflows with user interaction, conditional execution, and flexible result display.\r\n\r\n## references\r\n\r\n- Closes #DEV-263\r\n- Closes #DEV-2969\r\n\r\n<!-- This is an auto-generated comment: release notes by coderabbit.ai -->\r\n## Summary by CodeRabbit\r\n\r\n## Release Notes\r\n\r\n* **New Features**\r\n  * Added 25+ interactive step types for workflows and custom commands (input, confirm, choose, filter, file, write, markdown, spin, table, style, and more).\r\n  * Support for configurable output modes (viewport, raw, log, none) and step-level display options.\r\n  * Workflow progress rendering and status indicators.\r\n\r\n* **Documentation**\r\n  * Comprehensive guides for interactive workflows and custom commands with step type reference.\r\n  * New examples demonstrating interactive deployments, credentials collection, and multi-step flows.\r\n\r\n* **Bug Fixes**\r\n  * Improved error messaging for workflow step validation and execution failures.\r\n\r\n<!-- review_stack_entry_start -->\r\n\r\n[![Review Change Stack](https://storage.googleapis.com/coderabbit_public_assets/review-stack-in-coderabbit-ui.svg)](https://app.coderabbit.ai/change-stack/cloudposse/atmos/pull/1899?utm_source=github_walkthrough&utm_medium=github&utm_campaign=change_stack)\r\n\r\n<!-- review_stack_entry_end -->\r\n<!-- end of auto-generated comment: release notes by coderabbit.ai -->\r\n</details>\r\n\r\n<details>\r\n  <summary>Add process and I/O execution foundation @shirkevich (#2464)</summary>\r\n\r\n## Summary\r\n\r\nThis is PR 1 for the DAG concurrent execution rollout. It introduces the reusable process and stream-isolation foundation without enabling scheduler behavior or changing Terraform bulk routing.\r\n\r\nChanges:\r\n- Add `pkg/process` with `Runner`, `TaskSpec`, `Streams`, `Result`, default `os/exec` runner, context-aware execution, cancellation reporting, and exit-code preservation.\r\n- Extend `pkg/io` with prefixed per-node stream composition for terminal, file, and capture sinks.\r\n- Refactor `internal/exec.ExecuteShellCommand()` into a backward-compatible wrapper over `pkg/process` while preserving CI stdout/stderr capture options.\r\n- Replace the `runTerraformShow()` global `os.Stdout` swap with injected stdout capture.\r\n\r\n## Scope\r\n\r\nNo scheduler, CLI routing consolidation, concurrency flags, or Terraform adapter behavior is enabled in this PR.\r\n\r\n## Stacking\r\n\r\nThis PR is the bottom of the DAG rollout stack and targets `main`.\r\n\r\nSupersedes the earlier fork-headed draft #2459 now that the stack branches exist in `cloudposse/atmos`.\r\n\r\n## Validation\r\n\r\n```sh\r\nrtk env GOCACHE=/private/tmp/atmos-gocache GOMODCACHE=/private/tmp/atmos-gomodcache go test ./pkg/process ./pkg/io ./internal/exec ./cmd/terraform\r\n```\r\n\r\n## Next PR\r\n\r\nPR 2 branches from `codex/dag-process-io-foundation` and adds the generic `pkg/scheduler` core with ready-queue scheduling, bounded workers, deterministic aggregate results, and isolated unit tests only.\r\n\r\n\r\n<!-- This is an auto-generated comment: release notes by coderabbit.ai -->\r\n## Summary by CodeRabbit\r\n\r\n## Release Notes\r\n\r\n* **New Features**\r\n  * Configurable subprocess execution with optional contexts and injectable streams\r\n  * Composable, scope-scoped output writers with per-line prefixing and masking\r\n\r\n* **Bug Fixes**\r\n  * More accurate subprocess exit/error reporting and improved stream-redirection behavior\r\n\r\n* **Tests**\r\n  * Expanded unit tests for subprocess execution, stream injection/capture, and output utilities\r\n\r\n* **Documentation**\r\n  * Updated concurrent execution docs to reflect stream-based output handling\r\n\r\n<!-- review_stack_entry_start -->\r\n\r\n[![Review Change Stack](https://storage.googleapis.com/coderabbit_public_assets/review-stack-in-coderabbit-ui.svg)](https://app.coderabbit.ai/change-stack/cloudposse/atmos/pull/2464?utm_source=github_walkthrough&utm_medium=github&utm_campaign=change_stack)\r\n\r\n<!-- review_stack_entry_end -->\r\n<!-- end of auto-generated comment: release notes by coderabbit.ai -->\r\n</details>\r\n\r\n<details>\r\n  <summary>Add core git YAML functions @osterman (#2537)</summary>\r\n\r\n## what\r\n\r\n- Add core Git YAML functions: `!git.root`, `!git.sha`, `!git.branch`, and `!git.ref`.\r\n- Resolve Git metadata through `pkg/git`, with `pkg/utils` limited to compatibility shims and YAML tag registration.\r\n- Wire Git tag resolution through config preprocessing, stack/component YAML processing, and function registry metadata.\r\n- Add a changelog post and roadmap milestone for the new Git YAML functions.\r\n\r\n## why\r\n\r\n- Allow dev stack/component source versions to pin to the current Git SHA via `!git.ref`.\r\n- Keep prod pins explicit while giving dev environments PR-aware source refs.\r\n- Avoid expanding `pkg/utils` by placing Git behavior in the self-contained Git package.\r\n\r\n## references\r\n\r\n- n/a\r\n\r\n\r\n<!-- This is an auto-generated comment: release notes by coderabbit.ai -->\r\n## Summary by CodeRabbit\r\n\r\n* **New Features**\r\n  * Added Git YAML tags (!git.root / !repo-root, !git.sha, !git.ref, !git.branch) to resolve repo root, commit SHA/ref, and branch in configs and stacks; !git.ref can pin source versions.\r\n\r\n* **Refactor**\r\n  * Centralized git tag resolution for consistent behavior, alias support, unified fallbacks, and clearer error handling.\r\n\r\n* **Tests**\r\n  * Expanded coverage for tag resolution, fallbacks, detached‑HEAD behavior, and real-repo scenarios.\r\n\r\n* **Documentation**\r\n  * Updated blog post and roadmap with examples and usage notes.\r\n\r\n<!-- review_stack_entry_start -->\r\n\r\n[![Review Change Stack](https://storage.googleapis.com/coderabbit_public_assets/review-stack-in-coderabbit-ui.svg)](https://app.coderabbit.ai/change-stack/cloudposse/atmos/pull/2537?utm_source=github_walkthrough&utm_medium=github&utm_campaign=change_stack)\r\n\r\n<!-- review_stack_entry_end -->\r\n<!-- end of auto-generated comment: release notes by coderabbit.ai -->\r\n</details>\r\n\r\n\r\n## 🚀 Enhancements\r\n\r\n<details>\r\n  <summary>fix(stacks): honor component list_merge_strategy in metadata.inherits… @JaseKoonce (#2565)</summary>\r\n\r\n\r\n## what\r\n\r\n- settings.list_merge_strategy set on a component now applies when merging lists via metadata.inherits\r\n\r\n- Adds tests covering append, replace, and merge strategies across single and multi-level inheritance\r\n  chains\r\n\r\n## why\r\n\r\n  - Component-level list_merge_strategy was only honored on the import/stack merge path (fixed in #2480).\r\n  The metadata.inherits resolution path always used the global atmosConfig, so per-component overrides were\r\n  silently ignored\r\n\r\n  - A component with list_merge_strategy: append inheriting two bases would get last-wins ([from_b]) instead\r\n  of the expected accumulated result ([from_a, from_b])\r\n\r\n## references\r\n\r\n  - Closes #2396\r\n  - Follow-up to #2480\r\n\r\n\r\n<!-- This is an auto-generated comment: release notes by coderabbit.ai -->\r\n## Summary by CodeRabbit\r\n\r\n* **Improvements**\r\n  * Component inheritance now applies per-component list merge strategies during metadata-based inheritance so inherited lists are accumulated, replaced, or merged by index according to the inheriting component’s settings across multi-level chains.\r\n\r\n* **Tests**\r\n  * Added integration tests and fixture scenarios validating append, replace, multi-level append, and merge-by-index behaviors for metadata inheritance.\r\n<!-- end of auto-generated comment: release notes by coderabbit.ai -->\r\n</details>\r\n\r\n<details>\r\n  <summary>fix(auth): unwrap Atmos Pro envelope in github/sts mint @osterman (#2568)</summary>\r\n\r\n## what\r\n\r\n- Fix the `github/sts` auth integration ignoring a successfully minted Atmos Pro STS token because `mint()` decoded the response with a flat struct instead of the canonical API envelope.\r\n- Add a shared, reusable primitive — `dtos.Envelope[T]` + `pro.DecodeEnvelope[T]` — and route `mint()` through it so every Atmos Pro response unwraps the nested `data` payload through one sanctioned path.\r\n- Fix the bug-masking test fixture (the simulated broker now emits the real envelope shape) and add a regression test asserting `mint()` persists **1 token, not 0**, plus decoder unit tests including a canary that a flat payload decodes to empty `data`.\r\n\r\n## why\r\n\r\n- Every Atmos Pro API route returns `{ \"success\": true, \"status\": 200, \"data\": { \"tokens\": [...], \"excluded\": [...] } }`, but `mint()` decoded straight into the flat `stsResponse` (top-level `tokens`), so it always read 0 tokens — the CLI logged `GitHub STS: no tokens granted`, never wrote the git `insteadOf` config, and cross-repo `import:` calls fell back to the ambient `GITHUB_TOKEN` and failed with `remote: Repository not found`, even though the server had minted a valid token (HTTP 200, so no error surfaced).\r\n- The existing e2e test passed only because its simulated broker returned the unwrapped `{tokens,excluded}` shape the real server never sends; matching the fixture to the real envelope and adding the regression/canary tests prevents this whole class of \"decoded a Pro response without the envelope\" bug from recurring.\r\n\r\n## references\r\n\r\n- `mint()` was the only Pro call bypassing the shared `AtmosApiResponse` envelope that `ExchangeOIDCToken` / `LockStack` already use.\r\n\r\n\r\n<!-- This is an auto-generated comment: release notes by coderabbit.ai -->\r\n## Summary by CodeRabbit\r\n\r\n* **Bug Fixes**\r\n  * Clearer STS error messages and correct unwrapping of canonical API envelopes.\r\n  * Prevent ambient tokens from being baked into Git URLs by honoring insteadOf rewrites (including file-mode).\r\n  * Avoid invalid git checkout/fetch for empty refs by fetching default branch and skipping bad checkouts.\r\n  * Warn when component `source` is misplaced under `metadata` and accept simple-form `source` strings.\r\n\r\n* **New Features**\r\n  * Provision credential brokers before Git source detection so token rewrites apply.\r\n\r\n* **Tests**\r\n  * Expanded tests covering envelope decoding, STS handling, broker provisioning, git insteadOf, and default-ref behavior.\r\n\r\n* **Documentation**\r\n  * Added fix notes on STS envelope/token-shadowing and updated PRD guidance for `source`.\r\n<!-- end of auto-generated comment: release notes by coderabbit.ai -->\r\n</details>\r\n\r\n<details>\r\n  <summary>fix(pro): respect metadata.enabled when uploading instances for drift @osterman (#2563)</summary>\r\n\r\n## what\r\n\r\n- `atmos list instances --upload` now collapses the Atmos Pro enabled hierarchy (`metadata.enabled` > `settings.pro.enabled` > `settings.pro.drift_detection.enabled`) before uploading, so the values Atmos Pro persists already reflect any outer disable.\r\n- A shared `effectiveEnabledState` helper is the single source of truth for both the upload payload (`extractProSettings`) and the success-toast counts, so they can no longer diverge.\r\n- Disabled components are still uploaded (as `pro.enabled: false`) rather than omitted, so Atmos Pro shows them disabled instead of orphaning them.\r\n- Reference docs corrected (`settings/pro.mdx` gains a `settings.pro.enabled` entry + precedence note; `list/list-instances.mdx` drops the now-false \"preserved verbatim\" / \"drift is independent of pro.enabled\" claims), plus a `docs/fixes/` write-up.\r\n\r\n## why\r\n\r\n- Components disabled upstream via `metadata.enabled: false` kept failing scheduled drift detection (`dispatchError: \"missing_plan_result\"`, `drift_status: error`): the CLI skips planning them, but the upload serialized the raw `settings.pro` block and never sent `metadata.enabled`, so Atmos Pro (whose ingestion contract has no `metadata` field) persisted them as `enabled:true, drift_enabled:true` and legitimately dispatched drift.\r\n- Fixing it in the CLI keeps the determination where it is already resolved and needs no Atmos Pro change: the stuck `error` rows self-heal to `disabled` on the next upload, with no data migration.\r\n- `pro.enabled` defaults to `true` (matching the Pro server-side default) so the collapse only ever turns things off when an outer level is explicitly disabled — it never regresses default-enabled components.\r\n\r\n## references\r\n\r\n- `docs/fixes/2026-06-03-drift-dispatch-ignores-metadata-enabled.md` (root-cause analysis, Neon `instances` evidence, verification steps)\r\n- Source of truth for the disabled determination: `internal/exec/component_utils.go` (`isComponentEnabled`)\r\n\r\n\r\n<!-- This is an auto-generated comment: release notes by coderabbit.ai -->\r\n## Summary by CodeRabbit\r\n\r\n* **Bug Fixes**\r\n  * Resolve upload so component enablement honors metadata.enabled, preventing metadata-disabled components from remaining scheduled for drift and correcting counts; disabled components are uploaded as disabled rather than omitted.\r\n\r\n* **Documentation**\r\n  * Clarify enablement precedence (metadata.enabled > settings.pro.enabled > drift_detection.enabled), upload behavior, and how effective Pro/drift state is reflected in UI counts.\r\n\r\n* **Tests**\r\n  * Add unit and end-to-end tests validating effective enablement resolution, drift counting, and uploaded payloads.\r\n<!-- end of auto-generated comment: release notes by coderabbit.ai -->\r\n</details>\r\n\r\n<details>\r\n  <summary>fix(auth): deduplicate ECR, ECR Public, and EKS integrations to once per process @MrZablah (#2564)</summary>\r\n\r\n## What\r\n\r\n  Adds a process-level execution cache to `triggerIntegrations` so that\r\n  auto-provisioned integrations (`aws/ecr`, `aws/ecr-public`, `aws/eks`)\r\n  fire at most once per `atmos` invocation, regardless of how many times\r\n  `Authenticate` is called or how many `AuthManager` instances are created.\r\n\r\n  The cache key is the integration's canonical target endpoint rather than\r\n  its config entry name:\r\n  - `aws/ecr`        → `\"aws/ecr:<account_id>:<region>\"`\r\n  - `aws/ecr-public` → `\"aws/ecr-public\"` (single global registry)\r\n  - `aws/eks`        → `\"aws/eks:<cluster_name>:<region>\"`\r\n  - everything else  → integration name (no behaviour change)\r\n\r\n  This means two config entries that point at the same registry — e.g. one\r\n  from global `atmos.yaml` and one from a component stack file — are\r\n  collapsed to a single execution.\r\n\r\n  ## Why\r\n\r\n  `atmos terraform plan` calls `Authenticate` from at least three internal\r\n  paths: `setupTerraformAuth`, `TerraformPreHook`, and one call per YAML\r\n  function (`!store.get`, `!terraform.state`). With a 6-tool `.tool-versions`\r\n  this produced 6 ECR logins per command. Switching to a name-keyed cache\r\n  reduced it to 2 because merged configs can carry two integration entries\r\n  with different names for the same registry. Keying by target endpoint\r\n  reduces this to exactly 1.\r\n\r\n  ## Changes\r\n\r\n  - `pkg/auth/manager_integrations.go` — adds `processIntegrationCache\r\n    sync.Map`, `resetProcessIntegrationCache()` (test helper),\r\n    `integrationTargetKey()` (canonical key helper covering `aws/ecr`,\r\n    `aws/ecr-public`, `aws/eks`); updates `triggerIntegrations` to use\r\n    `LoadOrStore` on the target key.\r\n  - `pkg/auth/manager_integrations_test.go` — adds\r\n    `TestIntegrationTargetKey` (table-driven tests for all key variants\r\n    including ECR Public) and `TestIntegrationTargetKey_Deduplication`\r\n    (verifies that two same-registry entries produce one cache hit).\r\n\r\n  ## Notes\r\n\r\n  `aws/ecr-public` was added to `upstream/main` in #2231 after this branch\r\n  diverged; coverage for it was added here to keep deduplication consistent\r\n  across all three AWS integration kinds.\r\n\r\n## references\r\n\r\nECR / ECR Public Login Executes Multiple Times Per atmos terraform Invocation\r\n [#2562](https://github.com/cloudposse/atmos/issues/2562)\r\n\r\n\r\n<!-- This is an auto-generated comment: release notes by coderabbit.ai -->\r\n## Summary by CodeRabbit\r\n\r\n* **New Features**\r\n  * Added process-level deduplication for auto-provisioned integrations to prevent redundant provisioning of the same target within a single process.\r\n  * Failed provisioning attempts are evicted from the dedupe cache so retries can proceed.\r\n\r\n* **Tests**\r\n  * Added unit tests validating cache key behavior and deduplication scenarios to ensure consistent provisioning outcomes.\r\n<!-- end of auto-generated comment: release notes by coderabbit.ai -->\r\n</details>\r\n\r\n<details>\r\n  <summary>fix(auth): make github/sts compose with default GitHub token injection @osterman (#2557)</summary>\r\n\r\n## what\r\n\r\n- Stop Atmos's go-getter token injection from silently shadowing `github/sts`-minted GitHub tokens: `CustomGitDetector` now skips URL token injection when a live `GIT_CONFIG_*` `insteadOf` rewrite already matches the URL's host/owner, so git's rewrite (carrying the correct least-privilege token) wins.\r\n- Make the `ATMOS_PRO_GITHUB_TOKEN` bridge consistent: `resolveToken` falls back to the live env var (which the broker sets after startup), mirroring `pkg/http/client.go`.\r\n- Default `token_env` to `ATMOS_PRO_GITHUB_TOKEN` (was empty) so a single-owner mint reaches `gh`/REST and Atmos's in-process git path automatically.\r\n- Replace the ad-hoc `{owner}` placeholder with Atmos's standard Go-template syntax (`{{ .owner }}`, plus `.host`); update docs, PRD, and add a `docs/fixes/` write-up.\r\n\r\n## why\r\n\r\n- A real CI job resolving a remote `import:` from a second private repo failed with `remote: Repository not found` — the minted token was correct, but the ambient `GITHUB_TOKEN` was being injected into the URL ahead of it, defeating git's `insteadOf` rewrite. The only fix was the `settings.inject_github_token: false` workaround.\r\n- These changes make `github/sts` (introduced in #2546) compose with the default `settings.inject_github_token: true`, so it \"just works\" with no workaround. Reproduced first with a simulated-broker e2e test, then fixed.\r\n\r\n## references\r\n\r\n- Fixes the `github/sts` feature shipped in #2546\r\n- `docs/fixes/2026-06-01-github-sts-token-injection-shadowing.md` (root cause, fix, and why this is a fix doc rather than a changelog entry)\r\n- `docs/prd/atmos-pro-sts.md`\r\n\r\n\r\n<!-- This is an auto-generated comment: release notes by coderabbit.ai -->\r\n## Summary by CodeRabbit\r\n\r\n* **Bug Fixes**\r\n  * Prevented minted GitHub tokens from being silently overridden by detecting broker-provided git URL rewrites and skipping ambient token injection.\r\n\r\n* **New Features**\r\n  * token_env accepts Go-template names (e.g., GH_TOKEN_{{ .owner }}) and defaults to ATMOS_PRO_GITHUB_TOKEN when appropriate.\r\n  * Token resolution prefers a live exported broker token before falling back to configured values; minted tokens are not logged.\r\n\r\n* **Documentation**\r\n  * Clarified github/sts token_env semantics, templating, multi-owner behavior, and URL-rewrite interactions.\r\n\r\n* **Tests**\r\n  * Added/expanded tests for token-env defaults, templating, precedence, and insteadOf handling.\r\n\r\n* **Chores**\r\n  * Made license NOTICE generation produce deterministic URLs.\r\n<!-- end of auto-generated comment: release notes by coderabbit.ai -->\r\n</details>\r\n\r\n<details>\r\n  <summary>fix(auth): report missing exec binary instead of \"atmos requires a subcommand\" @osterman (#2559)</summary>\r\n\r\n## what\r\n\r\n- Fix `atmos auth exec -- <command>` reporting the misleading **\"The command atmos requires a subcommand\"** when the executable after `--` (e.g. `uvx`) is not found on `PATH`.\r\n- The missing executable is now reported clearly via the error builder: the command name, the underlying cause, a PATH hint, and exit code `127`.\r\n- Internally, Cobra's \"unknown command\" conversion now uses the `ErrUnknownSubcommand` sentinel, and the root handler intercepts that (via a new testable `unknownSubcommand` helper) instead of the overloaded `ErrCommandNotFound`.\r\n\r\n## why\r\n\r\n- `auth exec` and the registry executor both wrapped the shared `ErrCommandNotFound` sentinel, so a missing user binary was indistinguishable from an unknown Atmos subcommand and got masked as root usage output — hiding the real cause.\r\n- Separating the two sentinels gives accurate errors for both cases (genuine unknown subcommands still show root usage with suggestions; missing executables now say \"command not found\" with a hint), and also fixes the same latent masking for `pkg/hooks` command lookups.\r\n\r\n## references\r\n\r\n- Regression from the `atmos auth` → command-registry migration (#1919) combined with the registry executor's Cobra-error conversion (#1643).\r\n\r\n\r\n<!-- This is an auto-generated comment: release notes by coderabbit.ai -->\r\n## Summary by CodeRabbit\r\n\r\n* **Bug Fixes**\r\n  * Clearer \"command not found\" errors with install guidance and enforced exit code 127.\r\n  * Distinguish missing external executables from unknown subcommands so help is shown only for genuine unknown subcommands.\r\n\r\n* **Tests**\r\n  * Added/updated tests to guard error-classification behaviors and prevent regressions.\r\n\r\n* **Documentation**\r\n  * Adjusted BSD dependency listing to mark the URL as Unknown.\r\n<!-- end of auto-generated comment: release notes by coderabbit.ai -->\r\n</details>\r\n\r\n<details>\r\n  <summary>fix: allow --use-version artifact downloads without GitHub token @osterman (#2212)</summary>\r\n\r\n## what\r\n\r\n- Allow unauthenticated artifact downloads for public repositories via `--use-version` flag\r\n- Metadata fetching (PR info, workflow runs, artifact listing) and artifact downloads now work without authentication on public repos per GitHub API docs\r\n- Replace upfront `GetGitHubTokenOrError()` gate with optional `GetGitHubToken()` in `InstallFromPR()` and `InstallFromSHA()`\r\n- Skip `Authorization` header when token is unavailable in `downloadPRArtifact()`\r\n- Add smart HTTP error handling with `buildDownloadHTTPError()` to distinguish auth failures from rate limiting\r\n\r\n## why\r\n\r\n- Users without GitHub token environment variables couldn't install PR artifacts, even for public repositories\r\n- Rate limit errors (429) were reported generically as \"HTTP 429\" with no actionable context\r\n- Need to properly surface rate limit information (60/hr for unauthenticated, 5,000/hr for authenticated) to guide users\r\n\r\n## references\r\n\r\n- Fixes the issue where `atmos --use-version=2129` fails with \"authentication failed\" when no `GITHUB_TOKEN` is set\r\n- GitHub API documentation confirms artifact downloads work without authentication for public repositories\r\n\r\n<!-- This is an auto-generated comment: release notes by coderabbit.ai -->\r\n## Summary by CodeRabbit\r\n\r\n* **New Features**\r\n  * Added optional unauthenticated access for public GitHub artifacts (subject to rate limits)\r\n  * New ATMOS_GITHUB_CLI env var to control/disable CLI-based token retrieval\r\n\r\n* **Bug Fixes**\r\n  * Clearer handling and messaging for auth vs rate-limit errors, with improved hints and retry info\r\n  * GitHub token is now optional for artifact operations (falls back to anonymous when available)\r\n\r\n* **Tests**\r\n  * Expanded tests for artifact downloads and HTTP auth/rate-limit scenarios\r\n\r\n* **Documentation**\r\n  * Documented ATMOS_GITHUB_CLI usage and behavior\r\n<!-- end of auto-generated comment: release notes by coderabbit.ai -->\r\n</details>\r\n\r\n<details>\r\n  <summary>fix(version): honor ATMOS_USE_VERSION env var for version re-exec @osterman (#2556)</summary>\r\n\r\n## what\r\n\r\n- Honor the documented `ATMOS_USE_VERSION` environment variable so Atmos actually switches to (and downloads, if needed) the requested version during early re-exec.\r\n- `resolveRequestedVersion` now reads `ATMOS_USE_VERSION`, with precedence `ATMOS_VERSION_USE` > `ATMOS_USE_VERSION` > `ATMOS_VERSION` > `version.use`.\r\n- `cmd/root.go` also honors `ATMOS_USE_VERSION` from the environment so version-management commands (e.g. `atmos version`) re-exec on it just like the `--use-version` flag.\r\n- Add a table case and a precedence test covering the new behavior.\r\n\r\n## why\r\n\r\n- `ATMOS_USE_VERSION` is advertised as the primary env var (docs at `website/docs/cli/environment-variables.mdx` and the flag binding `WithEnvVars(\"use-version\", \"ATMOS_USE_VERSION\")`), but the re-exec resolver never read it — it only checked the internal `ATMOS_VERSION_USE` (set solely by the CLI flag), the `ATMOS_VERSION` alias, and `version.use` config.\r\n- An env-populated flag is not marked `Changed()` and maps to viper key `use-version` rather than `version.use`, so `ATMOS_USE_VERSION` fell through every code path — setting it was a complete no-op.\r\n- This surfaced in CI where `ATMOS_USE_VERSION` was set for `atmos describe affected --upload` but Atmos ran the already-installed version instead of switching. This brings the code in line with the existing documentation.\r\n\r\n## references\r\n\r\n- Docs already describe the intended behavior: `website/docs/cli/environment-variables.mdx`\r\n\r\n\r\n<!-- This is an auto-generated comment: release notes by coderabbit.ai -->\r\n## Summary by CodeRabbit\r\n\r\n* **New Features**\r\n  * Added support for the ATMOS_USE_VERSION environment variable as an alternative to the --use-version CLI flag.\r\n  * Updated version selection precedence to consider environment variables in the defined order.\r\n\r\n* **Tests**\r\n  * Extended test coverage for environment-variable-driven version selection scenarios.\r\n\r\n* **Chores**\r\n  * Updated NOTICE entry for a dependency license URL.\r\n<!-- end of auto-generated comment: release notes by coderabbit.ai -->\r\n</details>\r\n\r\n<details>\r\n  <summary>fix(auth): honor keyring.type config and send DPoP proof on AWS webflow @osterman (#2545)</summary>\r\n\r\n## what\r\n\r\n- Honor `auth.keyring.type` from `atmos.yaml` across **all** auth-manager entrypoints by threading `authConfig` into `credentials.NewCredentialStoreWithConfig(...)` (was silently dropped via the no-arg `NewCredentialStore()`), and inject the manager's config-aware store into AWS `user` identities via a new optional `SetCredentialStore` interface.\r\n- Add an RFC 9449 **DPoP** proof (EC P-256 / ES256, stdlib-only) to the AWS browser webflow token requests; generate the key per session, persist it in the refresh-token cache, and reuse it on refresh (a cache without a key falls back to the browser flow).\r\n- Add `AuthManager.CredentialStoreType()` for observability/testability, mark the no-arg `NewCredentialStore()` constructor `Deprecated`, and add unit tests for both fixes (keyring backend selection, DPoP proof structure/signature, key round-trip, header presence).\r\n\r\n## why\r\n\r\n- **#2544:** with `auth.keyring.type: memory` set, Atmos still selected the default `system` keyring and **hung indefinitely** on hosts where the keyring service is present but unusable (e.g. a locked `gnome-keyring-daemon`). The config value was read and then thrown away before backend selection — only `ATMOS_KEYRING_TYPE` worked. Now the configured backend is honored everywhere an auth manager is built.\r\n- **#2542:** AWS sign-in's `/v1/token` endpoint now rejects requests without a DPoP proof (`HTTP 400 INVALID_REQUEST`), so browser-based authentication for `aws/user` identities failed at the code-exchange step. Sending the proof restores the flow; because the public-client refresh token is bound to the DPoP key, the key is persisted and reused on refresh.\r\n\r\n## references\r\n\r\n- closes #2542\r\n- closes #2544\r\n- RFC 9449 (DPoP): https://datatracker.ietf.org/doc/html/rfc9449\r\n\r\n\r\n<!-- This is an auto-generated comment: release notes by coderabbit.ai -->\r\n## Summary by CodeRabbit\r\n\r\n* **New Features**\r\n  * Added RFC 9449 DPoP support for AWS OAuth token exchanges to strengthen token binding.\r\n  * Auth now respects configured keyring backend across authentication flows.\r\n\r\n* **Bug Fixes**\r\n  * Fixed AWS token parsing to match real-world snake_case responses.\r\n\r\n* **Improvements**\r\n  * Auth manager exposes credential store backend type for easier diagnostics.\r\n<!-- end of auto-generated comment: release notes by coderabbit.ai -->\r\n</details>\r\n\r\n<details>\r\n  <summary>fix(yaml-functions): honor init.pass_vars when resolving !terraform.output (#1412) @thejrose1984 (#2548)</summary>\r\n\r\n## what\r\n\r\nWhen `components.terraform.init.pass_vars: true` is set, forward the component's vars to the **internal `terraform init`** that runs while resolving `!terraform.output`, via `TF_VAR_*` environment variables.\r\n\r\n- `ComponentConfig` gains `PassVars` + `Vars`, populated in `ExtractComponentConfig`.\r\n- `SetupEnvironment` injects `TF_VAR_*` for each var when `PassVars` is true (strings verbatim, other types JSON-encoded).\r\n- Regression tests cover the enabled path (string/number/bool/list), the disabled default, and env-section precedence.\r\n\r\n## why\r\n\r\nCloses #1412.\r\n\r\nThe main terraform path honors `pass_vars` by passing `-var-file` to `init` ([`terraform_execute_helpers.go`](https://github.com/cloudposse/atmos/blob/main/internal/exec/terraform_execute_helpers.go#L463-L469)), so modules with **init-time** variable dependencies (e.g. a module `version`/`source` bound to `var.aks_version`) can initialize. But the init that runs while resolving `!terraform.output` goes through `pkg/terraform/output`, which uses the `terraform-exec` library and never honored `pass_vars`:\r\n\r\n- `runInit` only set `Upgrade(false)` + optional `Reconfigure(true)`.\r\n- `ComponentConfig` had no `PassVars`/vars plumbing.\r\n- `terraform-exec`'s `initConfig` has **no** var-file field — it structurally cannot pass `-var-file` to `init`.\r\n\r\nSo `atmos tofu init/plan -s <stack>` failed with `Unable to compute static value` / `module.aks.version depends on var.aks_version which is not available` whenever an init-time var came from a component resolved via `!terraform.output`.\r\n\r\n### Why TF_VAR_* rather than a var-file\r\n\r\n`terraform-exec` can't attach a var-file to `init`, and an auto-loaded `*.auto.tfvars.json` on disk would risk cross-stack contamination when components are resolved concurrently. `TF_VAR_*` is process/runner-scoped, reaches `init` transparently through the existing `SetEnv` call, and Terraform/OpenTofu accept these values for the matching variable types (JSON encodings of lists/maps are valid HCL2). Gated behind `pass_vars` (default `false`), so it's a no-op unless opted in; an explicit `TF_VAR_*` in the component `env` section still wins.\r\n\r\n## references\r\n\r\n- Closes #1412\r\n\r\n## test plan\r\n\r\n```\r\ngo test ./pkg/terraform/output/...\r\n```\r\n\r\nNew tests:\r\n- `TestDefaultEnvironmentSetup_PassVars` — vars exported as `TF_VAR_*` with correct encoding.\r\n- `TestDefaultEnvironmentSetup_PassVarsDisabled` — no `TF_VAR_*` when `pass_vars` is off.\r\n- `TestDefaultEnvironmentSetup_PassVarsEnvSectionWins` — explicit env-section `TF_VAR_*` wins.\r\n\r\n> **Validation note:** verified at the unit level (init env now carries the component vars when `pass_vars` is set; previously the init invocation was unchanged whether `pass_vars` was on or off). I don't have terraform/tofu in this environment to re-run the reporter's full `tofu init/plan` end-to-end, so a maintainer check against a real init-time-dependent module would be worthwhile before release.\r\n\r\n<!-- This is an auto-generated comment: release notes by coderabbit.ai -->\r\n## Summary by CodeRabbit\r\n\r\n* **New Features**\r\n  * Added an option to forward component variables as TF_VAR_* environment entries during Terraform/OpenTofu init; existing TF_VAR_* values are preserved and non-string values are JSON-encoded.\r\n\r\n* **Tests**\r\n  * Added tests for enabled/disabled forwarding, JSON encoding of non-strings, precedence of explicit env values, and end-to-end propagation to the runner env.\r\n\r\n* **Documentation**\r\n  * Docs updated to note init.pass_vars also applies to implicit init runs and how forwarded vars are presented as TF_VAR_*.\r\n<!-- end of auto-generated comment: release notes by coderabbit.ai -->\r\n</details>\r\n\r\n<details>\r\n  <summary>test(yaml-functions): regression test for mixed state/output circular dependency (#2005) @thejrose1984 (#2547)</summary>\r\n\r\n## what\r\n\r\n- Add a regression test and fixture for a cross-component circular dependency that **mixes** `!terraform.state` and `!terraform.output` (component-a → `!terraform.state` component-b; component-b → `!terraform.output` component-a).\r\n- New fixture: `tests/fixtures/scenarios/yaml-functions-circular-deps-mixed`.\r\n- New test: `TestYAMLFunctionsCrossComponentCycleMixed`.\r\n\r\n## why\r\n\r\nThis is the exact scenario from #2005. It was the same root cause as #2457 and was fixed by #2533 (making `ProcessCustomYamlTags` reuse the goroutine-local `ResolutionContext` so the `Visited` map survives nested walks). That fix covers **both** `state↔state` and the mixed `state↔output` path, but only the `state↔state` case had a regression test — so #2005 could silently regress while the existing test stayed green.\r\n\r\nVerified the mixed cycle **hangs** (infinite recursion / goroutine stack overflow) on the commit before #2533, and returns a clean `ErrCircularDependency` on current `main`.\r\n\r\n## references\r\n\r\n- Closes #2005\r\n- Follow-up to #2533 / #2457\r\n\r\n## test plan\r\n\r\n```\r\ngo test ./tests -run TestYAMLFunctionsCrossComponentCycle -v\r\n```\r\n\r\nBoth `TestYAMLFunctionsCrossComponentCycle` (state↔state) and `TestYAMLFunctionsCrossComponentCycleMixed` (state↔output) pass. The mixed test asserts `ErrCircularDependency` is returned and that the `MaxResolutionDepth` safety net is **not** what fired (which would indicate the primary cycle detector regressed).\r\n\r\n\r\n</details>\r\n\r\n<details>\r\n  <summary>fix: defer custom-command/built-in collision warning to invocation time @thejrose1984 (#2549)</summary>\r\n\r\n## what\r\n\r\nScope is intentionally narrow: **change only *when* the existing collision warning fires** — defer it from command-registration time to the moment the conflicting command is actually invoked.\r\n\r\n- No change to collision *behavior*: the built-in still wins and custom `steps` are still ignored.\r\n- No `override:`/`invoke:` work — that opt-in design is tracked separately in the [`custom-command-builtin-override` PRD](https://github.com/cloudposse/atmos/blob/main/docs/prd/custom-command-builtin-override.md).\r\n- Implemented by wrapping the conflicting built-in command's `PreRunE` in `processCustomCommands` (preserving any existing `PreRunE`/`PreRun` and honoring Cobra's precedence of `PreRunE` over `PreRun`).\r\n- Adds a regression test asserting the warning is **absent at registration** and **present (exactly once) on invocation**.\r\n\r\n## why\r\n\r\nToday the warning (introduced in #2191) is emitted from `processCustomCommands`, which runs during root init on **every** Atmos invocation. So a single colliding custom command makes *every* command — `atmos list stacks`, `atmos terraform ...`, etc. — print a warning about, say, a `plan` collision it never touched. The result is worse than noisy:\r\n\r\n- It's **misleading** — the warning points at a command the user didn't run.\r\n- It **breaks scripting/CI** that reads stderr, since every command (except `version`) emits it.\r\n\r\nDeferring the warning to invocation makes it **accurate and actionable**: it appears exactly once, only when you run the command the warning is actually about, and stderr stays clean for every other command. Same information, delivered at the moment it's relevant instead of on every unrelated call.\r\n\r\n### Behavior\r\n\r\n| Invocation | Before | After |\r\n|---|---|---|\r\n| `atmos list stacks` (with a colliding custom `plan`) | ⚠ warning printed | no warning |\r\n| `atmos <colliding command>` | ⚠ warning printed (and also for every other command) | ⚠ warning printed once, here only |\r\n\r\n## references\r\n\r\n- Refs #2102\r\n- Related: #2191 (introduced the collision guard / warning)\r\n\r\n## test\r\n\r\n```\r\ngo test ./cmd/ -run 'TestCustomCommand_.*Collision|TestCustomCommand_StepsConflictWarning|TestCustomCommand_NamespaceMerge|TestCustomCommand_DeepNesting'\r\n```\r\n\r\nVerified the new test fails against the previous (emit-at-registration) behavior and passes with the fix.\r\n\r\n<!-- This is an auto-generated comment: release notes by coderabbit.ai -->\r\n## Summary by CodeRabbit\r\n\r\n* **Bug Fixes**\r\n  * Collision warnings for custom commands that overlap built-in leaf commands are now deferred until the conflicting command is invoked, reducing startup noise and preserving existing pre-run error behavior.\r\n\r\n* **Tests**\r\n  * Added regression tests to verify deferred warnings are emitted exactly once on invocation and that existing pre-run behavior and error propagation remain intact; tests skip on Windows where stderr capture is unreliable.\r\n<!-- end of auto-generated comment: release notes by coderabbit.ai -->\r\n\r\n</details>\r\n\r\n<details>\r\n  <summary>fix(flags): register --settings-list-merge-strategy as a global flag (#2398) @thejrose1984 (#2540)</summary>\r\n\r\n## what\r\n\r\n* Register `--settings-list-merge-strategy` as a global persistent flag on `RootCmd`, with env binding to `ATMOS_SETTINGS_LIST_MERGE_STRATEGY`.\r\n* Add a Cobra-direct fallback in `ProcessCommandLineArgs` so the value reaches `ConfigAndStacksInfo` even when Cobra strips the flag from `RunE`'s args.\r\n* In `setSettingsConfig`, scan `os.Args` (mirroring `setLogConfig`'s `parseFlags()` pattern) so command paths that call `InitCliConfig` directly with a zero-value `ConfigAndStacksInfo` (e.g. `describe config`) still honor the flag.\r\n* Unit test the registration, inheritance, defaults, CLI value, and env-var path.\r\n\r\n## why\r\n\r\nThe flag is advertised in two places:\r\n\r\n- [`atmos.yaml:344`](https://github.com/cloudposse/atmos/blob/main/atmos.yaml#L344) — *\\\"Can also be set using 'ATMOS_SETTINGS_LIST_MERGE_STRATEGY' environment variable, or '--settings-list-merge-strategy' command-line argument\\\"*\r\n- [`website/docs/cli/configuration/settings/settings.mdx:54`](https://atmos.tools/cli/configuration/settings#list-merge-strategy)\r\n\r\nAnd Atmos's internal arg/flag layer already expects it:\r\n\r\n- `pkg/config/const.go:147` — `SettingsListMergeStrategyFlag = \\\"--settings-list-merge-strategy\\\"`\r\n- `internal/exec/cli_utils.go:72` — listed in `commonFlags`\r\n- `internal/exec/cli_utils.go:495` — string-flag handler that writes `info.SettingsListMergeStrategy`\r\n- `pkg/config/utils.go:726` — applies it onto `atmosConfig.Settings.ListMergeStrategy`\r\n\r\nBut it was never registered with Cobra at the global level. Subcommands that don't whitelist unknown flags (e.g. `terraform plan`, which has no `FParseErrWhitelist`) rejected the flag before the legacy `commonFlags` post-processing ever ran:\r\n\r\n```\r\n$ atmos --settings-list-merge-strategy=append terraform plan vpc -s test\r\nError: unknown flag --settings-list-merge-strategy for command atmos terraform plan\r\n```\r\n\r\n## references\r\n\r\n- Closes #2398\r\n\r\n## test plan\r\n\r\nUnit tests added in `pkg/flags/global_registry_test.go`:\r\n\r\n- `flag is registered on RootCmd as persistent`\r\n- `defaults to empty string`\r\n- `CLI flag value flows through Viper`\r\n- `ATMOS_SETTINGS_LIST_MERGE_STRATEGY env var flows through Viper`\r\n- `subcommand inherits the persistent flag`\r\n\r\nEnd-to-end verification on a minimal project (`atmos.yaml` has `settings.list_merge_strategy: replace`):\r\n\r\n| Invocation | `list_merge_strategy` |\r\n|---|---|\r\n| `atmos describe config` | `replace` (baseline from `atmos.yaml`) |\r\n| `atmos --settings-list-merge-strategy=append describe config` | `append` |\r\n| `atmos describe config --settings-list-merge-strategy=merge` | `merge` |\r\n| `ATMOS_SETTINGS_LIST_MERGE_STRATEGY=append atmos describe config` | `append` |\r\n\r\n`atmos --help` now lists `--settings-list-merge-strategy`.\r\n\r\nFull test suites pass for the touched packages:\r\n\r\n```\r\nok  github.com/cloudposse/atmos/pkg/flags\r\nok  github.com/cloudposse/atmos/pkg/flags/global\r\nok  github.com/cloudposse/atmos/pkg/config\r\nok  github.com/cloudposse/atmos/internal/exec\r\n```\r\n\r\n<!-- This is an auto-generated comment: release notes by coderabbit.ai -->\r\n## Summary by CodeRabbit\r\n\r\n* **New Features**\r\n  * Added --settings-list-merge-strategy CLI flag (replace, append, merge) and ATMOS_SETTINGS_LIST_MERGE_STRATEGY env var to override list-merge behavior for an invocation\r\n* **Documentation**\r\n  * Documented the new flag and environment variable with usage and defaults\r\n* **Tests**\r\n  * Updated CLI help snapshots to include the new flag and refreshed help text formatting across commands\r\n\r\n<!-- review_stack_entry_start -->\r\n\r\n[![Review Change Stack](https://storage.googleapis.com/coderabbit_public_assets/review-stack-in-coderabbit-ui.svg)](https://app.coderabbit.ai/change-stack/cloudposse/atmos/pull/2540?utm_source=github_walkthrough&utm_medium=github&utm_campaign=change_stack)\r\n\r\n<!-- review_stack_entry_end -->\r\n<!-- end of auto-generated comment: release notes by coderabbit.ai -->\r\n</details>\r\n\r\n<details>\r\n  <summary>Fix templated store hook execution @osterman (#2539)</summary>\r\n\r\n## what\r\n\r\n- Render hook execution fields only after a hook matches the current event and skip filters.\r\n- Preserve static hook discovery/preflight while supporting `!template` and bare Go templates in store hook names, output keys, and output values.\r\n- Add regression tests for templated store hooks and non-matching hooks with invalid execution-only templates.\r\n\r\n## why\r\n\r\n- Fixes a regression where templated `store-outputs.name` values were used literally, causing store lookup failures.\r\n- Keeps pre-auth hook discovery safe while allowing execution-time hook fields to use the fully available component context.\r\n- Prevents future regressions for both YAML function and bare Go template forms.\r\n\r\n## references\r\n\r\n- Closes #2538\r\n\r\n\r\n<!-- This is an auto-generated comment: release notes by coderabbit.ai -->\r\n## Summary by CodeRabbit\r\n\r\n* **New Features**\r\n  * Hooks now resolve execution-time templates and custom YAML functions, supporting nested templating, rendering into hook execution fields, stronger type validation, and clearer hook-specific error messages.\r\n\r\n* **Tests**\r\n  * Added tests for template rendering, YAML-function evaluation, nested value processing, error cases, and store-hook execution behavior.\r\n\r\n<!-- review_stack_entry_start -->\r\n\r\n[![Review Change Stack](https://storage.googleapis.com/coderabbit_public_assets/review-stack-in-coderabbit-ui.svg)](https://app.coderabbit.ai/change-stack/cloudposse/atmos/pull/2539?utm_source=github_walkthrough&utm_medium=github&utm_campaign=change_stack)\r\n\r\n<!-- review_stack_entry_end -->\r\n<!-- end of auto-generated comment: release notes by coderabbit.ai -->\r\n</details>\r\n\r\n<details>\r\n  <summary>fix(auth): normalize override keys to uppercase in filterAtmosOverrides (#2349) @thejrose1984 (#2541)</summary>\r\n\r\n## what\r\n\r\n* Uppercase the override key before the prefix check (and in the returned map) inside `pkg/auth/manager_env_overrides.go:filterAtmosOverrides`.\r\n* Add regression test cases in `TestFilterAtmosOverrides` covering Viper-lowercased keys, mixed-case keys, and mixed atmos/non-atmos casings.\r\n\r\n## why\r\n\r\n`filterAtmosOverrides` did a case-sensitive `strings.HasPrefix(k, \\\"ATMOS_\\\")`. The function's documented contract was \\\"only keys with the `ATMOS_*` prefix\\\" — but in production the only realistic source of its input map is an MCP server `env:` block in `atmos.yaml` / `.atmos.d/mcp.yaml`, which Viper loads with **all map keys lowercased**.\r\n\r\nThis is the same Viper-lowercasing pitfall already documented and handled on a sibling code path by `pkg/mcp/client/mcpconfig.go:copyEnv` (the CLI-provider pass-through that writes config files for Claude Code / Codex / Gemini). That fix wasn't applied to the auth code path, so an authored:\r\n\r\n```yaml\r\nmcp:\r\n  servers:\r\n    atmos:\r\n      command: atmos\r\n      args: [\\\"mcp\\\", \\\"start\\\"]\r\n      env:\r\n        ATMOS_PROFILE: managers\r\n      identity: core-root/terraform\r\n```\r\n\r\nreached `filterAtmosOverrides` as `{\\\"atmos_profile\\\": \\\"managers\\\"}`, was silently dropped, and the auth manager was rebuilt against the default profile. Identity resolution then surfaced as:\r\n\r\n```\r\n✗ Server failed to start\r\n   Error: MCP server failed to start: atmos: auth setup failed for \\\"atmos\\\": identity not found: core-root/terraform\r\n```\r\n\r\nI confirmed Viper's lowercasing end-to-end against the actual `schema.MCPServerConfig` shape (`Env map[string]string`):\r\n\r\n```\r\nenv key=\\\"atmos_profile\\\" value=\\\"managers\\\"\r\nenv key=\\\"aws_region\\\"    value=\\\"us-east-1\\\"\r\n```\r\n\r\n— so the authored `ATMOS_PROFILE` is gone by the time the filter runs.\r\n\r\n## scope of behavior change\r\n\r\n* Already-uppercase callers (`ATMOS_PROFILE`): unchanged.\r\n* Previously-dropped lowercase/mixed-case callers (`atmos_profile`, `Atmos_Profile`): now honored — and those are exactly the users hitting the documented bug.\r\n* Non-`ATMOS_*` keys: still dropped, regardless of case (`aws_profile`, `FOO`, `foo`).\r\n* Existing `TestFilterAtmosOverrides` cases still pass unchanged.\r\n* Existing `TestCreateAndAuthenticateManagerWithEnvOverrides_*` tests still pass unchanged.\r\n\r\n## alternatives considered\r\n\r\nI weighed three fix locations on the original issue:\r\n\r\n1. **Uppercase inside `filterAtmosOverrides`** (this PR). Smallest possible surface, single source of truth for the auth path, doesn't touch the MCP layer.\r\n2. **`copyEnv` (or equivalent) inside `ScopedAuthProvider.ForServer`.** Localizes to the MCP adapter; downside is a future non-MCP consumer of `CreateAndAuthenticateManagerWithEnvOverrides` that loads its env map from YAML would hit the same trap.\r\n3. **Uppercase at `ParseConfig` time.** Widest reach — would also affect subprocess env propagation. A real (if narrow) behavior change for users who deliberately set unconventionally-cased env vars in `env:` and expected those passed to the spawned MCP server verbatim.\r\n\r\nOption 1 fixes the documented case without altering any other code path's behavior or risking the subprocess-env corner case in Option 3.\r\n\r\n## references\r\n\r\n* Closes #2349\r\n* Related context: `pkg/mcp/client/mcpconfig.go:128` (`copyEnv`) — the parallel fix on the CLI-provider pass-through path that documents the Viper-lowercasing trap.\r\n\r\n## test plan\r\n\r\n```\r\ngo test ./pkg/auth -run 'TestFilterAtmosOverrides|TestCreateAndAuthenticateManagerWithEnvOverrides' -v\r\ngo test ./pkg/auth ./pkg/mcp/client/...\r\n```\r\n\r\nBoth pass. New regression subtests:\r\n- `viper-lowercased atmos key is normalized to uppercase`\r\n- `mixed-case atmos key is normalized to uppercase`\r\n- `viper-lowercased non-atmos key is dropped`\r\n- `mixed casings across atmos and non-atmos keys`\r\n\r\n<!-- This is an auto-generated comment: release notes by coderabbit.ai -->\r\n\r\n## Summary by CodeRabbit\r\n\r\n## Bug Fixes\r\n\r\n* Fixed an issue where environment configuration overrides specified in lowercase format (from YAML configuration files) were incorrectly dropped during processing. Environment override keys are now properly normalized to ensure consistent handling regardless of the input format used.\r\n\r\n<!-- review_stack_entry_start -->\r\n\r\n[![Review Change Stack](https://storage.googleapis.com/coderabbit_public_assets/review-stack-in-coderabbit-ui.svg)](https://app.coderabbit.ai/change-stack/cloudposse/atmos/pull/2541?utm_source=github_walkthrough&utm_medium=github&utm_campaign=change_stack)\r\n\r\n<!-- review_stack_entry_end -->\r\n\r\n<!-- end of auto-generated comment: release notes by coderabbit.ai -->\r\n</details>\r\n","mentions_count":7},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/336578227","assets_url":"https://api.github.com/repos/cloudposse/atmos/releases/336578227/assets","upload_url":"https://uploads.github.com/repos/cloudposse/atmos/releases/336578227/assets{?name,label}","html_url":"https://github.com/cloudposse/atmos/releases/tag/v1.221.0-test.2","id":336578227,"author":{"login":"cloud-posse-feature-releases[bot]","id":216086508,"node_id":"BOT_kgDODOE37A","avatar_url":"https://avatars.githubusercontent.com/in/1400047?v=4","gravatar_id":"","url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D","html_url":"https://github.com/apps/cloud-posse-feature-releases","followers_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"node_id":"RE_kwDOEW4XoM4UD8az","tag_name":"v1.221.0-test.2","target_commitish":"prd/pro-summary-upload","name":"v1.221.0-test.2","draft":false,"immutable":false,"prerelease":true,"created_at":"2026-06-09T12:46:56Z","updated_at":"2026-06-09T12:54:42Z","published_at":"2026-06-09T12:54:42Z","assets":[{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/442716599","id":442716599,"node_id":"RA_kwDOEW4XoM4aY1G3","name":"atmos_1.221.0-test.2_darwin_amd64","label":"","uploader":{"login":"cloud-posse-feature-releases[bot]","id":216086508,"node_id":"BOT_kgDODOE37A","avatar_url":"https://avatars.githubusercontent.com/in/1400047?v=4","gravatar_id":"","url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D","html_url":"https://github.com/apps/cloud-posse-feature-releases","followers_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":219865376,"digest":"sha256:cfdb9d62baece9a4c57ab2b09d3a993448362ff22b15450d4a6c05ca07060d10","download_count":5,"created_at":"2026-06-09T12:53:45Z","updated_at":"2026-06-09T12:53:51Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.221.0-test.2/atmos_1.221.0-test.2_darwin_amd64"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/442716676","id":442716676,"node_id":"RA_kwDOEW4XoM4aY1IE","name":"atmos_1.221.0-test.2_darwin_arm64","label":"","uploader":{"login":"cloud-posse-feature-releases[bot]","id":216086508,"node_id":"BOT_kgDODOE37A","avatar_url":"https://avatars.githubusercontent.com/in/1400047?v=4","gravatar_id":"","url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D","html_url":"https://github.com/apps/cloud-posse-feature-releases","followers_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":205892018,"digest":"sha256:3ba0b48f63fee34e682bbc167813c69039964763e46249528206f48d005c3b7f","download_count":1,"created_at":"2026-06-09T12:53:51Z","updated_at":"2026-06-09T12:53:58Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.221.0-test.2/atmos_1.221.0-test.2_darwin_arm64"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/442716589","id":442716589,"node_id":"RA_kwDOEW4XoM4aY1Gt","name":"atmos_1.221.0-test.2_freebsd_amd64","label":"","uploader":{"login":"cloud-posse-feature-releases[bot]","id":216086508,"node_id":"BOT_kgDODOE37A","avatar_url":"https://avatars.githubusercontent.com/in/1400047?v=4","gravatar_id":"","url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D","html_url":"https://github.com/apps/cloud-posse-feature-releases","followers_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":214069420,"digest":"sha256:24daa8ebcdfe2f4ee12373299c00078ab3646193de5ce0ab28d9204ae233e53f","download_count":1,"created_at":"2026-06-09T12:53:43Z","updated_at":"2026-06-09T12:53:51Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.221.0-test.2/atmos_1.221.0-test.2_freebsd_amd64"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/442716593","id":442716593,"node_id":"RA_kwDOEW4XoM4aY1Gx","name":"atmos_1.221.0-test.2_freebsd_arm64","label":"","uploader":{"login":"cloud-posse-feature-releases[bot]","id":216086508,"node_id":"BOT_kgDODOE37A","avatar_url":"https://avatars.githubusercontent.com/in/1400047?v=4","gravatar_id":"","url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D","html_url":"https://github.com/apps/cloud-posse-feature-releases","followers_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":198574252,"digest":"sha256:977d0a7bc93f45a9984138e7aa3a3ba69b2949506d13a981018a7b591b793690","download_count":1,"created_at":"2026-06-09T12:53:43Z","updated_at":"2026-06-09T12:53:50Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.221.0-test.2/atmos_1.221.0-test.2_freebsd_arm64"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/442716590","id":442716590,"node_id":"RA_kwDOEW4XoM4aY1Gu","name":"atmos_1.221.0-test.2_linux_386","label":"","uploader":{"login":"cloud-posse-feature-releases[bot]","id":216086508,"node_id":"BOT_kgDODOE37A","avatar_url":"https://avatars.githubusercontent.com/in/1400047?v=4","gravatar_id":"","url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D","html_url":"https://github.com/apps/cloud-posse-feature-releases","followers_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":199823522,"digest":"sha256:28d9200b6c31b0d25ebfb1a78906abc1375071dc1104f4f220847a26ccce6859","download_count":1,"created_at":"2026-06-09T12:53:43Z","updated_at":"2026-06-09T12:53:51Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.221.0-test.2/atmos_1.221.0-test.2_linux_386"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/442716659","id":442716659,"node_id":"RA_kwDOEW4XoM4aY1Hz","name":"atmos_1.221.0-test.2_linux_amd64","label":"","uploader":{"login":"cloud-posse-feature-releases[bot]","id":216086508,"node_id":"BOT_kgDODOE37A","avatar_url":"https://avatars.githubusercontent.com/in/1400047?v=4","gravatar_id":"","url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D","html_url":"https://github.com/apps/cloud-posse-feature-releases","followers_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":214884514,"digest":"sha256:da80fa999d24dde9f59f21965a74405d441ee030cf397c375703e1685d440450","download_count":20,"created_at":"2026-06-09T12:53:50Z","updated_at":"2026-06-09T12:53:59Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.221.0-test.2/atmos_1.221.0-test.2_linux_amd64"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/442716522","id":442716522,"node_id":"RA_kwDOEW4XoM4aY1Fq","name":"atmos_1.221.0-test.2_linux_arm","label":"","uploader":{"login":"cloud-posse-feature-releases[bot]","id":216086508,"node_id":"BOT_kgDODOE37A","avatar_url":"https://avatars.githubusercontent.com/in/1400047?v=4","gravatar_id":"","url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D","html_url":"https://github.com/apps/cloud-posse-feature-releases","followers_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":199884962,"digest":"sha256:954e9b211e8ae5150b14c136fc7caf2e2c69cd993aacc273d96506486c4bc03c","download_count":1,"created_at":"2026-06-09T12:53:35Z","updated_at":"2026-06-09T12:53:42Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.221.0-test.2/atmos_1.221.0-test.2_linux_arm"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/442716524","id":442716524,"node_id":"RA_kwDOEW4XoM4aY1Fs","name":"atmos_1.221.0-test.2_linux_arm64","label":"","uploader":{"login":"cloud-posse-feature-releases[bot]","id":216086508,"node_id":"BOT_kgDODOE37A","avatar_url":"https://avatars.githubusercontent.com/in/1400047?v=4","gravatar_id":"","url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D","html_url":"https://github.com/apps/cloud-posse-feature-releases","followers_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":199360674,"digest":"sha256:74322006523ed3bdd75688b51fcca390b98581896e03cb2167977be76e769c25","download_count":1,"created_at":"2026-06-09T12:53:35Z","updated_at":"2026-06-09T12:53:43Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.221.0-test.2/atmos_1.221.0-test.2_linux_arm64"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/442716680","id":442716680,"node_id":"RA_kwDOEW4XoM4aY1II","name":"atmos_1.221.0-test.2_SHA256SUMS","label":"","uploader":{"login":"cloud-posse-feature-releases[bot]","id":216086508,"node_id":"BOT_kgDODOE37A","avatar_url":"https://avatars.githubusercontent.com/in/1400047?v=4","gravatar_id":"","url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D","html_url":"https://github.com/apps/cloud-posse-feature-releases","followers_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":1107,"digest":"sha256:503fd82d900caf0fcfb4dba5655718a8863caeba9d4d2c54a9f7b8e08ed7bbff","download_count":1,"created_at":"2026-06-09T12:53:52Z","updated_at":"2026-06-09T12:53:52Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.221.0-test.2/atmos_1.221.0-test.2_SHA256SUMS"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/442716672","id":442716672,"node_id":"RA_kwDOEW4XoM4aY1IA","name":"atmos_1.221.0-test.2_windows_386.exe","label":"","uploader":{"login":"cloud-posse-feature-releases[bot]","id":216086508,"node_id":"BOT_kgDODOE37A","avatar_url":"https://avatars.githubusercontent.com/in/1400047?v=4","gravatar_id":"","url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D","html_url":"https://github.com/apps/cloud-posse-feature-releases","followers_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/x-ms-dos-executable","state":"uploaded","size":204168704,"digest":"sha256:21b2196ead04217d6349c67619a8fd0495c80737621ec9fba1df26caf069120e","download_count":1,"created_at":"2026-06-09T12:53:51Z","updated_at":"2026-06-09T12:53:58Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.221.0-test.2/atmos_1.221.0-test.2_windows_386.exe"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/442716523","id":442716523,"node_id":"RA_kwDOEW4XoM4aY1Fr","name":"atmos_1.221.0-test.2_windows_amd64.exe","label":"","uploader":{"login":"cloud-posse-feature-releases[bot]","id":216086508,"node_id":"BOT_kgDODOE37A","avatar_url":"https://avatars.githubusercontent.com/in/1400047?v=4","gravatar_id":"","url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D","html_url":"https://github.com/apps/cloud-posse-feature-releases","followers_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/x-ms-dos-executable","state":"uploaded","size":218575872,"digest":"sha256:4fdf26b9da9e5cd9c83281a9f21ed509bb50e1abca0c34cc33f940c39bb0092c","download_count":1,"created_at":"2026-06-09T12:53:35Z","updated_at":"2026-06-09T12:53:44Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.221.0-test.2/atmos_1.221.0-test.2_windows_amd64.exe"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/442716521","id":442716521,"node_id":"RA_kwDOEW4XoM4aY1Fp","name":"atmos_1.221.0-test.2_windows_arm64.exe","label":"","uploader":{"login":"cloud-posse-feature-releases[bot]","id":216086508,"node_id":"BOT_kgDODOE37A","avatar_url":"https://avatars.githubusercontent.com/in/1400047?v=4","gravatar_id":"","url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D","html_url":"https://github.com/apps/cloud-posse-feature-releases","followers_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/x-ms-dos-executable","state":"uploaded","size":200729088,"digest":"sha256:39eb05d07613d111d28bcc282e7af3574e34b6c54877ab794a95f55720a3b471","download_count":1,"created_at":"2026-06-09T12:53:35Z","updated_at":"2026-06-09T12:53:42Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.221.0-test.2/atmos_1.221.0-test.2_windows_arm64.exe"}],"tarball_url":"https://api.github.com/repos/cloudposse/atmos/tarball/v1.221.0-test.2","zipball_url":"https://api.github.com/repos/cloudposse/atmos/zipball/v1.221.0-test.2","body":"## 🚀 Feature Preview Release\n\nThis is a **feature preview** based on an open pull request. It is intended for testing artifacts and validating functionality before the feature is merged.\n\n> [!WARNING]\n> This release is temporary and may be removed at any time without notice.\n"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/336437093","assets_url":"https://api.github.com/repos/cloudposse/atmos/releases/336437093/assets","upload_url":"https://uploads.github.com/repos/cloudposse/atmos/releases/336437093/assets{?name,label}","html_url":"https://github.com/cloudposse/atmos/releases/tag/v1.221.0-test.1","id":336437093,"author":{"login":"cloud-posse-feature-releases[bot]","id":216086508,"node_id":"BOT_kgDODOE37A","avatar_url":"https://avatars.githubusercontent.com/in/1400047?v=4","gravatar_id":"","url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D","html_url":"https://github.com/apps/cloud-posse-feature-releases","followers_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"node_id":"RE_kwDOEW4XoM4UDZ9l","tag_name":"v1.221.0-test.1","target_commitish":"prd/pro-summary-upload","name":"v1.221.0-test.1","draft":false,"immutable":false,"prerelease":true,"created_at":"2026-06-09T07:57:29Z","updated_at":"2026-06-09T08:02:54Z","published_at":"2026-06-09T08:02:54Z","assets":[{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/442516737","id":442516737,"node_id":"RA_kwDOEW4XoM4aYEUB","name":"atmos_1.221.0-test.1_darwin_amd64","label":"","uploader":{"login":"cloud-posse-feature-releases[bot]","id":216086508,"node_id":"BOT_kgDODOE37A","avatar_url":"https://avatars.githubusercontent.com/in/1400047?v=4","gravatar_id":"","url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D","html_url":"https://github.com/apps/cloud-posse-feature-releases","followers_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":219865376,"digest":"sha256:aa67ac17939130c5234890e1a31cd378f05775a1fecefc6792a6db817082a42b","download_count":0,"created_at":"2026-06-09T08:01:34Z","updated_at":"2026-06-09T08:01:43Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.221.0-test.1/atmos_1.221.0-test.1_darwin_amd64"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/442516803","id":442516803,"node_id":"RA_kwDOEW4XoM4aYEVD","name":"atmos_1.221.0-test.1_darwin_arm64","label":"","uploader":{"login":"cloud-posse-feature-releases[bot]","id":216086508,"node_id":"BOT_kgDODOE37A","avatar_url":"https://avatars.githubusercontent.com/in/1400047?v=4","gravatar_id":"","url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D","html_url":"https://github.com/apps/cloud-posse-feature-releases","followers_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":205892018,"digest":"sha256:37a2233de740965ef7de757367e21a82da3fe12f77f34002944f54d8856eaa54","download_count":0,"created_at":"2026-06-09T08:01:44Z","updated_at":"2026-06-09T08:01:52Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.221.0-test.1/atmos_1.221.0-test.1_darwin_arm64"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/442516841","id":442516841,"node_id":"RA_kwDOEW4XoM4aYEVp","name":"atmos_1.221.0-test.1_freebsd_amd64","label":"","uploader":{"login":"cloud-posse-feature-releases[bot]","id":216086508,"node_id":"BOT_kgDODOE37A","avatar_url":"https://avatars.githubusercontent.com/in/1400047?v=4","gravatar_id":"","url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D","html_url":"https://github.com/apps/cloud-posse-feature-releases","followers_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":214069420,"digest":"sha256:e5eec5b620fc4206bd4055eaf5f26710dcdeda3f6e4fa99e807043c23f6f1ada","download_count":0,"created_at":"2026-06-09T08:01:50Z","updated_at":"2026-06-09T08:01:58Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.221.0-test.1/atmos_1.221.0-test.1_freebsd_amd64"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/442516735","id":442516735,"node_id":"RA_kwDOEW4XoM4aYET_","name":"atmos_1.221.0-test.1_freebsd_arm64","label":"","uploader":{"login":"cloud-posse-feature-releases[bot]","id":216086508,"node_id":"BOT_kgDODOE37A","avatar_url":"https://avatars.githubusercontent.com/in/1400047?v=4","gravatar_id":"","url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D","html_url":"https://github.com/apps/cloud-posse-feature-releases","followers_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":198574252,"digest":"sha256:6aa71aab869486b51df875835483a2e2c907ef0a45ee7dbc7c99a92726a1dc60","download_count":0,"created_at":"2026-06-09T08:01:34Z","updated_at":"2026-06-09T08:01:41Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.221.0-test.1/atmos_1.221.0-test.1_freebsd_arm64"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/442516800","id":442516800,"node_id":"RA_kwDOEW4XoM4aYEVA","name":"atmos_1.221.0-test.1_linux_386","label":"","uploader":{"login":"cloud-posse-feature-releases[bot]","id":216086508,"node_id":"BOT_kgDODOE37A","avatar_url":"https://avatars.githubusercontent.com/in/1400047?v=4","gravatar_id":"","url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D","html_url":"https://github.com/apps/cloud-posse-feature-releases","followers_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":199823522,"digest":"sha256:125ad24c6122793b733623d6f501d88b0706f9a7eee12e3890d44d4a0f7831a9","download_count":0,"created_at":"2026-06-09T08:01:43Z","updated_at":"2026-06-09T08:01:50Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.221.0-test.1/atmos_1.221.0-test.1_linux_386"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/442516738","id":442516738,"node_id":"RA_kwDOEW4XoM4aYEUC","name":"atmos_1.221.0-test.1_linux_amd64","label":"","uploader":{"login":"cloud-posse-feature-releases[bot]","id":216086508,"node_id":"BOT_kgDODOE37A","avatar_url":"https://avatars.githubusercontent.com/in/1400047?v=4","gravatar_id":"","url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D","html_url":"https://github.com/apps/cloud-posse-feature-releases","followers_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":214884514,"digest":"sha256:ff7389b9f398734c3ac574e7e2d68ca7261c5be265fd4841545ce59c01a17ca5","download_count":3,"created_at":"2026-06-09T08:01:34Z","updated_at":"2026-06-09T08:01:42Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.221.0-test.1/atmos_1.221.0-test.1_linux_amd64"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/442516852","id":442516852,"node_id":"RA_kwDOEW4XoM4aYEV0","name":"atmos_1.221.0-test.1_linux_arm","label":"","uploader":{"login":"cloud-posse-feature-releases[bot]","id":216086508,"node_id":"BOT_kgDODOE37A","avatar_url":"https://avatars.githubusercontent.com/in/1400047?v=4","gravatar_id":"","url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D","html_url":"https://github.com/apps/cloud-posse-feature-releases","followers_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":199884962,"digest":"sha256:7cb9ab997327e59817bf0ba6b8b9bca9f65eef7ff9c3471f35f0ec0dd0935c7d","download_count":0,"created_at":"2026-06-09T08:01:52Z","updated_at":"2026-06-09T08:01:58Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.221.0-test.1/atmos_1.221.0-test.1_linux_arm"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/442516792","id":442516792,"node_id":"RA_kwDOEW4XoM4aYEU4","name":"atmos_1.221.0-test.1_linux_arm64","label":"","uploader":{"login":"cloud-posse-feature-releases[bot]","id":216086508,"node_id":"BOT_kgDODOE37A","avatar_url":"https://avatars.githubusercontent.com/in/1400047?v=4","gravatar_id":"","url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D","html_url":"https://github.com/apps/cloud-posse-feature-releases","followers_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":199360674,"digest":"sha256:22918ab2ec2fc73f476c072ac241a1d8c11272c6418ec82d57e32b60f921ce5b","download_count":0,"created_at":"2026-06-09T08:01:42Z","updated_at":"2026-06-09T08:01:47Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.221.0-test.1/atmos_1.221.0-test.1_linux_arm64"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/442516855","id":442516855,"node_id":"RA_kwDOEW4XoM4aYEV3","name":"atmos_1.221.0-test.1_SHA256SUMS","label":"","uploader":{"login":"cloud-posse-feature-releases[bot]","id":216086508,"node_id":"BOT_kgDODOE37A","avatar_url":"https://avatars.githubusercontent.com/in/1400047?v=4","gravatar_id":"","url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D","html_url":"https://github.com/apps/cloud-posse-feature-releases","followers_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":1107,"digest":"sha256:e83b98e3995c7368edb9aa3e91ad08afd47c4eed7f5a944d71aeb44a3f2622cf","download_count":0,"created_at":"2026-06-09T08:01:52Z","updated_at":"2026-06-09T08:01:53Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.221.0-test.1/atmos_1.221.0-test.1_SHA256SUMS"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/442516831","id":442516831,"node_id":"RA_kwDOEW4XoM4aYEVf","name":"atmos_1.221.0-test.1_windows_386.exe","label":"","uploader":{"login":"cloud-posse-feature-releases[bot]","id":216086508,"node_id":"BOT_kgDODOE37A","avatar_url":"https://avatars.githubusercontent.com/in/1400047?v=4","gravatar_id":"","url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D","html_url":"https://github.com/apps/cloud-posse-feature-releases","followers_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/x-ms-dos-executable","state":"uploaded","size":204168704,"digest":"sha256:d5964f774231d2c8d8a6446dfa0903bd785b7e587075392d3fcd52bc57c0015e","download_count":0,"created_at":"2026-06-09T08:01:48Z","updated_at":"2026-06-09T08:01:54Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.221.0-test.1/atmos_1.221.0-test.1_windows_386.exe"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/442516739","id":442516739,"node_id":"RA_kwDOEW4XoM4aYEUD","name":"atmos_1.221.0-test.1_windows_amd64.exe","label":"","uploader":{"login":"cloud-posse-feature-releases[bot]","id":216086508,"node_id":"BOT_kgDODOE37A","avatar_url":"https://avatars.githubusercontent.com/in/1400047?v=4","gravatar_id":"","url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D","html_url":"https://github.com/apps/cloud-posse-feature-releases","followers_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/x-ms-dos-executable","state":"uploaded","size":218575872,"digest":"sha256:36e4f1a7df5f54a10b8873aba48bb979b4b144fc417e58944dfb6b74b3b722cc","download_count":0,"created_at":"2026-06-09T08:01:34Z","updated_at":"2026-06-09T08:01:44Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.221.0-test.1/atmos_1.221.0-test.1_windows_amd64.exe"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/442516806","id":442516806,"node_id":"RA_kwDOEW4XoM4aYEVG","name":"atmos_1.221.0-test.1_windows_arm64.exe","label":"","uploader":{"login":"cloud-posse-feature-releases[bot]","id":216086508,"node_id":"BOT_kgDODOE37A","avatar_url":"https://avatars.githubusercontent.com/in/1400047?v=4","gravatar_id":"","url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D","html_url":"https://github.com/apps/cloud-posse-feature-releases","followers_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/x-ms-dos-executable","state":"uploaded","size":200729088,"digest":"sha256:1e0186864f00a65c5d6f71bdb442f574b5287030a531ff54c8a71ba7b728e1c7","download_count":0,"created_at":"2026-06-09T08:01:44Z","updated_at":"2026-06-09T08:01:51Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.221.0-test.1/atmos_1.221.0-test.1_windows_arm64.exe"}],"tarball_url":"https://api.github.com/repos/cloudposse/atmos/tarball/v1.221.0-test.1","zipball_url":"https://api.github.com/repos/cloudposse/atmos/zipball/v1.221.0-test.1","body":"## 🚀 Feature Preview Release\n\nThis is a **feature preview** based on an open pull request. It is intended for testing artifacts and validating functionality before the feature is merged.\n\n> [!WARNING]\n> This release is temporary and may be removed at any time without notice.\n"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/336968661","assets_url":"https://api.github.com/repos/cloudposse/atmos/releases/336968661/assets","upload_url":"https://uploads.github.com/repos/cloudposse/atmos/releases/336968661/assets{?name,label}","html_url":"https://github.com/cloudposse/atmos/releases/tag/v1.221.0-rc.7","id":336968661,"author":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"node_id":"RE_kwDOEW4XoM4UFbvV","tag_name":"v1.221.0-rc.7","target_commitish":"main","name":"v1.221.0-rc.7","draft":false,"immutable":false,"prerelease":true,"created_at":"2026-06-09T23:09:18Z","updated_at":"2026-06-10T02:02:39Z","published_at":"2026-06-10T02:02:39Z","assets":[{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/443267284","id":443267284,"node_id":"RA_kwDOEW4XoM4aa7jU","name":"atmos_1.221.0-rc.7_darwin_amd64","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":219919344,"digest":"sha256:4916d6aa1c88be767cda106137986fe3bf0460eef62667132e707bd4f122fadb","download_count":0,"created_at":"2026-06-10T02:01:16Z","updated_at":"2026-06-10T02:01:23Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.221.0-rc.7/atmos_1.221.0-rc.7_darwin_amd64"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/443267283","id":443267283,"node_id":"RA_kwDOEW4XoM4aa7jT","name":"atmos_1.221.0-rc.7_darwin_arm64","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":205925794,"digest":"sha256:0eee06a8623b3f91fdeac6a9c684d02e41e234998a6059de6dcbd6650c9bf4f8","download_count":0,"created_at":"2026-06-10T02:01:16Z","updated_at":"2026-06-10T02:01:23Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.221.0-rc.7/atmos_1.221.0-rc.7_darwin_arm64"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/443267203","id":443267203,"node_id":"RA_kwDOEW4XoM4aa7iD","name":"atmos_1.221.0-rc.7_freebsd_amd64","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":214122668,"digest":"sha256:59ffdc0c057de16069d6303d9475b135cae2f6bf0738c5d8ebcd34e883f716d3","download_count":0,"created_at":"2026-06-10T02:01:07Z","updated_at":"2026-06-10T02:01:15Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.221.0-rc.7/atmos_1.221.0-rc.7_freebsd_amd64"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/443267201","id":443267201,"node_id":"RA_kwDOEW4XoM4aa7iB","name":"atmos_1.221.0-rc.7_freebsd_arm64","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":198574252,"digest":"sha256:ad317d4ebc3df1e7866b42b665e6f359ee24157c84d67773288d1a35bd81ef74","download_count":1,"created_at":"2026-06-10T02:01:07Z","updated_at":"2026-06-10T02:01:16Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.221.0-rc.7/atmos_1.221.0-rc.7_freebsd_arm64"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/443267332","id":443267332,"node_id":"RA_kwDOEW4XoM4aa7kE","name":"atmos_1.221.0-rc.7_linux_386","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":199864482,"digest":"sha256:9592d7e236e5d56a5662a1e525d882c1091985899052e7b4a550286a35d46a5a","download_count":0,"created_at":"2026-06-10T02:01:23Z","updated_at":"2026-06-10T02:01:30Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.221.0-rc.7/atmos_1.221.0-rc.7_linux_386"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/443267202","id":443267202,"node_id":"RA_kwDOEW4XoM4aa7iC","name":"atmos_1.221.0-rc.7_linux_amd64","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":214937762,"digest":"sha256:701c6d00812652ea1e1f7adbc8fbc07624e032f9572c0094795c1a352b390533","download_count":0,"created_at":"2026-06-10T02:01:07Z","updated_at":"2026-06-10T02:01:17Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.221.0-rc.7/atmos_1.221.0-rc.7_linux_amd64"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/443267294","id":443267294,"node_id":"RA_kwDOEW4XoM4aa7je","name":"atmos_1.221.0-rc.7_linux_arm","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":200016034,"digest":"sha256:c1e568f334a70828f744dc769a6f9327ff5b0427ed5cf36780e28da54c25c577","download_count":1,"created_at":"2026-06-10T02:01:17Z","updated_at":"2026-06-10T02:01:23Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.221.0-rc.7/atmos_1.221.0-rc.7_linux_arm"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/443267199","id":443267199,"node_id":"RA_kwDOEW4XoM4aa7h_","name":"atmos_1.221.0-rc.7_linux_arm64","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":199360674,"digest":"sha256:dd106228305169e17cdab6a98e9c3294a7b2eee77f9c214d640f842f7edbd213","download_count":0,"created_at":"2026-06-10T02:01:07Z","updated_at":"2026-06-10T02:01:16Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.221.0-rc.7/atmos_1.221.0-rc.7_linux_arm64"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/443267336","id":443267336,"node_id":"RA_kwDOEW4XoM4aa7kI","name":"atmos_1.221.0-rc.7_SHA256SUMS","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":1085,"digest":"sha256:07d995ac728343dce689953a5e88d3c68b29345415541a16c2d07d3c21218bcf","download_count":0,"created_at":"2026-06-10T02:01:24Z","updated_at":"2026-06-10T02:01:24Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.221.0-rc.7/atmos_1.221.0-rc.7_SHA256SUMS"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/443267333","id":443267333,"node_id":"RA_kwDOEW4XoM4aa7kF","name":"atmos_1.221.0-rc.7_windows_386.exe","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/x-ms-dos-executable","state":"uploaded","size":204210176,"digest":"sha256:82fe8949a581f577721d4b0bba05be01a6d7e5e0dce73191b88b56fdb350e6b4","download_count":0,"created_at":"2026-06-10T02:01:23Z","updated_at":"2026-06-10T02:01:29Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.221.0-rc.7/atmos_1.221.0-rc.7_windows_386.exe"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/443267325","id":443267325,"node_id":"RA_kwDOEW4XoM4aa7j9","name":"atmos_1.221.0-rc.7_windows_amd64.exe","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/x-ms-dos-executable","state":"uploaded","size":218628608,"digest":"sha256:88ca2fbb447941832d9a0ac9d0b2b804e4b1309be625bd05192dae4b63913544","download_count":0,"created_at":"2026-06-10T02:01:22Z","updated_at":"2026-06-10T02:01:29Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.221.0-rc.7/atmos_1.221.0-rc.7_windows_amd64.exe"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/443267272","id":443267272,"node_id":"RA_kwDOEW4XoM4aa7jI","name":"atmos_1.221.0-rc.7_windows_arm64.exe","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/x-ms-dos-executable","state":"uploaded","size":200763904,"digest":"sha256:bb0a825cf235dd8e5c7307560b17b7bc59727c47b888af853733a99b8fcae7fa","download_count":0,"created_at":"2026-06-10T02:01:15Z","updated_at":"2026-06-10T02:01:22Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.221.0-rc.7/atmos_1.221.0-rc.7_windows_arm64.exe"}],"tarball_url":"https://api.github.com/repos/cloudposse/atmos/tarball/v1.221.0-rc.7","zipball_url":"https://api.github.com/repos/cloudposse/atmos/zipball/v1.221.0-rc.7","body":"<details>\n  <summary>feat: describe affected evaluates all provisioned component sections @osterman (#2573)</summary>\n## what\n\n- Fix `atmos describe affected` so it detects changes in **every** provisioned component section, not just `vars`/`env`/`settings`/`metadata`/`source`/`provision`.\n- Newly evaluated sections: `providers`, `required_providers` (provider versions), `required_version`, `hooks`, `generate`, `backend`, `backend_type`, `remote_state_backend`, `remote_state_backend_type`, `auth`, `command`, and `dependencies` — including scalar sections (previously only map sections were compared).\n- Add a configurable `describe.affected.sections` setting in `atmos.yaml` that fully replaces the evaluated set (e.g. to track a custom section or narrow the list); `metadata`/`settings` are always evaluated.\n- Refactor the three component processors to a single table-driven comparison, add a documented \"Evaluated sections\" list, tests, a changelog blog post, and a roadmap milestone.\n\n## why\n\n- The comparison ran against a hand-maintained allow-list that had drifted out of sync with what Atmos actually merges into a component, so changes to `providers`, `hooks`, provider versions, `backend`, etc. were silently missed — a false negative that could let CI pipelines skip components that genuinely changed.\n- The table is now tied (via comments) to the sections written in `stack_processor_merge.go`, and the new config setting gives users an escape hatch so the bug class can't quietly return.\n- `locals`, `overrides`, `inheritance`, and `retry` are intentionally excluded (they either fold into other sections or are execution-time only).\n\n## references\n\n- Docs: [Evaluated sections](https://atmos.tools/cli/commands/describe/affected#evaluated-sections) and [`describe.affected.sections`](https://atmos.tools/cli/configuration/describe)\n\n\n<!-- This is an auto-generated comment: release notes by coderabbit.ai -->\n## Summary by CodeRabbit\n\n* **New Features**\n  * Describe now evaluates and reports changes across a comprehensive set of top-level component sections (including scalar sections) with per-section reasons; first changed section becomes the headline reason.\n  * Added configurable describe.affected.sections to fully replace the default evaluated set (metadata/settings remain always evaluated).\n\n* **Documentation**\n  * Blog and CLI/config docs updated with evaluated-sections details, output reason entries, and configuration examples.\n\n* **Tests**\n  * Added tests for section evaluation, equality behavior, remote-locator logic, and override/no-false-positive cases.\n\n* **Chores**\n  * Updated snapshots, roadmap, CI workflow pins, link-checker exclusions, and changelog guidance.\n<!-- end of auto-generated comment: release notes by coderabbit.ai -->\n</details>\n\n<details>\n  <summary>feat(hooks): terraform init lifecycle hooks + --skip-hooks before-* fix @osterman (#2574)</summary>\n## what\n\n- **Fix `--skip-hooks` for before-* hooks.** Previously it only skipped `after-*` hooks; `before-terraform-plan/apply/deploy` hooks ran regardless. Now `--skip-hooks` (skip all) and `--skip-hooks=name1,name2` (skip by name) are honored symmetrically for before and after events.\n- **Add `before-terraform-init` and `after-terraform-init` lifecycle hooks** for the `atmos terraform init` command. `after-terraform-init` is new; `before-terraform-init` was documented but never dispatched to user hooks — now it fires. They run through the same `runHooks`/`RunAll` path, so the skip fix applies to them too.\n- Add tests (real parsed Cobra flag, not `viper.Set`), strengthen hook-inheritance coverage with a fixture proving top-level `terraform.hooks:` is inherited by every component (and `components.terraform.hooks:` is not), update the Hooks docs, blog post, and roadmap.\n\n## why\n\n- `--skip-hooks` is a global flag bound to Viper inside `RunE`, but before-* hooks run earlier in `PreRunE` — so `viper.GetString(\"skip-hooks\")` never saw the CLI value and before-hooks fired anyway. The flag is now resolved directly from the parsed command (Viper/`ATMOS_SKIP_HOOKS` fallback), mirroring how `--ci` and `--verbose` are read in `PreRunE`.\n- Init had no user-hook surface at all: `init.go` wired no hooks and the `BeforeTerraformInit` event was never dispatched. Wiring `PreRunE`/`PostRunE` on the init command (like plan/apply/deploy) closes the lifecycle gap so teams can validate tooling, vendor sources, or notify systems around `terraform init` declaratively.\n- The previous skip tests injected via `viper.Set` with a `nil` command, sidestepping the exact flag-binding lifecycle that was broken — which is how the bug shipped; the new tests fail against the old implementation.\n\n## references\n\n- Hooks documentation: `/stacks/hooks`\n- Note: `before-/after-terraform-init` fire on the explicit `atmos terraform init`, not the implicit init that plan/apply run.\n\n\n<!-- This is an auto-generated comment: release notes by coderabbit.ai -->\n## Summary by CodeRabbit\n\n* **New Features**\n  * Added Terraform init lifecycle event: after-terraform-init (alongside before-terraform-init); Terraform-scoped default hooks can be inherited by Terraform components.\n* **Bug Fixes**\n  * Fixed --skip-hooks precedence so CLI flag reliably overrides env/config and consistently skips before/after hook phases.\n  * Clarified hook scope handling so misplaced hook keys aren’t incorrectly applied.\n* **Documentation**\n  * Blog, docs, and roadmap updated to describe init hook events and skip-hooks behavior.\n* **Tests**\n  * Expanded coverage for hook inheritance, scope, init wiring, event filtering, and skip-hooks CLI behavior.\n* **Chores**\n  * CI Codecov step made non-fatal for transient upload errors.\n<!-- end of auto-generated comment: release notes by coderabbit.ai -->\n</details>\n\n<details>\n  <summary>feat(auth): share single OIDC session across aws/iam-identity-center providers @Benbentwo (#2553)</summary>\n## what\n\n- Refactors the `aws/iam-identity-center` (AWS SSO) provider so that multiple providers pointing at the same SSO portal (identical `start_url` + `region`) share a single OIDC token — one browser flow now unlocks every provider instead of one flow per provider.\n- Adds silent refresh-token renewal via `ssooidc:CreateToken` with `grant_type=refresh_token`, so a single browser interaction holds for the full portal session (~8h) rather than re-prompting every hour.\n- Introduces an in-process `sessionTokenStore` (keyed by `sha1(start_url|region)`) with per-session mutexes that single-flight concurrent device-auth flows; re-keys the on-disk cache from `aws-sso/<provider>/token.json` to `aws-sso/sessions/<sha1>.json` in the AWS SDK `ssocreds`-compatible format.\n- Adds the design PRD (`docs/prd/aws-sso-session-support.md`), a changelog blog post, and a shipped roadmap milestone under the Unified Authentication initiative.\n\n## why\n\n- A common setup has one provider per environment (dev/staging/prod) all backed by the same corporate SSO portal; previously `atmos auth login` launched the browser flow once per provider, contradicting AWS's own \"credentials have been shared successfully\" single-sign-in experience.\n- The legacy flow re-ran the full browser interaction on every ~1h access-token expiry and keyed its cache by provider name, so renaming a provider silently invalidated a still-valid token — both are eliminated here with zero `atmos.yaml` config changes.\n\n## references\n\n- PRD: `docs/prd/aws-sso-session-support.md`\n- AWS CLI token provider docs: https://docs.aws.amazon.com/cli/latest/userguide/sso-configure-profile-token.html\n- AWS SDK for Go v2 `ssocreds`: https://pkg.go.dev/github.com/aws/aws-sdk-go-v2/credentials/ssocreds\n\n\n<!-- This is an auto-generated comment: release notes by coderabbit.ai -->\n## Summary by CodeRabbit\n\n* **New Features**\n  * Shared AWS SSO sessions across providers for the same portal (start URL + region), reducing duplicate logins and browser prompts.\n  * Silent refresh via refresh tokens to renew credentials without a browser; per-session locking prevents concurrent device-auth flows.\n  * Session-keyed on-disk cache (compatible with AWS SDK patterns); logout clears shared session data; added session telemetry.\n\n* **Documentation**\n  * Product spec and blog post describing session sharing, cache format, refresh behavior, and rollout plan.\n\n* **Tests**\n  * Added/updated tests validating session sharing, cache semantics, isolation, refresh logic, and concurrency.\n<!-- end of auto-generated comment: release notes by coderabbit.ai -->\n</details>\n\n<details>\n  <summary>feat: implement !append YAML function for list concatenation @osterman (#1513)</summary>\n## what\n- Implements the `!append` YAML function that allows fine-grained control over list merging behavior in Atmos stack configurations\n- Lists tagged with `!append` will be concatenated with base values instead of replaced\n- Adds comprehensive unit tests and integration test fixtures\n\n## why\n- Resolves the ongoing challenge of needing to concatenate lists on a case-by-case basis\n- Currently, users have to fall back to using maps instead of lists when they need append behavior\n- This is particularly important for fields like `depends_on` where appending is often the desired behavior rather than replacement\n- The `!append` tag provides opt-in, per-field control that works alongside the global `list_merge_strategy` setting\n\n## Key Features\n- **Opt-in behavior**: Only lists explicitly tagged with `!append` use append mode\n- **Works alongside global settings**: The `!append` tag works independently of the global `list_merge_strategy` setting\n- **Nested support**: Works with deeply nested configurations\n- **Backward compatible**: No impact on existing configurations without the tag\n\n## Example Usage\n```yaml\n# base.yaml\ncomponents:\n  terraform:\n    eks:\n      settings:\n        depends_on:\n          - vpc\n          - iam-role\n\n# override.yaml\ncomponents:\n  terraform:\n    eks:\n      settings:\n        depends_on: !append  # This tag indicates append mode\n          - rds\n          - elasticache\n          \n# Result: depends_on = [vpc, iam-role, rds, elasticache]\n```\n\n## Testing\n- ✅ All unit tests pass\n- ✅ Build succeeds without errors\n- ✅ Linting passes with no issues\n- ✅ Code follows Atmos conventions and patterns\n\n## references\n- Linear issue: [DEV-2980](https://linear.app/cloudposse/issue/DEV-2980/implement-append-function)\n- Documentation: [`!append` YAML function](https://atmos.tools/functions/yaml/append)\n- Changelog: blog post `append-yaml-function`; roadmap milestone updated (Extensibility initiative)\n\n🤖 Generated with [Claude Code](https://claude.ai/code)\n\n<!-- This is an auto-generated comment: release notes by coderabbit.ai -->\n## Summary by CodeRabbit\n\n- **New Features**\n  - Added a !append YAML function to append items to lists during configuration merging (per-field, preserves order, supports nested lists/maps, interacts with global list-merge strategies).\n- **Tests**\n  - Added comprehensive unit and integration tests covering append-tag helpers, parsing, merging, and end-to-end scenarios.\n- **Documentation**\n  - Added docs, examples, blog post, and index updates explaining !append usage and behavior.\n- **Chores**\n  - Updated website roadmap/metadata and package config; added a sentinel error alias.\n<!-- end of auto-generated comment: release notes by coderabbit.ai -->\n\n</details>\n\n\n## 🚀 Enhancements\n\n<details>\n  <summary>fix(stacks): honor component list_merge_strategy in metadata.inherits… @JaseKoonce (#2565)</summary>\n\r\n\r\n## what\r\n\r\n- settings.list_merge_strategy set on a component now applies when merging lists via metadata.inherits\r\n\r\n- Adds tests covering append, replace, and merge strategies across single and multi-level inheritance\r\n  chains\r\n\r\n## why\r\n\r\n  - Component-level list_merge_strategy was only honored on the import/stack merge path (fixed in #2480).\r\n  The metadata.inherits resolution path always used the global atmosConfig, so per-component overrides were\r\n  silently ignored\r\n\r\n  - A component with list_merge_strategy: append inheriting two bases would get last-wins ([from_b]) instead\r\n  of the expected accumulated result ([from_a, from_b])\r\n\r\n## references\r\n\r\n  - Closes #2396\r\n  - Follow-up to #2480\r\n\n\n<!-- This is an auto-generated comment: release notes by coderabbit.ai -->\n## Summary by CodeRabbit\n\n* **Improvements**\n  * Component inheritance now applies per-component list merge strategies during metadata-based inheritance so inherited lists are accumulated, replaced, or merged by index according to the inheriting component’s settings across multi-level chains.\n\n* **Tests**\n  * Added integration tests and fixture scenarios validating append, replace, multi-level append, and merge-by-index behaviors for metadata inheritance.\n<!-- end of auto-generated comment: release notes by coderabbit.ai -->\n</details>\n","mentions_count":3},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/336268870","assets_url":"https://api.github.com/repos/cloudposse/atmos/releases/336268870/assets","upload_url":"https://uploads.github.com/repos/cloudposse/atmos/releases/336268870/assets{?name,label}","html_url":"https://github.com/cloudposse/atmos/releases/tag/v1.221.0-test.0","id":336268870,"author":{"login":"cloud-posse-feature-releases[bot]","id":216086508,"node_id":"BOT_kgDODOE37A","avatar_url":"https://avatars.githubusercontent.com/in/1400047?v=4","gravatar_id":"","url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D","html_url":"https://github.com/apps/cloud-posse-feature-releases","followers_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"node_id":"RE_kwDOEW4XoM4UCw5G","tag_name":"v1.221.0-test.0","target_commitish":"prd/pro-summary-upload","name":"v1.221.0-test.0","draft":false,"immutable":false,"prerelease":true,"created_at":"2026-06-08T22:03:55Z","updated_at":"2026-06-08T22:48:31Z","published_at":"2026-06-08T22:48:31Z","assets":[{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/442155705","id":442155705,"node_id":"RA_kwDOEW4XoM4aWsK5","name":"atmos_1.221.0-test.0_darwin_amd64","label":"","uploader":{"login":"cloud-posse-feature-releases[bot]","id":216086508,"node_id":"BOT_kgDODOE37A","avatar_url":"https://avatars.githubusercontent.com/in/1400047?v=4","gravatar_id":"","url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D","html_url":"https://github.com/apps/cloud-posse-feature-releases","followers_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":219865376,"digest":"sha256:39636f1b76a61f9f005874892940fb5c418752a4d6f59e0b50a9b2927032765c","download_count":1,"created_at":"2026-06-08T22:46:18Z","updated_at":"2026-06-08T22:46:25Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.221.0-test.0/atmos_1.221.0-test.0_darwin_amd64"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/442155643","id":442155643,"node_id":"RA_kwDOEW4XoM4aWsJ7","name":"atmos_1.221.0-test.0_darwin_arm64","label":"","uploader":{"login":"cloud-posse-feature-releases[bot]","id":216086508,"node_id":"BOT_kgDODOE37A","avatar_url":"https://avatars.githubusercontent.com/in/1400047?v=4","gravatar_id":"","url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D","html_url":"https://github.com/apps/cloud-posse-feature-releases","followers_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":205892018,"digest":"sha256:6d50b2e1c09e6e500dd2d36d510b02965f367ec83f731f30683b005ac38f0569","download_count":1,"created_at":"2026-06-08T22:46:10Z","updated_at":"2026-06-08T22:46:17Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.221.0-test.0/atmos_1.221.0-test.0_darwin_arm64"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/442155772","id":442155772,"node_id":"RA_kwDOEW4XoM4aWsL8","name":"atmos_1.221.0-test.0_freebsd_amd64","label":"","uploader":{"login":"cloud-posse-feature-releases[bot]","id":216086508,"node_id":"BOT_kgDODOE37A","avatar_url":"https://avatars.githubusercontent.com/in/1400047?v=4","gravatar_id":"","url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D","html_url":"https://github.com/apps/cloud-posse-feature-releases","followers_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":214069420,"digest":"sha256:5d3ba45f22d7d33f205c2bffd752dd0151fb73a591c6c04231898296d0d9f59e","download_count":1,"created_at":"2026-06-08T22:46:25Z","updated_at":"2026-06-08T22:46:33Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.221.0-test.0/atmos_1.221.0-test.0_freebsd_amd64"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/442155780","id":442155780,"node_id":"RA_kwDOEW4XoM4aWsME","name":"atmos_1.221.0-test.0_freebsd_arm64","label":"","uploader":{"login":"cloud-posse-feature-releases[bot]","id":216086508,"node_id":"BOT_kgDODOE37A","avatar_url":"https://avatars.githubusercontent.com/in/1400047?v=4","gravatar_id":"","url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D","html_url":"https://github.com/apps/cloud-posse-feature-releases","followers_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":198574252,"digest":"sha256:c64f79994210a3bb0bfa9e9d3826a18c1eaac3102cba191f6fb2de1511ca6886","download_count":1,"created_at":"2026-06-08T22:46:26Z","updated_at":"2026-06-08T22:46:32Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.221.0-test.0/atmos_1.221.0-test.0_freebsd_arm64"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/442155644","id":442155644,"node_id":"RA_kwDOEW4XoM4aWsJ8","name":"atmos_1.221.0-test.0_linux_386","label":"","uploader":{"login":"cloud-posse-feature-releases[bot]","id":216086508,"node_id":"BOT_kgDODOE37A","avatar_url":"https://avatars.githubusercontent.com/in/1400047?v=4","gravatar_id":"","url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D","html_url":"https://github.com/apps/cloud-posse-feature-releases","followers_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":199823522,"digest":"sha256:9e0ed35dfe9ebd0e67fe9c9a15deac1411a8ca75c73effff34d544de620c9ffd","download_count":1,"created_at":"2026-06-08T22:46:10Z","updated_at":"2026-06-08T22:46:17Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.221.0-test.0/atmos_1.221.0-test.0_linux_386"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/442155700","id":442155700,"node_id":"RA_kwDOEW4XoM4aWsK0","name":"atmos_1.221.0-test.0_linux_amd64","label":"","uploader":{"login":"cloud-posse-feature-releases[bot]","id":216086508,"node_id":"BOT_kgDODOE37A","avatar_url":"https://avatars.githubusercontent.com/in/1400047?v=4","gravatar_id":"","url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D","html_url":"https://github.com/apps/cloud-posse-feature-releases","followers_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":214884514,"digest":"sha256:381c13293495234e82fa891e33a9fa3174e2decc737ab2ec4780979682542893","download_count":6,"created_at":"2026-06-08T22:46:17Z","updated_at":"2026-06-08T22:46:25Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.221.0-test.0/atmos_1.221.0-test.0_linux_amd64"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/442155645","id":442155645,"node_id":"RA_kwDOEW4XoM4aWsJ9","name":"atmos_1.221.0-test.0_linux_arm","label":"","uploader":{"login":"cloud-posse-feature-releases[bot]","id":216086508,"node_id":"BOT_kgDODOE37A","avatar_url":"https://avatars.githubusercontent.com/in/1400047?v=4","gravatar_id":"","url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D","html_url":"https://github.com/apps/cloud-posse-feature-releases","followers_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":199884962,"digest":"sha256:5a78c8a309b213c2c4087544fba8254d31c0ac7157f3d18fdcfe75a109f02aaf","download_count":1,"created_at":"2026-06-08T22:46:10Z","updated_at":"2026-06-08T22:46:18Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.221.0-test.0/atmos_1.221.0-test.0_linux_arm"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/442155703","id":442155703,"node_id":"RA_kwDOEW4XoM4aWsK3","name":"atmos_1.221.0-test.0_linux_arm64","label":"","uploader":{"login":"cloud-posse-feature-releases[bot]","id":216086508,"node_id":"BOT_kgDODOE37A","avatar_url":"https://avatars.githubusercontent.com/in/1400047?v=4","gravatar_id":"","url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D","html_url":"https://github.com/apps/cloud-posse-feature-releases","followers_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":199360674,"digest":"sha256:115f1c5c6f7affdaf4123a134b86c363dd598069ef29ba29e5faf26a2e712728","download_count":1,"created_at":"2026-06-08T22:46:18Z","updated_at":"2026-06-08T22:46:26Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.221.0-test.0/atmos_1.221.0-test.0_linux_arm64"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/442155781","id":442155781,"node_id":"RA_kwDOEW4XoM4aWsMF","name":"atmos_1.221.0-test.0_SHA256SUMS","label":"","uploader":{"login":"cloud-posse-feature-releases[bot]","id":216086508,"node_id":"BOT_kgDODOE37A","avatar_url":"https://avatars.githubusercontent.com/in/1400047?v=4","gravatar_id":"","url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D","html_url":"https://github.com/apps/cloud-posse-feature-releases","followers_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":1107,"digest":"sha256:c79645307569c048b31ac5b59a0629c5c346136d5046916a13a47b20140c058d","download_count":1,"created_at":"2026-06-08T22:46:26Z","updated_at":"2026-06-08T22:46:27Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.221.0-test.0/atmos_1.221.0-test.0_SHA256SUMS"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/442155642","id":442155642,"node_id":"RA_kwDOEW4XoM4aWsJ6","name":"atmos_1.221.0-test.0_windows_386.exe","label":"","uploader":{"login":"cloud-posse-feature-releases[bot]","id":216086508,"node_id":"BOT_kgDODOE37A","avatar_url":"https://avatars.githubusercontent.com/in/1400047?v=4","gravatar_id":"","url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D","html_url":"https://github.com/apps/cloud-posse-feature-releases","followers_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/x-ms-dos-executable","state":"uploaded","size":204168704,"digest":"sha256:a482f513ce765105fa6fdbb0a3a5761ea19226c112c93345ffc341038fbf11dd","download_count":1,"created_at":"2026-06-08T22:46:10Z","updated_at":"2026-06-08T22:46:17Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.221.0-test.0/atmos_1.221.0-test.0_windows_386.exe"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/442155771","id":442155771,"node_id":"RA_kwDOEW4XoM4aWsL7","name":"atmos_1.221.0-test.0_windows_amd64.exe","label":"","uploader":{"login":"cloud-posse-feature-releases[bot]","id":216086508,"node_id":"BOT_kgDODOE37A","avatar_url":"https://avatars.githubusercontent.com/in/1400047?v=4","gravatar_id":"","url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D","html_url":"https://github.com/apps/cloud-posse-feature-releases","followers_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/x-ms-dos-executable","state":"uploaded","size":218575872,"digest":"sha256:5ce9e8c0f68a1869eba1950064fa1e8502069c024913e3a7344f4b2513ee773e","download_count":1,"created_at":"2026-06-08T22:46:25Z","updated_at":"2026-06-08T22:46:32Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.221.0-test.0/atmos_1.221.0-test.0_windows_amd64.exe"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/442155710","id":442155710,"node_id":"RA_kwDOEW4XoM4aWsK-","name":"atmos_1.221.0-test.0_windows_arm64.exe","label":"","uploader":{"login":"cloud-posse-feature-releases[bot]","id":216086508,"node_id":"BOT_kgDODOE37A","avatar_url":"https://avatars.githubusercontent.com/in/1400047?v=4","gravatar_id":"","url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D","html_url":"https://github.com/apps/cloud-posse-feature-releases","followers_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloud-posse-feature-releases%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/x-ms-dos-executable","state":"uploaded","size":200729088,"digest":"sha256:8b13276d3809f3124e1f4e254918c74071cd22569c4fcd2a7b2b51f693d3a5d0","download_count":1,"created_at":"2026-06-08T22:46:19Z","updated_at":"2026-06-08T22:46:26Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.221.0-test.0/atmos_1.221.0-test.0_windows_arm64.exe"}],"tarball_url":"https://api.github.com/repos/cloudposse/atmos/tarball/v1.221.0-test.0","zipball_url":"https://api.github.com/repos/cloudposse/atmos/zipball/v1.221.0-test.0","body":"## 🚀 Feature Preview Release\n\nThis is a **feature preview** based on an open pull request. It is intended for testing artifacts and validating functionality before the feature is merged.\n\n> [!WARNING]\n> This release is temporary and may be removed at any time without notice.\n"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/335513447","assets_url":"https://api.github.com/repos/cloudposse/atmos/releases/335513447/assets","upload_url":"https://uploads.github.com/repos/cloudposse/atmos/releases/335513447/assets{?name,label}","html_url":"https://github.com/cloudposse/atmos/releases/tag/v1.221.0-rc.6","id":335513447,"author":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"node_id":"RE_kwDOEW4XoM4T_4dn","tag_name":"v1.221.0-rc.6","target_commitish":"main","name":"v1.221.0-rc.6","draft":false,"immutable":false,"prerelease":true,"created_at":"2026-06-06T15:02:53Z","updated_at":"2026-06-07T02:06:54Z","published_at":"2026-06-07T02:06:54Z","assets":[{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/440606840","id":440606840,"node_id":"RA_kwDOEW4XoM4aQyB4","name":"atmos_1.221.0-rc.6_darwin_amd64","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":219861184,"digest":"sha256:1a00f413d10ae352fd0cc5315478eacb085d61ca5921492efba99bb177813c8d","download_count":1,"created_at":"2026-06-07T02:05:54Z","updated_at":"2026-06-07T02:06:01Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.221.0-rc.6/atmos_1.221.0-rc.6_darwin_amd64"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/440606844","id":440606844,"node_id":"RA_kwDOEW4XoM4aQyB8","name":"atmos_1.221.0-rc.6_darwin_arm64","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":205891922,"digest":"sha256:d8b32a178a4bb1b488f0e1435fc2f344c6daca4c898a21d50e4f1f3e0b094656","download_count":1,"created_at":"2026-06-07T02:05:55Z","updated_at":"2026-06-07T02:06:01Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.221.0-rc.6/atmos_1.221.0-rc.6_darwin_arm64"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/440606904","id":440606904,"node_id":"RA_kwDOEW4XoM4aQyC4","name":"atmos_1.221.0-rc.6_freebsd_amd64","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":214061228,"digest":"sha256:1cdf11324b13cb9b20bc0ea36491c8ce741b5830f35b836c69cc50d67c2aeb91","download_count":1,"created_at":"2026-06-07T02:06:01Z","updated_at":"2026-06-07T02:06:07Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.221.0-rc.6/atmos_1.221.0-rc.6_freebsd_amd64"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/440606789","id":440606789,"node_id":"RA_kwDOEW4XoM4aQyBF","name":"atmos_1.221.0-rc.6_freebsd_arm64","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":198574252,"digest":"sha256:bd48ddfe0acbb0b8500e3c4602aa24b8b6b027df4097b70a5e976f35988bf4db","download_count":1,"created_at":"2026-06-07T02:05:48Z","updated_at":"2026-06-07T02:05:55Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.221.0-rc.6/atmos_1.221.0-rc.6_freebsd_arm64"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/440606785","id":440606785,"node_id":"RA_kwDOEW4XoM4aQyBB","name":"atmos_1.221.0-rc.6_linux_386","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":199815330,"digest":"sha256:d4ca35c4155e0010e0ef8417e2c3dae09c7761f6944ae835658768301bbd5bf0","download_count":1,"created_at":"2026-06-07T02:05:48Z","updated_at":"2026-06-07T02:05:55Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.221.0-rc.6/atmos_1.221.0-rc.6_linux_386"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/440606900","id":440606900,"node_id":"RA_kwDOEW4XoM4aQyC0","name":"atmos_1.221.0-rc.6_linux_amd64","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":214880418,"digest":"sha256:92d9beec19c087800efd24b4fb7d095c0b7b1817b37902a0493a3245ce701567","download_count":10,"created_at":"2026-06-07T02:06:01Z","updated_at":"2026-06-07T02:06:07Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.221.0-rc.6/atmos_1.221.0-rc.6_linux_amd64"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/440606768","id":440606768,"node_id":"RA_kwDOEW4XoM4aQyAw","name":"atmos_1.221.0-rc.6_linux_arm","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":199884962,"digest":"sha256:c541c45ec74ad766558cbad363412cdfcaf7109d052692669da014a266cb79a5","download_count":2,"created_at":"2026-06-07T02:05:48Z","updated_at":"2026-06-07T02:05:54Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.221.0-rc.6/atmos_1.221.0-rc.6_linux_arm"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/440606839","id":440606839,"node_id":"RA_kwDOEW4XoM4aQyB3","name":"atmos_1.221.0-rc.6_linux_arm64","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":199360674,"digest":"sha256:5d0e5205febfd74311af823653d9e485735cb09b2ca9c629f3930b3992c1c771","download_count":2,"created_at":"2026-06-07T02:05:54Z","updated_at":"2026-06-07T02:06:01Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.221.0-rc.6/atmos_1.221.0-rc.6_linux_arm64"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/440606917","id":440606917,"node_id":"RA_kwDOEW4XoM4aQyDF","name":"atmos_1.221.0-rc.6_SHA256SUMS","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":1085,"digest":"sha256:3475e67519ea82fefed7282c7746d4295cd32eb3e42187bd0136188d9be89b84","download_count":1,"created_at":"2026-06-07T02:06:02Z","updated_at":"2026-06-07T02:06:03Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.221.0-rc.6/atmos_1.221.0-rc.6_SHA256SUMS"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/440606784","id":440606784,"node_id":"RA_kwDOEW4XoM4aQyBA","name":"atmos_1.221.0-rc.6_windows_386.exe","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/x-ms-dos-executable","state":"uploaded","size":204163584,"digest":"sha256:50c0101038aa40f4c9f7a6f6969f0e113b4dc9d3769bdbf5f20e8e423210ce61","download_count":1,"created_at":"2026-06-07T02:05:48Z","updated_at":"2026-06-07T02:05:54Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.221.0-rc.6/atmos_1.221.0-rc.6_windows_386.exe"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/440606848","id":440606848,"node_id":"RA_kwDOEW4XoM4aQyCA","name":"atmos_1.221.0-rc.6_windows_amd64.exe","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/x-ms-dos-executable","state":"uploaded","size":218570240,"digest":"sha256:1ca3721daf16f9e11b67228efe78ebd5c0c3656af54b6ea89890cbd3487a4204","download_count":1,"created_at":"2026-06-07T02:05:55Z","updated_at":"2026-06-07T02:06:02Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.221.0-rc.6/atmos_1.221.0-rc.6_windows_amd64.exe"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/440606909","id":440606909,"node_id":"RA_kwDOEW4XoM4aQyC9","name":"atmos_1.221.0-rc.6_windows_arm64.exe","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/x-ms-dos-executable","state":"uploaded","size":200723968,"digest":"sha256:63a075957b1e27cffc269b434949ee3b7a80690b085eb5c26e4bbc4d11d4390f","download_count":1,"created_at":"2026-06-07T02:06:02Z","updated_at":"2026-06-07T02:06:09Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.221.0-rc.6/atmos_1.221.0-rc.6_windows_arm64.exe"}],"tarball_url":"https://api.github.com/repos/cloudposse/atmos/tarball/v1.221.0-rc.6","zipball_url":"https://api.github.com/repos/cloudposse/atmos/zipball/v1.221.0-rc.6","body":"<details>\n  <summary>feat: add !unset YAML function to delete keys from configuration @osterman (#1521)</summary>\n## what\n- Add new `!unset` YAML function that completely removes keys from configuration during inheritance and merging\n- Implement processing in both stack merging (`yaml_func_utils.go`) and config loading (`process_yaml.go`)\n- Add comprehensive unit tests for all functionality\n- Create documentation with examples and use cases\n- Update YAML functions index documentation\n\n## why\n- Users need a way to explicitly remove inherited configuration values, not just override them with `null`\n- Current workarounds require physically removing or commenting out keys in parent configurations\n- This addresses GitHub issue #227: \"A YAML way of undefining a value without removing the key\"\n- Provides fine-grained control over configuration inheritance in complex stack hierarchies\n\n## Key Features\n- **Complete removal**: Unlike setting to `null`, `!unset` completely removes the key from configuration\n- **Inheritance control**: Child configurations can remove values inherited from parents\n- **Works everywhere**: Functions in all Atmos configuration sections (vars, settings, env, metadata, etc.)\n- **Type-safe**: Operates after YAML parsing, ensuring no syntax breakage\n- **Respects skip list**: Can be disabled via skip list if needed\n\n## Examples\n\n### Basic Usage\n```yaml\n# parent.yaml\ncomponents:\n  terraform:\n    vpc:\n      vars:\n        enable_nat_gateway: true\n        enable_vpn_gateway: true\n\n# child.yaml\nimport:\n  - parent\n\ncomponents:\n  terraform:\n    vpc:\n      vars:\n        enable_vpn_gateway: !unset  # Completely removes this key\n```\n\n### Removing Nested Values\n```yaml\nconfig:\n  database:\n    host: \"prod.db.example.com\"\n    backup_enabled: true\n\n# Override:\nconfig:\n  database:\n    backup_enabled: !unset  # Remove backup config\n    host: \"dev.db.example.com\"\n```\n\n## Testing\nAll tests pass:\n- ✅ Unit tests for config processing\n- ✅ Unit tests for stack processing\n- ✅ Integration tests with other YAML functions\n- ✅ Skip list functionality tests\n- ✅ Inheritance scenario tests\n\n## references\n- Closes #227\n- Related to #267 (YAML Explicit Typing support)\n\n🤖 Generated with [Claude Code](https://claude.ai/code)\n\n<!-- This is an auto-generated comment: release notes by coderabbit.ai -->\n\n## Summary by CodeRabbit\n\n* **New Features**\n  * Added a YAML !unset function to remove keys or list items during config processing and inheritance. Works at any depth, supports multiple unsets, and coexists with other YAML functions.\n* **Tests**\n  * Introduced comprehensive tests covering flat and nested structures, arrays, multiple/nested unsets, inheritance scenarios, and edge cases.\n* **Documentation**\n  * Added dedicated docs and examples for !unset, including usage in stack manifests, nested removals, list handling, and guidance on expected behavior.\n\n<!-- end of auto-generated comment: release notes by coderabbit.ai -->\n</details>\n\n<details>\n  <summary>feat(imports): cache remote stack-import clones (dedup + opt-in TTL) @osterman (#2571)</summary>\n## what\n\n- Clone each remote (Git) stack-import **source repository at most once per Atmos invocation** instead of once per import — all subdir imports of the same repo now resolve from a single shared clone (within-run dedup, spanning both `describe affected` passes).\n- Add an opt-in **`ttl`** to reuse the cloned source **across runs** until it expires: per-import (`ttl:` in the import map form) and a global `imports.ttl` default in `atmos.yaml`. With no `ttl`, the source refreshes once per run so mutable refs like `?ref=main` stay fresh.\n- Wire the default git-subdir resolve path through the existing `ensureSourceDir`, add per-session fetch tracking + TTL freshness (timestamp persisted in the `.atmos-source-ready` marker), and extract a shared `duration.IsExpired`/`IsZeroTTL` that the source provisioner now reuses.\n- Update JSON schemas, add unit tests, document \"Caching Remote Imports\" in `stacks/imports.mdx`, add a changelog blog post, and add a roadmap milestone.\n\n## why\n\n- For hub-and-spoke repos pulling a shared catalog via remote imports, `atmos describe affected` was re-cloning the hub repo once per import (~68–87×/run, ~7–11 min total), and a warm `actions/cache` of `~/.cache/atmos/stack-imports/` was ignored because the subdir path re-cloned unconditionally.\n- Within-run dedup collapses those clones to one per repo (the ~80% win, no staleness risk); the opt-in `ttl` lets CI reuse the clone across runs (warm cache skips the clone entirely) while keeping mutable refs fresh by default. Shallow clones (`depth=1`) were already in use — the win is not re-cloning the same repo repeatedly.\n\n## references\n\n- Cached sources live under the XDG cache dir (`~/.cache/atmos/stack-imports/`, honoring `XDG_CACHE_HOME`).\n- Builds on the source-provisioning TTL mechanism (`pkg/duration`, `pkg/provisioner/source`).\n- Changelog: `website/blog/2026-06-05-faster-remote-stack-imports.mdx`\n\n\n<!-- This is an auto-generated comment: release notes by coderabbit.ai -->\n## Summary by CodeRabbit\n\n* **New Features**\n  * Per-import `ttl` and global `imports.ttl` for optional cross-run caching of remote stack imports.\n  * Each unique remote Git source is cloned at most once per invocation and shared across nested imports.\n  * Improved cache freshness semantics, including explicit zero-ttl behavior.\n\n* **Documentation**\n  * Added caching guide, TTL examples, XDG cache guidance, and a blog post.\n\n* **Tests**\n  * Added tests for TTL parsing/expiration and remote import caching behavior.\n<!-- end of auto-generated comment: release notes by coderabbit.ai -->\n</details>\n","mentions_count":1},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/335270364","assets_url":"https://api.github.com/repos/cloudposse/atmos/releases/335270364/assets","upload_url":"https://uploads.github.com/repos/cloudposse/atmos/releases/335270364/assets{?name,label}","html_url":"https://github.com/cloudposse/atmos/releases/tag/v1.221.0-rc.5","id":335270364,"author":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"node_id":"RE_kwDOEW4XoM4T-9Hc","tag_name":"v1.221.0-rc.5","target_commitish":"main","name":"v1.221.0-rc.5","draft":false,"immutable":false,"prerelease":true,"created_at":"2026-06-06T00:59:52Z","updated_at":"2026-06-06T02:00:25Z","published_at":"2026-06-06T02:00:25Z","assets":[{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/439854108","id":439854108,"node_id":"RA_kwDOEW4XoM4aN6Qc","name":"atmos_1.221.0-rc.5_darwin_amd64","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":219844352,"digest":"sha256:022812b84b87fafedc8b674ea041aae894c2dae05f61ee0aa6156e67fb5df1a2","download_count":2,"created_at":"2026-06-06T01:59:23Z","updated_at":"2026-06-06T01:59:29Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.221.0-rc.5/atmos_1.221.0-rc.5_darwin_amd64"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/439854034","id":439854034,"node_id":"RA_kwDOEW4XoM4aN6PS","name":"atmos_1.221.0-rc.5_darwin_arm64","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":205874962,"digest":"sha256:797889cd154d7161281ddbbb6966cc805ee2d6da2b966a58d4526bd19381bd7c","download_count":2,"created_at":"2026-06-06T01:59:14Z","updated_at":"2026-06-06T01:59:22Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.221.0-rc.5/atmos_1.221.0-rc.5_darwin_arm64"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/439854035","id":439854035,"node_id":"RA_kwDOEW4XoM4aN6PT","name":"atmos_1.221.0-rc.5_freebsd_amd64","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":214048940,"digest":"sha256:fc0a94cc147475ac49bd03de23f970ddc33e2df838a55a137c52734a4f216286","download_count":2,"created_at":"2026-06-06T01:59:14Z","updated_at":"2026-06-06T01:59:25Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.221.0-rc.5/atmos_1.221.0-rc.5_freebsd_amd64"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/439854192","id":439854192,"node_id":"RA_kwDOEW4XoM4aN6Rw","name":"atmos_1.221.0-rc.5_freebsd_arm64","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":198574252,"digest":"sha256:1815eb2842b519430a34d57e621b9cbc6dc3ee7bd6623deb4eb7d64194c7cea5","download_count":2,"created_at":"2026-06-06T01:59:30Z","updated_at":"2026-06-06T01:59:36Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.221.0-rc.5/atmos_1.221.0-rc.5_freebsd_arm64"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/439854098","id":439854098,"node_id":"RA_kwDOEW4XoM4aN6QS","name":"atmos_1.221.0-rc.5_linux_386","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":199803042,"digest":"sha256:08c6feac8a6f820f71733f99ae2a0412c5f55ee518cb20f6851a1673e02bb5f1","download_count":2,"created_at":"2026-06-06T01:59:22Z","updated_at":"2026-06-06T01:59:27Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.221.0-rc.5/atmos_1.221.0-rc.5_linux_386"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/439854201","id":439854201,"node_id":"RA_kwDOEW4XoM4aN6R5","name":"atmos_1.221.0-rc.5_linux_amd64","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":214868130,"digest":"sha256:9d02b8aa927a24691371933cf9041cc731f4415006bf237d5a6fd3617f9c05ba","download_count":7,"created_at":"2026-06-06T01:59:31Z","updated_at":"2026-06-06T01:59:36Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.221.0-rc.5/atmos_1.221.0-rc.5_linux_amd64"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/439854137","id":439854137,"node_id":"RA_kwDOEW4XoM4aN6Q5","name":"atmos_1.221.0-rc.5_linux_arm","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":199884962,"digest":"sha256:47b29336df896722dc86aac8f82782cf85cd5b5c699e6e7c209c58f7c55ac7dc","download_count":2,"created_at":"2026-06-06T01:59:25Z","updated_at":"2026-06-06T01:59:31Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.221.0-rc.5/atmos_1.221.0-rc.5_linux_arm"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/439854037","id":439854037,"node_id":"RA_kwDOEW4XoM4aN6PV","name":"atmos_1.221.0-rc.5_linux_arm64","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":199295138,"digest":"sha256:d785439c0432409ce39ed426bd8457df76f654ece42323449a9f1de3cab9d69c","download_count":2,"created_at":"2026-06-06T01:59:14Z","updated_at":"2026-06-06T01:59:22Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.221.0-rc.5/atmos_1.221.0-rc.5_linux_arm64"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/439854206","id":439854206,"node_id":"RA_kwDOEW4XoM4aN6R-","name":"atmos_1.221.0-rc.5_SHA256SUMS","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":1085,"digest":"sha256:0a06fdc8b42f3fd48626777130b3357704c3f5bf8d7451804597d7d32eb663f0","download_count":2,"created_at":"2026-06-06T01:59:31Z","updated_at":"2026-06-06T01:59:32Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.221.0-rc.5/atmos_1.221.0-rc.5_SHA256SUMS"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/439854155","id":439854155,"node_id":"RA_kwDOEW4XoM4aN6RL","name":"atmos_1.221.0-rc.5_windows_386.exe","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/x-ms-dos-executable","state":"uploaded","size":204151296,"digest":"sha256:f41667d0043caeff31cb87f1bf8f538ab6e9f93d4f3343bdb1148074f2152fdd","download_count":2,"created_at":"2026-06-06T01:59:28Z","updated_at":"2026-06-06T01:59:33Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.221.0-rc.5/atmos_1.221.0-rc.5_windows_386.exe"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/439854036","id":439854036,"node_id":"RA_kwDOEW4XoM4aN6PU","name":"atmos_1.221.0-rc.5_windows_amd64.exe","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/x-ms-dos-executable","state":"uploaded","size":218557440,"digest":"sha256:27e6a0c4c4134b41abd1920045e17999c063453e7b9785b217565e038af5472b","download_count":2,"created_at":"2026-06-06T01:59:14Z","updated_at":"2026-06-06T01:59:24Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.221.0-rc.5/atmos_1.221.0-rc.5_windows_amd64.exe"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/439854135","id":439854135,"node_id":"RA_kwDOEW4XoM4aN6Q3","name":"atmos_1.221.0-rc.5_windows_arm64.exe","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/x-ms-dos-executable","state":"uploaded","size":200711168,"digest":"sha256:9116a8fb8f6ec95397f221d6a001518c26354236f6144fd76c011074ff7a0975","download_count":2,"created_at":"2026-06-06T01:59:25Z","updated_at":"2026-06-06T01:59:30Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.221.0-rc.5/atmos_1.221.0-rc.5_windows_arm64.exe"}],"tarball_url":"https://api.github.com/repos/cloudposse/atmos/tarball/v1.221.0-rc.5","zipball_url":"https://api.github.com/repos/cloudposse/atmos/zipball/v1.221.0-rc.5","body":"<details>\n  <summary>[codex] consolidate terraform bulk execution on scheduler @shirkevich (#2466)</summary>\n## Summary\n\n- route Terraform `--all`, `--components`, and `--query` through the scheduler-backed Terraform adapter\n- build Terraform dependency graphs from `dependencies.components` first, with `settings.depends_on` fallback\n- preserve query-path auth manager setup, store resolver bridging, YAML function processing, and per-component CI hook capture\n- includes cloudposse/atmos#2348 identity/auth fixes in this stack so local `--identity terraform` testing works\n- include the credential-store concurrency-safety prerequisite discovered by concurrency validation\n- keep effective scheduler concurrency fixed at `1` for this PR\n\n## Stacking\n\nThis PR is stacked on PR 2 and targets `codex/dag-scheduler-core`.\n\nPR 4 is #2468 and is stacked on this branch to introduce plan-only `--max-concurrency` wiring.\n\nSupersedes the earlier fork-headed draft #2462 now that the stack branches exist in `cloudposse/atmos`.\n\n## Draft note\n\nThis branch is back to the intended PR 3 review shape: Terraform `--all`, `--components`, and `--query` share the graph-backed scheduler path, but execution remains sequential.\n\nThe temporary `ATMOS_EXPERIMENTAL_DAG_MAX_CONCURRENCY` validation hook has been removed. User-visible plan concurrency now belongs to PR 4.\n\nThis branch retains the narrow credential-store concurrency-safety prerequisite discovered during validation:\n- credential-store initialization no longer mutates global Viper env bindings per component and preserves `ATMOS_KEYRING_TYPE` precedence\n\n## Validation\n\n- `go test ./pkg/scheduler ./pkg/scheduler/adapters ./internal/exec -run TestExecuteTerraformQuery|TestExecuteTerraformQueryNoMatches|TestBuildTerraformDependencyGraph|TestExecuteTerraformAllUsesGraphBackedSequentialOrder|TestExecuteTerraformComponentsUsesGraphBackedSequentialOrder|TestExecuteTerraformQueryUsesGraphBackedSequentialOrder|TestExecuteTerraformKeepsIndependentComponentsSequential|TestBuildTerraformGraph`\n- `go test ./pkg/auth/credentials`\n- `go test -race ./pkg/auth/credentials -run TestNewCredentialStoreWithConfig_ConcurrentInitialization`\n- `go test ./pkg/auth ./internal/exec -run TestCreateAndAuthenticateManagerWithAtmosConfig|TestSetupTerraformAuth|TestProcessComponentConfig_PropagatesAuthManager|TestProcessComponentConfig_AuthManagerGuardBranches`\n- built `build/atmos` and live-tested against a downstream stack with `terraform plan --all` and an explicit identity\n\n## Validation findings carried forward\n\n- The first concurrency-4 validation run exposed an auth race: per-component credential-store initialization called global `viper.BindEnv`, causing `fatal error: concurrent map writes`. This PR fixes that narrowly in `pkg/auth/credentials`.\n- Higher-concurrency validation also showed local Terraform working-directory contention when multiple logical aliases share one physical Terraform component directory. PR 4 keeps path-based locking while introducing plan concurrency.\n\n## Follow-up discussion\n\nThe longer-term way to unlock true parallelism for aliases sharing one physical Terraform folder would be per-node isolated workdirs plus isolated `TF_DATA_DIR` and generated files. That needs repo-owner discussion because it changes the operator debugging model: Atmos would need to decide whether and how to retain those per-node copies for inspection, how `atmos terraform shell` maps to them, and how cleanup/debug artifacts are managed.\n\n\n<!-- This is an auto-generated comment: release notes by coderabbit.ai -->\n## Summary by CodeRabbit\n\n* **New Features**\n  * Graph-backed Terraform scheduler with deterministic dependency order, reversed destroy order, per-resource serialization, concurrency control, per-component output capture/hooks, and signal-aware cancellation.\n  * New Terraform run options: --failure-mode, --max-concurrency, log-order, hide (including no-changes), and execution-summary file.\n  * Line-prefixing writer for prefixed log output.\n\n* **Bug Fixes**\n  * Credential keyring type now respects ATMOS_KEYRING_TYPE and is safe for concurrent init.\n  * Workdir sync/hash skips Terraform/OpenTofu runtime dirs.\n  * More tolerant Git repo opening for worktrees.\n\n* **Tests**\n  * Large expansion of tests covering scheduler behavior, CLI options, concurrency, logging, auth, and new utilities.\n<!-- end of auto-generated comment: release notes by coderabbit.ai -->\n</details>\n\n<details>\n  <summary>feat: install Atmos from a branch or tag with --use-version=ref:<name> @osterman (#2569)</summary>\n## what\n\n- Add a `ref:<name>` version spec to `--use-version` (and `version.use` in `atmos.yaml` / `ATMOS_USE_VERSION`) that installs Atmos from the latest commit of a **branch or tag**, e.g. `atmos --use-version=ref:main version`.\n- Accepts branch names, tag names, and slash-qualified refs for disambiguation: `ref:main`, `ref:release/v1.199`, `ref:v1.199.0`, `ref:heads/main`, `ref:tags/v1.199.0`.\n- Resolves the ref to its full commit SHA via the GitHub API, then reuses the existing `sha:` install/cache path unchanged; ref versions always re-execute and fail hard on resolution errors.\n- Docs (`version/use.mdx`), a `minor` blog post, and a roadmap milestone.\n\n## why\n\n- Previously `--use-version` only accepted PR numbers (`pr:1234`), commit SHAs (`sha:ceb7526`), and releases — a branch name like `main` was rejected, even though branch/tag pushes already publish the same `build-artifacts-*` from the `Tests` workflow.\n- `ref:` lets you pin a moving target once (`ref:main`) instead of chasing a new `sha:` after every merge, making it trivial to test unreleased fixes on a branch.\n- The ref is re-resolved on every run so a mutable branch always tracks the latest build, while the SHA-keyed cache avoids reinstalling when the ref hasn't moved. Resolving to the **full** SHA also sidesteps GitHub's `head_sha` filter, which only matches full (not short) SHAs.\n\n## references\n\n- Docs: [Version Pinning](https://atmos.tools/cli/configuration/version/use)\n- Changelog: `website/blog/2026-06-04-use-version-ref.mdx`\n\n\n<!-- This is an auto-generated comment: release notes by coderabbit.ai -->\n## Summary by CodeRabbit\n\n* **New Features**\n  * Support for git branches/tags via --use-version=ref: (resolves refs to commit SHAs and uses existing artifact download/cache).\n\n* **Behavior Changes**\n  * CI artifact selection now prefers the newest workflow run that contains the platform artifact (may pick in-progress or failed runs if they include the artifact).\n  * Re-exec/version switching treats ref: like immutable versions (resolve → install/cache).\n\n* **Bug Fixes**\n  * Clearer, user-friendly error when a ref does not exist (with actionable hints).\n\n* **Documentation**\n  * Added CLI docs, blog post, and roadmap entry describing ref: usage and caching.\n<!-- end of auto-generated comment: release notes by coderabbit.ai -->\n</details>\n\n<details>\n  <summary>feat: Add custom component types for custom commands @osterman (#1904)</summary>\n## Summary\n\n- Implement shell completion for semantic-typed flags and arguments (component/stack types)\n- Add interactive prompting for missing required semantic-typed values\n- Support custom component types in shell completions\n\n## What Changed\n\n- New custom component type provider system (`pkg/component/custom`)\n- Shell completion for semantic-typed arguments and flags in custom commands\n- Interactive prompting for missing required semantic-typed values\n- Extended command schema to support semantic types and components\n- Comprehensive test coverage for completion and prompting functionality\n\n## Why This Matters\n\nThis feature enables custom commands to provide superior developer experience through:\n- Tab completion for component and stack arguments/flags\n- Interactive prompts for required semantic-typed values\n- Support for custom component types beyond built-in types\n\n\n## References\n- closes #1787 \n- closes #444\n- closes #438\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\n<!-- This is an auto-generated comment: release notes by coderabbit.ai -->\n## Summary by CodeRabbit\n\n* **New Features**\n  * Custom component types with registry support, CLI integration, and template access to resolved component data.\n  * Enhanced CLI semantic completion and interactive prompting for selecting component and stack values.\n  * Aggregated component listing across stacks for discovery and completion.\n\n* **Documentation**\n  * New guides, examples, and blog post demonstrating custom component types and workflows.\n  * Schema updates to validate custom component manifests.\n\n* **Tests**\n  * Broad test coverage for completion, providers, processing, and stack handling.\n<!-- end of auto-generated comment: release notes by coderabbit.ai -->\n</details>\n\n<details>\n  <summary>docs(gists): add Atmos + Packer + GitHub Actions AMI pipeline gist @aknysh (#2560)</summary>\n## what\n\n- Add a new gist at `gists/aws-ami-packer-github-actions/` demonstrating an end-to-end AWS AMI pipeline with **Atmos + Packer + GitHub Actions**:\n  - Build a hardened **Amazon Linux 2023** AMI with Packer, orchestrated by Atmos.\n  - Validate it on a live test instance, optionally scan it, and gate promotion behind a **manual approval**.\n  - Tag the approved image `ScanStatus=approved` and **share it across AWS accounts**.\n- Drive the whole build from **stack configuration** (no hardcoded HCL) and operate the result through a tree of `atmos ami` custom commands (get-ami-id, tag, share, launch/terminate test instances, …).\n- Include reference **IAM/OIDC** policies and an org **SCP** that enforces \"launch only approved AMIs\".\n- Wire the gist into the docs-site file browser (tags + related-docs links) and announce it with a blog post.\n\n## why\n\n- \"How do I use Atmos + Packer to build AMIs, and automate the build → approve → share process?\" is a frequent community question. This gist is a vendor-neutral, copy-and-adapt reference recipe that combines several Atmos features into one production-shaped workflow.\n- Like all [gists](https://atmos.tools/gists), it's shared as-is (not part of the CI-tested examples), so users adapt it to their environment and Atmos version.\n\n## references\n\n- Gist: `gists/aws-ami-packer-github-actions/`\n- Blog post: `website/blog/2026-06-01-gist-aws-ami-packer-github-actions.mdx`\n\n\n<!-- This is an auto-generated comment: release notes by coderabbit.ai -->\n## Summary by CodeRabbit\n\n* **New Features**\n  * Added a complete gist showing an end-to-end AMI build/validate/approve/share pipeline using Atmos + Packer + GitHub Actions, with reusable setup and tool-install steps, approval gate, optional vulnerability scan, and cross-account sharing.\n\n* **Documentation**\n  * Added detailed README, customization checklist, policy templates, and a blog post documenting setup, governance (OIDC, IAM, SCP), local execution, and cleanup guidance.\n<!-- end of auto-generated comment: release notes by coderabbit.ai -->\n</details>\n\n<details>\n  <summary>feat: add !git.* repository YAML functions and atmos.Resolve template func @osterman (#2558)</summary>\n## what\n\n- Add five new `!git.*` YAML functions that expose Git repository metadata from the `origin` remote: `!git.repository` (the `<owner>/<repo>` slug, e.g. `cloudposse/atmos`), `!git.owner`, `!git.name`, `!git.host`, and `!git.url`.\n- Add the `atmos.Resolve` template function, which evaluates any Atmos YAML-function string (`!git.*`, `!exec`, `!store`, `!terraform.output`, …) at template-render time so its result can be composed with other strings and template variables in a single value.\n- The new YAML functions are parsed generically (GitHub/GitLab/Bitbucket/Azure DevOps), support a fallback value, and work in both stack/component processing and `atmos.yaml` config preprocessing.\n- Includes unit tests, per-function docs, two changelog posts, a roadmap update, and a follow-up PRD.\n\n## why\n\n- Users needed the repository slug (and its parts) for tagging resources and building backend paths, previously only achievable by shelling out via `!exec echo ${GITHUB_REPOSITORY:-$(git remote get-url origin | sed …)}`.\n- A bare YAML tag owns the entire scalar and Atmos renders Go templates *before* YAML functions, so composing a function result with extra text (e.g. prefixing `workspace_key_prefix` with the repo slug) was impossible without `!exec`; `atmos.Resolve` makes that composition native:\n  ```yaml\n  workspace_key_prefix: '{{ atmos.Resolve .settings.context.repo }}/{{ or .metadata.name .metadata.component }}'\n  ```\n\n## references\n\n- Extends the existing Git YAML function family from the [Git YAML Functions](https://atmos.tools/changelog/git-yaml-functions) changelog.\n- Docs: `/functions/yaml/git.repository`, `/functions/template/atmos.Resolve`.\n- Follow-up: `docs/prd/lazy-yaml-function-template-values.md` (lazy-Stringer auto-deref so `{{ .settings.context.repo }}` evaluates without `atmos.Resolve`).\n\n\n<!-- This is an auto-generated comment: release notes by coderabbit.ai -->\n## Summary by CodeRabbit\n\n* **New Features**\n  * Added Git repository metadata YAML functions (!git.repository, !git.owner, !git.name, !git.host, !git.url).\n  * Added atmos.Resolve template function to evaluate YAML functions during template rendering for inline composition.\n\n* **Documentation**\n  * Added PRD, docs pages, blog posts, and roadmap entries describing the new YAML functions and atmos.Resolve.\n\n* **Tests**\n  * Added tests covering Git YAML tag resolution and the new template Resolve behavior.\n\n* **Chores**\n  * Updated link-checker configuration to exclude slow/intermittent targets.\n<!-- end of auto-generated comment: release notes by coderabbit.ai -->\n</details>\n\n\n## 🚀 Enhancements\n\n<details>\n  <summary>fix(auth): unwrap Atmos Pro envelope in github/sts mint @osterman (#2568)</summary>\n## what\n\n- Fix the `github/sts` auth integration ignoring a successfully minted Atmos Pro STS token because `mint()` decoded the response with a flat struct instead of the canonical API envelope.\n- Add a shared, reusable primitive — `dtos.Envelope[T]` + `pro.DecodeEnvelope[T]` — and route `mint()` through it so every Atmos Pro response unwraps the nested `data` payload through one sanctioned path.\n- Fix the bug-masking test fixture (the simulated broker now emits the real envelope shape) and add a regression test asserting `mint()` persists **1 token, not 0**, plus decoder unit tests including a canary that a flat payload decodes to empty `data`.\n\n## why\n\n- Every Atmos Pro API route returns `{ \"success\": true, \"status\": 200, \"data\": { \"tokens\": [...], \"excluded\": [...] } }`, but `mint()` decoded straight into the flat `stsResponse` (top-level `tokens`), so it always read 0 tokens — the CLI logged `GitHub STS: no tokens granted`, never wrote the git `insteadOf` config, and cross-repo `import:` calls fell back to the ambient `GITHUB_TOKEN` and failed with `remote: Repository not found`, even though the server had minted a valid token (HTTP 200, so no error surfaced).\n- The existing e2e test passed only because its simulated broker returned the unwrapped `{tokens,excluded}` shape the real server never sends; matching the fixture to the real envelope and adding the regression/canary tests prevents this whole class of \"decoded a Pro response without the envelope\" bug from recurring.\n\n## references\n\n- `mint()` was the only Pro call bypassing the shared `AtmosApiResponse` envelope that `ExchangeOIDCToken` / `LockStack` already use.\n\n\n<!-- This is an auto-generated comment: release notes by coderabbit.ai -->\n## Summary by CodeRabbit\n\n* **Bug Fixes**\n  * Clearer STS error messages and correct unwrapping of canonical API envelopes.\n  * Prevent ambient tokens from being baked into Git URLs by honoring insteadOf rewrites (including file-mode).\n  * Avoid invalid git checkout/fetch for empty refs by fetching default branch and skipping bad checkouts.\n  * Warn when component `source` is misplaced under `metadata` and accept simple-form `source` strings.\n\n* **New Features**\n  * Provision credential brokers before Git source detection so token rewrites apply.\n\n* **Tests**\n  * Expanded tests covering envelope decoding, STS handling, broker provisioning, git insteadOf, and default-ref behavior.\n\n* **Documentation**\n  * Added fix notes on STS envelope/token-shadowing and updated PRD guidance for `source`.\n<!-- end of auto-generated comment: release notes by coderabbit.ai -->\n</details>\n","mentions_count":3},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/334087298","assets_url":"https://api.github.com/repos/cloudposse/atmos/releases/334087298/assets","upload_url":"https://uploads.github.com/repos/cloudposse/atmos/releases/334087298/assets{?name,label}","html_url":"https://github.com/cloudposse/atmos/releases/tag/v1.221.0-rc.4","id":334087298,"author":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"node_id":"RE_kwDOEW4XoM4T6cSC","tag_name":"v1.221.0-rc.4","target_commitish":"main","name":"v1.221.0-rc.4","draft":false,"immutable":false,"prerelease":true,"created_at":"2026-06-04T01:38:06Z","updated_at":"2026-06-04T03:00:08Z","published_at":"2026-06-04T02:12:02Z","assets":[{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/437870861","id":437870861,"node_id":"RA_kwDOEW4XoM4aGWEN","name":"atmos_1.221.0-rc.4_darwin_amd64","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":219664560,"digest":"sha256:80ec38ba8f237b2feee44f51b6b0b83a955ed97c7a6165994b216c9a60b10b4d","download_count":0,"created_at":"2026-06-04T02:59:40Z","updated_at":"2026-06-04T02:59:47Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.221.0-rc.4/atmos_1.221.0-rc.4_darwin_amd64"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/437870960","id":437870960,"node_id":"RA_kwDOEW4XoM4aGWFw","name":"atmos_1.221.0-rc.4_darwin_arm64","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":205706146,"digest":"sha256:4e9a5fe4cd750ece7279e3a1d686e1f4eab703628e7c7e70c017ac7f9571189d","download_count":1,"created_at":"2026-06-04T02:59:49Z","updated_at":"2026-06-04T02:59:56Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.221.0-rc.4/atmos_1.221.0-rc.4_darwin_arm64"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/437870864","id":437870864,"node_id":"RA_kwDOEW4XoM4aGWEQ","name":"atmos_1.221.0-rc.4_freebsd_amd64","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":213872812,"digest":"sha256:63d1aa613b4586c2483195d7373d9115c68146f62a0b28a9a76a5abb977800fa","download_count":0,"created_at":"2026-06-04T02:59:40Z","updated_at":"2026-06-04T02:59:48Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.221.0-rc.4/atmos_1.221.0-rc.4_freebsd_amd64"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/437871055","id":437871055,"node_id":"RA_kwDOEW4XoM4aGWHP","name":"atmos_1.221.0-rc.4_freebsd_arm64","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":198377644,"digest":"sha256:445def2bdb7a2f4efad48601e609989a7ad37117781e9d042e6c1b4629d194dc","download_count":0,"created_at":"2026-06-04T02:59:59Z","updated_at":"2026-06-04T03:00:08Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.221.0-rc.4/atmos_1.221.0-rc.4_freebsd_arm64"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/437870968","id":437870968,"node_id":"RA_kwDOEW4XoM4aGWF4","name":"atmos_1.221.0-rc.4_linux_386","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":199635106,"digest":"sha256:e7e066f05ec3de3d25c945f7740a3f51fb87aaec123c9a54c2f30833475fa96d","download_count":0,"created_at":"2026-06-04T02:59:50Z","updated_at":"2026-06-04T02:59:57Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.221.0-rc.4/atmos_1.221.0-rc.4_linux_386"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/437870862","id":437870862,"node_id":"RA_kwDOEW4XoM4aGWEO","name":"atmos_1.221.0-rc.4_linux_amd64","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":214692002,"digest":"sha256:3e5caac5dffec3360276e8df80d0b24977d5116de452af54da577fbdbf7bfb6f","download_count":70,"created_at":"2026-06-04T02:59:40Z","updated_at":"2026-06-04T02:59:48Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.221.0-rc.4/atmos_1.221.0-rc.4_linux_amd64"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/437871051","id":437871051,"node_id":"RA_kwDOEW4XoM4aGWHL","name":"atmos_1.221.0-rc.4_linux_arm","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":199753890,"digest":"sha256:65b5119945cf74d87ffb64dc431cbc46fe6e568a6d6bf55136192410b0071259","download_count":0,"created_at":"2026-06-04T02:59:59Z","updated_at":"2026-06-04T03:00:04Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.221.0-rc.4/atmos_1.221.0-rc.4_linux_arm"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/437870863","id":437870863,"node_id":"RA_kwDOEW4XoM4aGWEP","name":"atmos_1.221.0-rc.4_linux_arm64","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":199164066,"digest":"sha256:9de45b427fdd06c0b5a04ef5d8950bf321579aba6022a6560ae9c64bb3380c9f","download_count":0,"created_at":"2026-06-04T02:59:40Z","updated_at":"2026-06-04T02:59:48Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.221.0-rc.4/atmos_1.221.0-rc.4_linux_arm64"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/437871060","id":437871060,"node_id":"RA_kwDOEW4XoM4aGWHU","name":"atmos_1.221.0-rc.4_SHA256SUMS","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":1085,"digest":"sha256:9d5f55feb82ffe74add229bbdabf8f7eaf46a8170af410e9d3e88df45daa4c2d","download_count":0,"created_at":"2026-06-04T03:00:00Z","updated_at":"2026-06-04T03:00:00Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.221.0-rc.4/atmos_1.221.0-rc.4_SHA256SUMS"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/437871042","id":437871042,"node_id":"RA_kwDOEW4XoM4aGWHC","name":"atmos_1.221.0-rc.4_windows_386.exe","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/x-ms-dos-executable","state":"uploaded","size":203980288,"digest":"sha256:85ef7e8df6fb84cd0805f1673ef5e5552939daa5f66bda34c6f582866dfc7ef0","download_count":0,"created_at":"2026-06-04T02:59:58Z","updated_at":"2026-06-04T03:00:05Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.221.0-rc.4/atmos_1.221.0-rc.4_windows_386.exe"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/437870965","id":437870965,"node_id":"RA_kwDOEW4XoM4aGWF1","name":"atmos_1.221.0-rc.4_windows_amd64.exe","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/x-ms-dos-executable","state":"uploaded","size":218376192,"digest":"sha256:3fab1e0ec316a3da8b52145a65759ded680b1c7daf4fe3482eb7c45f4c8cd75c","download_count":0,"created_at":"2026-06-04T02:59:50Z","updated_at":"2026-06-04T02:59:57Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.221.0-rc.4/atmos_1.221.0-rc.4_windows_amd64.exe"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/437870967","id":437870967,"node_id":"RA_kwDOEW4XoM4aGWF3","name":"atmos_1.221.0-rc.4_windows_arm64.exe","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/x-ms-dos-executable","state":"uploaded","size":200543232,"digest":"sha256:bc66958b9c471a966d5ce283af6b68e1045de954b3b6749c94b0d85245926d4d","download_count":0,"created_at":"2026-06-04T02:59:50Z","updated_at":"2026-06-04T02:59:57Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.221.0-rc.4/atmos_1.221.0-rc.4_windows_arm64.exe"}],"tarball_url":"https://api.github.com/repos/cloudposse/atmos/tarball/v1.221.0-rc.4","zipball_url":"https://api.github.com/repos/cloudposse/atmos/zipball/v1.221.0-rc.4","body":"## 🚀 Enhancements\n\n<details>\n  <summary>fix(pro): respect metadata.enabled when uploading instances for drift @osterman (#2563)</summary>\n## what\n\n- `atmos list instances --upload` now collapses the Atmos Pro enabled hierarchy (`metadata.enabled` > `settings.pro.enabled` > `settings.pro.drift_detection.enabled`) before uploading, so the values Atmos Pro persists already reflect any outer disable.\n- A shared `effectiveEnabledState` helper is the single source of truth for both the upload payload (`extractProSettings`) and the success-toast counts, so they can no longer diverge.\n- Disabled components are still uploaded (as `pro.enabled: false`) rather than omitted, so Atmos Pro shows them disabled instead of orphaning them.\n- Reference docs corrected (`settings/pro.mdx` gains a `settings.pro.enabled` entry + precedence note; `list/list-instances.mdx` drops the now-false \"preserved verbatim\" / \"drift is independent of pro.enabled\" claims), plus a `docs/fixes/` write-up.\n\n## why\n\n- Components disabled upstream via `metadata.enabled: false` kept failing scheduled drift detection (`dispatchError: \"missing_plan_result\"`, `drift_status: error`): the CLI skips planning them, but the upload serialized the raw `settings.pro` block and never sent `metadata.enabled`, so Atmos Pro (whose ingestion contract has no `metadata` field) persisted them as `enabled:true, drift_enabled:true` and legitimately dispatched drift.\n- Fixing it in the CLI keeps the determination where it is already resolved and needs no Atmos Pro change: the stuck `error` rows self-heal to `disabled` on the next upload, with no data migration.\n- `pro.enabled` defaults to `true` (matching the Pro server-side default) so the collapse only ever turns things off when an outer level is explicitly disabled — it never regresses default-enabled components.\n\n## references\n\n- `docs/fixes/2026-06-03-drift-dispatch-ignores-metadata-enabled.md` (root-cause analysis, Neon `instances` evidence, verification steps)\n- Source of truth for the disabled determination: `internal/exec/component_utils.go` (`isComponentEnabled`)\n\n\n<!-- This is an auto-generated comment: release notes by coderabbit.ai -->\n## Summary by CodeRabbit\n\n* **Bug Fixes**\n  * Resolve upload so component enablement honors metadata.enabled, preventing metadata-disabled components from remaining scheduled for drift and correcting counts; disabled components are uploaded as disabled rather than omitted.\n\n* **Documentation**\n  * Clarify enablement precedence (metadata.enabled > settings.pro.enabled > drift_detection.enabled), upload behavior, and how effective Pro/drift state is reflected in UI counts.\n\n* **Tests**\n  * Add unit and end-to-end tests validating effective enablement resolution, drift counting, and uploaded payloads.\n<!-- end of auto-generated comment: release notes by coderabbit.ai -->\n</details>\n\n<details>\n  <summary>fix(auth): deduplicate ECR, ECR Public, and EKS integrations to once per process @MrZablah (#2564)</summary>\n## What\r\n\r\n  Adds a process-level execution cache to `triggerIntegrations` so that\r\n  auto-provisioned integrations (`aws/ecr`, `aws/ecr-public`, `aws/eks`)\r\n  fire at most once per `atmos` invocation, regardless of how many times\r\n  `Authenticate` is called or how many `AuthManager` instances are created.\r\n\r\n  The cache key is the integration's canonical target endpoint rather than\r\n  its config entry name:\r\n  - `aws/ecr`        → `\"aws/ecr:<account_id>:<region>\"`\r\n  - `aws/ecr-public` → `\"aws/ecr-public\"` (single global registry)\r\n  - `aws/eks`        → `\"aws/eks:<cluster_name>:<region>\"`\r\n  - everything else  → integration name (no behaviour change)\r\n\r\n  This means two config entries that point at the same registry — e.g. one\r\n  from global `atmos.yaml` and one from a component stack file — are\r\n  collapsed to a single execution.\r\n\r\n  ## Why\r\n\r\n  `atmos terraform plan` calls `Authenticate` from at least three internal\r\n  paths: `setupTerraformAuth`, `TerraformPreHook`, and one call per YAML\r\n  function (`!store.get`, `!terraform.state`). With a 6-tool `.tool-versions`\r\n  this produced 6 ECR logins per command. Switching to a name-keyed cache\r\n  reduced it to 2 because merged configs can carry two integration entries\r\n  with different names for the same registry. Keying by target endpoint\r\n  reduces this to exactly 1.\r\n\r\n  ## Changes\r\n\r\n  - `pkg/auth/manager_integrations.go` — adds `processIntegrationCache\r\n    sync.Map`, `resetProcessIntegrationCache()` (test helper),\r\n    `integrationTargetKey()` (canonical key helper covering `aws/ecr`,\r\n    `aws/ecr-public`, `aws/eks`); updates `triggerIntegrations` to use\r\n    `LoadOrStore` on the target key.\r\n  - `pkg/auth/manager_integrations_test.go` — adds\r\n    `TestIntegrationTargetKey` (table-driven tests for all key variants\r\n    including ECR Public) and `TestIntegrationTargetKey_Deduplication`\r\n    (verifies that two same-registry entries produce one cache hit).\r\n\r\n  ## Notes\r\n\r\n  `aws/ecr-public` was added to `upstream/main` in #2231 after this branch\r\n  diverged; coverage for it was added here to keep deduplication consistent\r\n  across all three AWS integration kinds.\r\n\r\n## references\r\n\r\nECR / ECR Public Login Executes Multiple Times Per atmos terraform Invocation\r\n [#2562](https://github.com/cloudposse/atmos/issues/2562)\r\n\n\n<!-- This is an auto-generated comment: release notes by coderabbit.ai -->\n## Summary by CodeRabbit\n\n* **New Features**\n  * Added process-level deduplication for auto-provisioned integrations to prevent redundant provisioning of the same target within a single process.\n  * Failed provisioning attempts are evicted from the dedupe cache so retries can proceed.\n\n* **Tests**\n  * Added unit tests validating cache key behavior and deduplication scenarios to ensure consistent provisioning outcomes.\n<!-- end of auto-generated comment: release notes by coderabbit.ai -->\n</details>\n","mentions_count":2},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/333460623","assets_url":"https://api.github.com/repos/cloudposse/atmos/releases/333460623/assets","upload_url":"https://uploads.github.com/repos/cloudposse/atmos/releases/333460623/assets{?name,label}","html_url":"https://github.com/cloudposse/atmos/releases/tag/v1.221.0-rc.3","id":333460623,"author":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"node_id":"RE_kwDOEW4XoM4T4DSP","tag_name":"v1.221.0-rc.3","target_commitish":"main","name":"v1.221.0-rc.3","draft":false,"immutable":false,"prerelease":true,"created_at":"2026-06-02T21:29:12Z","updated_at":"2026-06-03T02:11:34Z","published_at":"2026-06-03T02:11:34Z","assets":[{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/436825294","id":436825294,"node_id":"RA_kwDOEW4XoM4aCWzO","name":"atmos_1.221.0-rc.3_darwin_amd64","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":219660464,"digest":"sha256:8c8d984c4097cee3d0b44977291c72ecf85b5045e3821cacf52af6b6a79cbfe6","download_count":1,"created_at":"2026-06-03T02:10:37Z","updated_at":"2026-06-03T02:10:44Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.221.0-rc.3/atmos_1.221.0-rc.3_darwin_amd64"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/436825348","id":436825348,"node_id":"RA_kwDOEW4XoM4aCW0E","name":"atmos_1.221.0-rc.3_darwin_arm64","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":205706130,"digest":"sha256:f403be1ff455ef019502c23bebdb4bd2c472ef1f761b4416b29de402119972ae","download_count":1,"created_at":"2026-06-03T02:10:44Z","updated_at":"2026-06-03T02:10:49Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.221.0-rc.3/atmos_1.221.0-rc.3_darwin_arm64"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/436825219","id":436825219,"node_id":"RA_kwDOEW4XoM4aCWyD","name":"atmos_1.221.0-rc.3_freebsd_amd64","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":213864620,"digest":"sha256:19d2c5a6d191b4b89cdd2ebbe6334511d02ef4fed2d697ba2fc13a99ec796540","download_count":1,"created_at":"2026-06-03T02:10:28Z","updated_at":"2026-06-03T02:10:36Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.221.0-rc.3/atmos_1.221.0-rc.3_freebsd_amd64"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/436825216","id":436825216,"node_id":"RA_kwDOEW4XoM4aCWyA","name":"atmos_1.221.0-rc.3_freebsd_arm64","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":198377644,"digest":"sha256:b3195560f027e6892c698ec3e1203d99620837ec35d0a3f2312133d4c0be1814","download_count":1,"created_at":"2026-06-03T02:10:28Z","updated_at":"2026-06-03T02:10:35Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.221.0-rc.3/atmos_1.221.0-rc.3_freebsd_arm64"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/436825280","id":436825280,"node_id":"RA_kwDOEW4XoM4aCWzA","name":"atmos_1.221.0-rc.3_linux_386","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":199631010,"digest":"sha256:5cd4ad26ab121e0f7eab30a34cebcba5ec356fe040451111f0bd0e5c8e7cf6d2","download_count":1,"created_at":"2026-06-03T02:10:36Z","updated_at":"2026-06-03T02:10:42Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.221.0-rc.3/atmos_1.221.0-rc.3_linux_386"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/436825218","id":436825218,"node_id":"RA_kwDOEW4XoM4aCWyC","name":"atmos_1.221.0-rc.3_linux_amd64","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":214687906,"digest":"sha256:0544374b5457773f1b075c597762e22253c75f71c95fc076c5cd545a782e8bc5","download_count":9,"created_at":"2026-06-03T02:10:28Z","updated_at":"2026-06-03T02:10:35Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.221.0-rc.3/atmos_1.221.0-rc.3_linux_amd64"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/436825355","id":436825355,"node_id":"RA_kwDOEW4XoM4aCW0L","name":"atmos_1.221.0-rc.3_linux_arm","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":199753890,"digest":"sha256:d910a5fb34ed9a3f9e10125269185fefd0c0a26ff5c0ad5640451ff33ad8cf8c","download_count":1,"created_at":"2026-06-03T02:10:44Z","updated_at":"2026-06-03T02:10:50Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.221.0-rc.3/atmos_1.221.0-rc.3_linux_arm"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/436825217","id":436825217,"node_id":"RA_kwDOEW4XoM4aCWyB","name":"atmos_1.221.0-rc.3_linux_arm64","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":199164066,"digest":"sha256:0cb6dad345b4541dfa90d688891625a9628aaff7c42cb575e081694841373faa","download_count":1,"created_at":"2026-06-03T02:10:28Z","updated_at":"2026-06-03T02:10:37Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.221.0-rc.3/atmos_1.221.0-rc.3_linux_arm64"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/436825363","id":436825363,"node_id":"RA_kwDOEW4XoM4aCW0T","name":"atmos_1.221.0-rc.3_SHA256SUMS","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":1085,"digest":"sha256:c4c3fe3837ccafdd55382cdbf108cd2a86af83a7c0fda74e9a50b25bda3b5d03","download_count":1,"created_at":"2026-06-03T02:10:45Z","updated_at":"2026-06-03T02:10:45Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.221.0-rc.3/atmos_1.221.0-rc.3_SHA256SUMS"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/436825342","id":436825342,"node_id":"RA_kwDOEW4XoM4aCWz-","name":"atmos_1.221.0-rc.3_windows_386.exe","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/x-ms-dos-executable","state":"uploaded","size":203976704,"digest":"sha256:fe8fad20243087b2ae9fdf93cbca30f23fd4abdeb96bb43ec9199e0680dd8e28","download_count":1,"created_at":"2026-06-03T02:10:42Z","updated_at":"2026-06-03T02:10:48Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.221.0-rc.3/atmos_1.221.0-rc.3_windows_386.exe"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/436825278","id":436825278,"node_id":"RA_kwDOEW4XoM4aCWy-","name":"atmos_1.221.0-rc.3_windows_amd64.exe","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/x-ms-dos-executable","state":"uploaded","size":218372608,"digest":"sha256:fc47e916c9c82ad15242dd662123f46e9b3a1294d38b8eecc382e4982b185cc9","download_count":1,"created_at":"2026-06-03T02:10:36Z","updated_at":"2026-06-03T02:10:44Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.221.0-rc.3/atmos_1.221.0-rc.3_windows_amd64.exe"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/436825298","id":436825298,"node_id":"RA_kwDOEW4XoM4aCWzS","name":"atmos_1.221.0-rc.3_windows_arm64.exe","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/x-ms-dos-executable","state":"uploaded","size":200540160,"digest":"sha256:a0101211552f759de5e5b2317834206e9381d9e33663aa1eb3cb8ab7f0c2053a","download_count":1,"created_at":"2026-06-03T02:10:37Z","updated_at":"2026-06-03T02:10:43Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.221.0-rc.3/atmos_1.221.0-rc.3_windows_arm64.exe"}],"tarball_url":"https://api.github.com/repos/cloudposse/atmos/tarball/v1.221.0-rc.3","zipball_url":"https://api.github.com/repos/cloudposse/atmos/zipball/v1.221.0-rc.3","body":"<details>\n  <summary>feat(stacks): template variables in import paths from earlier imports @osterman (#2554)</summary>\n## what\n\n- Render Go templates in stack `import:` paths (local paths and a remote import's Git `?ref=`) against the `settings`/`vars`/`env` accumulated from imports listed **earlier** in the same manifest, plus the import's own `context`.\n- A single variable (e.g. `settings.context.deployment_repo_version`, set once in a `_defaults`) can now pin both a remote catalog import's ref and the component `source.version`.\n- Only the import **path** string is rendered; imported file **content** templating and its deferral are unchanged. Missing values are a hard error (with hints) unless `ignore_missing_template_values` is set; `skip_templates_processing` or a disabled templating engine leaves the path literal.\n- Adds the `ErrImportPathTemplate` sentinel, a fixture scenario + unit tests, docs (\"Referencing Earlier Imports in Import Paths\"), a changelog blog post, and a roadmap milestone.\n\n## why\n\n- Keep `dev` and `prod` in one repo while isolating prod from dev changes: dev uses local catalogs/sources, prod imports a versioned catalog and pins the component source to an immutable ref — both driven by one variable.\n- Previously the component `source.version` template worked (resolved late, at component processing) but the import `?ref=` had to be hard-coded, because imports are resolved before that context exists. This closes that gap so both come from the same variable.\n\n## references\n\n- Docs: `/stacks/imports#referencing-earlier-imports-in-import-paths`\n- Builds on remote stack imports (#2528) and the git context YAML functions (#2537)\n\n\n<!-- This is an auto-generated comment: release notes by coderabbit.ai -->\n## Summary by CodeRabbit\n\n* **New Features**\n  * Import paths now support Go-template rendering, letting paths reference settings, vars, and env from earlier imports in the same manifest.\n\n* **Bug Fixes**\n  * Templating failures in import paths now surface a clear error; options added to ignore or skip unresolved import templates.\n\n* **Documentation**\n  * Added docs and a blog post with examples and operational guidance for templated import paths.\n<!-- end of auto-generated comment: release notes by coderabbit.ai -->\n</details>\n\n\n## 🚀 Enhancements\n\n<details>\n  <summary>fix(auth): make github/sts compose with default GitHub token injection @osterman (#2557)</summary>\n## what\n\n- Stop Atmos's go-getter token injection from silently shadowing `github/sts`-minted GitHub tokens: `CustomGitDetector` now skips URL token injection when a live `GIT_CONFIG_*` `insteadOf` rewrite already matches the URL's host/owner, so git's rewrite (carrying the correct least-privilege token) wins.\n- Make the `ATMOS_PRO_GITHUB_TOKEN` bridge consistent: `resolveToken` falls back to the live env var (which the broker sets after startup), mirroring `pkg/http/client.go`.\n- Default `token_env` to `ATMOS_PRO_GITHUB_TOKEN` (was empty) so a single-owner mint reaches `gh`/REST and Atmos's in-process git path automatically.\n- Replace the ad-hoc `{owner}` placeholder with Atmos's standard Go-template syntax (`{{ .owner }}`, plus `.host`); update docs, PRD, and add a `docs/fixes/` write-up.\n\n## why\n\n- A real CI job resolving a remote `import:` from a second private repo failed with `remote: Repository not found` — the minted token was correct, but the ambient `GITHUB_TOKEN` was being injected into the URL ahead of it, defeating git's `insteadOf` rewrite. The only fix was the `settings.inject_github_token: false` workaround.\n- These changes make `github/sts` (introduced in #2546) compose with the default `settings.inject_github_token: true`, so it \"just works\" with no workaround. Reproduced first with a simulated-broker e2e test, then fixed.\n\n## references\n\n- Fixes the `github/sts` feature shipped in #2546\n- `docs/fixes/2026-06-01-github-sts-token-injection-shadowing.md` (root cause, fix, and why this is a fix doc rather than a changelog entry)\n- `docs/prd/atmos-pro-sts.md`\n\n\n<!-- This is an auto-generated comment: release notes by coderabbit.ai -->\n## Summary by CodeRabbit\n\n* **Bug Fixes**\n  * Prevented minted GitHub tokens from being silently overridden by detecting broker-provided git URL rewrites and skipping ambient token injection.\n\n* **New Features**\n  * token_env accepts Go-template names (e.g., GH_TOKEN_{{ .owner }}) and defaults to ATMOS_PRO_GITHUB_TOKEN when appropriate.\n  * Token resolution prefers a live exported broker token before falling back to configured values; minted tokens are not logged.\n\n* **Documentation**\n  * Clarified github/sts token_env semantics, templating, multi-owner behavior, and URL-rewrite interactions.\n\n* **Tests**\n  * Added/expanded tests for token-env defaults, templating, precedence, and insteadOf handling.\n\n* **Chores**\n  * Made license NOTICE generation produce deterministic URLs.\n<!-- end of auto-generated comment: release notes by coderabbit.ai -->\n</details>\n\n<details>\n  <summary>fix(auth): report missing exec binary instead of \"atmos requires a subcommand\" @osterman (#2559)</summary>\n## what\n\n- Fix `atmos auth exec -- <command>` reporting the misleading **\"The command atmos requires a subcommand\"** when the executable after `--` (e.g. `uvx`) is not found on `PATH`.\n- The missing executable is now reported clearly via the error builder: the command name, the underlying cause, a PATH hint, and exit code `127`.\n- Internally, Cobra's \"unknown command\" conversion now uses the `ErrUnknownSubcommand` sentinel, and the root handler intercepts that (via a new testable `unknownSubcommand` helper) instead of the overloaded `ErrCommandNotFound`.\n\n## why\n\n- `auth exec` and the registry executor both wrapped the shared `ErrCommandNotFound` sentinel, so a missing user binary was indistinguishable from an unknown Atmos subcommand and got masked as root usage output — hiding the real cause.\n- Separating the two sentinels gives accurate errors for both cases (genuine unknown subcommands still show root usage with suggestions; missing executables now say \"command not found\" with a hint), and also fixes the same latent masking for `pkg/hooks` command lookups.\n\n## references\n\n- Regression from the `atmos auth` → command-registry migration (#1919) combined with the registry executor's Cobra-error conversion (#1643).\n\n\n<!-- This is an auto-generated comment: release notes by coderabbit.ai -->\n## Summary by CodeRabbit\n\n* **Bug Fixes**\n  * Clearer \"command not found\" errors with install guidance and enforced exit code 127.\n  * Distinguish missing external executables from unknown subcommands so help is shown only for genuine unknown subcommands.\n\n* **Tests**\n  * Added/updated tests to guard error-classification behaviors and prevent regressions.\n\n* **Documentation**\n  * Adjusted BSD dependency listing to mark the URL as Unknown.\n<!-- end of auto-generated comment: release notes by coderabbit.ai -->\n</details>\n\n<details>\n  <summary>fix: allow --use-version artifact downloads without GitHub token @osterman (#2212)</summary>\n## what\n\n- Allow unauthenticated artifact downloads for public repositories via `--use-version` flag\n- Metadata fetching (PR info, workflow runs, artifact listing) and artifact downloads now work without authentication on public repos per GitHub API docs\n- Replace upfront `GetGitHubTokenOrError()` gate with optional `GetGitHubToken()` in `InstallFromPR()` and `InstallFromSHA()`\n- Skip `Authorization` header when token is unavailable in `downloadPRArtifact()`\n- Add smart HTTP error handling with `buildDownloadHTTPError()` to distinguish auth failures from rate limiting\n\n## why\n\n- Users without GitHub token environment variables couldn't install PR artifacts, even for public repositories\n- Rate limit errors (429) were reported generically as \"HTTP 429\" with no actionable context\n- Need to properly surface rate limit information (60/hr for unauthenticated, 5,000/hr for authenticated) to guide users\n\n## references\n\n- Fixes the issue where `atmos --use-version=2129` fails with \"authentication failed\" when no `GITHUB_TOKEN` is set\n- GitHub API documentation confirms artifact downloads work without authentication for public repositories\n\n<!-- This is an auto-generated comment: release notes by coderabbit.ai -->\n## Summary by CodeRabbit\n\n* **New Features**\n  * Added optional unauthenticated access for public GitHub artifacts (subject to rate limits)\n  * New ATMOS_GITHUB_CLI env var to control/disable CLI-based token retrieval\n\n* **Bug Fixes**\n  * Clearer handling and messaging for auth vs rate-limit errors, with improved hints and retry info\n  * GitHub token is now optional for artifact operations (falls back to anonymous when available)\n\n* **Tests**\n  * Expanded tests for artifact downloads and HTTP auth/rate-limit scenarios\n\n* **Documentation**\n  * Documented ATMOS_GITHUB_CLI usage and behavior\n<!-- end of auto-generated comment: release notes by coderabbit.ai -->\n</details>\n\n<details>\n  <summary>fix(version): honor ATMOS_USE_VERSION env var for version re-exec @osterman (#2556)</summary>\n## what\n\n- Honor the documented `ATMOS_USE_VERSION` environment variable so Atmos actually switches to (and downloads, if needed) the requested version during early re-exec.\n- `resolveRequestedVersion` now reads `ATMOS_USE_VERSION`, with precedence `ATMOS_VERSION_USE` > `ATMOS_USE_VERSION` > `ATMOS_VERSION` > `version.use`.\n- `cmd/root.go` also honors `ATMOS_USE_VERSION` from the environment so version-management commands (e.g. `atmos version`) re-exec on it just like the `--use-version` flag.\n- Add a table case and a precedence test covering the new behavior.\n\n## why\n\n- `ATMOS_USE_VERSION` is advertised as the primary env var (docs at `website/docs/cli/environment-variables.mdx` and the flag binding `WithEnvVars(\"use-version\", \"ATMOS_USE_VERSION\")`), but the re-exec resolver never read it — it only checked the internal `ATMOS_VERSION_USE` (set solely by the CLI flag), the `ATMOS_VERSION` alias, and `version.use` config.\n- An env-populated flag is not marked `Changed()` and maps to viper key `use-version` rather than `version.use`, so `ATMOS_USE_VERSION` fell through every code path — setting it was a complete no-op.\n- This surfaced in CI where `ATMOS_USE_VERSION` was set for `atmos describe affected --upload` but Atmos ran the already-installed version instead of switching. This brings the code in line with the existing documentation.\n\n## references\n\n- Docs already describe the intended behavior: `website/docs/cli/environment-variables.mdx`\n\n\n<!-- This is an auto-generated comment: release notes by coderabbit.ai -->\n## Summary by CodeRabbit\n\n* **New Features**\n  * Added support for the ATMOS_USE_VERSION environment variable as an alternative to the --use-version CLI flag.\n  * Updated version selection precedence to consider environment variables in the defined order.\n\n* **Tests**\n  * Extended test coverage for environment-variable-driven version selection scenarios.\n\n* **Chores**\n  * Updated NOTICE entry for a dependency license URL.\n<!-- end of auto-generated comment: release notes by coderabbit.ai -->\n</details>\n","mentions_count":1},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/332861762","assets_url":"https://api.github.com/repos/cloudposse/atmos/releases/332861762/assets","upload_url":"https://uploads.github.com/repos/cloudposse/atmos/releases/332861762/assets{?name,label}","html_url":"https://github.com/cloudposse/atmos/releases/tag/v1.221.0-rc.2","id":332861762,"author":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"node_id":"RE_kwDOEW4XoM4T1xFC","tag_name":"v1.221.0-rc.2","target_commitish":"main","name":"v1.221.0-rc.2","draft":false,"immutable":false,"prerelease":true,"created_at":"2026-06-02T01:42:59Z","updated_at":"2026-06-02T03:18:36Z","published_at":"2026-06-02T02:07:05Z","assets":[{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/435840623","id":435840623,"node_id":"RA_kwDOEW4XoM4Z-mZv","name":"atmos_1.221.0-rc.2_darwin_amd64","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":219644016,"digest":"sha256:9440c1bb26c6d782250c38fa2593387f6ac915326e9ca22e5931d6e68eebd265","download_count":0,"created_at":"2026-06-02T03:18:19Z","updated_at":"2026-06-02T03:18:27Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.221.0-rc.2/atmos_1.221.0-rc.2_darwin_amd64"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/435840611","id":435840611,"node_id":"RA_kwDOEW4XoM4Z-mZj","name":"atmos_1.221.0-rc.2_darwin_arm64","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":205689570,"digest":"sha256:00edf90fb30e390fcc6ad9114beab6eb367a51538fe43ce6c911e8447c6b22d7","download_count":4,"created_at":"2026-06-02T03:18:18Z","updated_at":"2026-06-02T03:18:25Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.221.0-rc.2/atmos_1.221.0-rc.2_darwin_arm64"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/435840699","id":435840699,"node_id":"RA_kwDOEW4XoM4Z-ma7","name":"atmos_1.221.0-rc.2_freebsd_amd64","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":213852332,"digest":"sha256:49550c2356d51fe383936f5b53570cfd3b2fd8829c496e2cf8972360c4416a28","download_count":0,"created_at":"2026-06-02T03:18:29Z","updated_at":"2026-06-02T03:18:36Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.221.0-rc.2/atmos_1.221.0-rc.2_freebsd_amd64"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/435840523","id":435840523,"node_id":"RA_kwDOEW4XoM4Z-mYL","name":"atmos_1.221.0-rc.2_freebsd_arm64","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":198377644,"digest":"sha256:1bf8a66eecc084c421d86c723b190791e1ed2d08ebbeee2e77da241ff76b6eca","download_count":0,"created_at":"2026-06-02T03:18:08Z","updated_at":"2026-06-02T03:18:16Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.221.0-rc.2/atmos_1.221.0-rc.2_freebsd_arm64"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/435840605","id":435840605,"node_id":"RA_kwDOEW4XoM4Z-mZd","name":"atmos_1.221.0-rc.2_linux_386","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":199610530,"digest":"sha256:5c5ad95f1b5cd522c18311b7d7df378b37bc0bf3daebfa63f853a94a9b524980","download_count":0,"created_at":"2026-06-02T03:18:17Z","updated_at":"2026-06-02T03:18:26Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.221.0-rc.2/atmos_1.221.0-rc.2_linux_386"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/435840685","id":435840685,"node_id":"RA_kwDOEW4XoM4Z-mat","name":"atmos_1.221.0-rc.2_linux_amd64","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":214671522,"digest":"sha256:5d27b033cf8d953d3b266a248c577012cc408088c7b55f9bcd6bd4581bc0c01d","download_count":11,"created_at":"2026-06-02T03:18:28Z","updated_at":"2026-06-02T03:18:35Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.221.0-rc.2/atmos_1.221.0-rc.2_linux_amd64"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/435840679","id":435840679,"node_id":"RA_kwDOEW4XoM4Z-man","name":"atmos_1.221.0-rc.2_linux_arm","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":199753890,"digest":"sha256:e1156b1723ea5edf87b3a9066311c798591f789eefa7adda03796004b83cfd0b","download_count":0,"created_at":"2026-06-02T03:18:27Z","updated_at":"2026-06-02T03:18:35Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.221.0-rc.2/atmos_1.221.0-rc.2_linux_arm"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/435840526","id":435840526,"node_id":"RA_kwDOEW4XoM4Z-mYO","name":"atmos_1.221.0-rc.2_linux_arm64","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":199164066,"digest":"sha256:1fa6d279faae584dda9b77c7166138e4937c8eaa32894c9516dd22a726715ff8","download_count":0,"created_at":"2026-06-02T03:18:08Z","updated_at":"2026-06-02T03:18:17Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.221.0-rc.2/atmos_1.221.0-rc.2_linux_arm64"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/435840702","id":435840702,"node_id":"RA_kwDOEW4XoM4Z-ma-","name":"atmos_1.221.0-rc.2_SHA256SUMS","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":1085,"digest":"sha256:1366b419f98a3de1db6d6f0fe09e930abccbb04eed7d8eb3808925c753fc28b0","download_count":0,"created_at":"2026-06-02T03:18:29Z","updated_at":"2026-06-02T03:18:29Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.221.0-rc.2/atmos_1.221.0-rc.2_SHA256SUMS"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/435840524","id":435840524,"node_id":"RA_kwDOEW4XoM4Z-mYM","name":"atmos_1.221.0-rc.2_windows_386.exe","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/x-ms-dos-executable","state":"uploaded","size":203959296,"digest":"sha256:6a1918f79712551f6873a912ccdf76e3bd011c9b7027d995bd16624aedd72a14","download_count":0,"created_at":"2026-06-02T03:18:08Z","updated_at":"2026-06-02T03:18:16Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.221.0-rc.2/atmos_1.221.0-rc.2_windows_386.exe"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/435840610","id":435840610,"node_id":"RA_kwDOEW4XoM4Z-mZi","name":"atmos_1.221.0-rc.2_windows_amd64.exe","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/x-ms-dos-executable","state":"uploaded","size":218355200,"digest":"sha256:9fc7314a0d74446a6075f42e954902eb8d632fa6b8e383f72ebe64fe89bcb59c","download_count":1,"created_at":"2026-06-02T03:18:18Z","updated_at":"2026-06-02T03:18:26Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.221.0-rc.2/atmos_1.221.0-rc.2_windows_amd64.exe"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/435840525","id":435840525,"node_id":"RA_kwDOEW4XoM4Z-mYN","name":"atmos_1.221.0-rc.2_windows_arm64.exe","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/x-ms-dos-executable","state":"uploaded","size":200523776,"digest":"sha256:068ea8a3be1908f1a1846411b1622a69115d7b3067224568c50f4b58f47fbb26","download_count":0,"created_at":"2026-06-02T03:18:08Z","updated_at":"2026-06-02T03:18:16Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.221.0-rc.2/atmos_1.221.0-rc.2_windows_arm64.exe"}],"tarball_url":"https://api.github.com/repos/cloudposse/atmos/tarball/v1.221.0-rc.2","zipball_url":"https://api.github.com/repos/cloudposse/atmos/zipball/v1.221.0-rc.2","body":"<details>\n  <summary>Add ECR Public authentication: `aws/ecr-public` integration and `atmos aws ecr login --public` @osterman (#2231)</summary>\n## what\n\nAdd **ECR Public** authentication to Atmos for authenticated access to `public.ecr.aws`, solving Docker rate limiting on public ECR images. Two entry points:\n\n- **`atmos aws ecr login --public`** — direct, zero-config login using ambient AWS credentials (the AWS SDK default chain: env, shared config/profile, SSO, IMDS/IRSA/ECS), or `--public --identity <name>` to use a specific identity. Ideal for CI.\n- **`aws/ecr-public` integration kind** — for automatic login on `atmos auth login` and identity linking.\n\nKey changes:\n- **Command** (`cmd/aws/ecr/login.go`): new `--public` flag on `atmos aws ecr login`; ambient-credential and identity-based ECR Public login paths; mutually exclusive with a positional integration argument and `--registry`.\n- **Cloud layer** (`pkg/auth/cloud/aws/ecr_public.go`): `GetPublicAuthorizationToken()` calls `ecrpublic:GetAuthorizationToken`, always in us-east-1.\n- **Integration layer** (`pkg/auth/integrations/aws/ecr_public.go`): `ECRPublicIntegration` factory registering the `aws/ecr-public` kind, with region validation at config time. Implements the full `Integration` interface including `Cleanup()` (docker logout) and `Environment()` (`DOCKER_CONFIG`).\n- **Region validation**: rejects unsupported regions (only us-east-1 and us-west-2 have service endpoints; auth is us-east-1 only).\n- **Tests**: cloud-layer and integration-layer unit tests (token retrieval, region validation, cleanup, error handling) with a generated mock ECR Public client; command tests for the `--public` flag and mode validation.\n- **Documentation**: `atmos aws ecr login` command reference (added `--public` flag), ECR authentication tutorial, and a PRD (`docs/prd/ecr-public-authentication.md`).\n- **Blog post + roadmap**: announcement and a shipped milestone linking to the changelog.\n\n> Note: this branch has been merged up to `main`. Following #2144 (`atmos auth ecr-login` → `atmos aws ecr login`), ECR login lives under the `aws` namespace, and the integration was adapted to `main`'s evolved `Integration` interface (exported `BuildAWSConfigFromCreds`, new `Cleanup`/`Environment` methods).\n\n## why\n\nDocker pulls from `public.ecr.aws` hit rate limits when unauthenticated. This blocks CI workflows, especially those using `cloudposse/github-action-docker-build-push` which pulls BuildKit/binfmt images on every run. Authenticated pulls have significantly higher (or no) rate limits.\n\nBecause `public.ecr.aws` is global, **any** valid AWS credentials unlock authenticated pulls — so `--public` with ambient credentials \"just works\" in CI with zero configuration. ECR Public otherwise differs from private ECR: it uses the `ecrpublic` SDK service, a bearer token instead of SigV4, a hardcoded us-east-1 auth region, and a fixed `public.ecr.aws` registry URL. It requires `ecr-public:GetAuthorizationToken` and `sts:GetServiceBearerToken` IAM permissions.\n\n## references\n\n- [ECR Public Authentication Tutorial](/tutorials/ecr-authentication) — configuration examples, multi-environment setup.\n- [`atmos aws ecr login` Command Reference](/cli/commands/aws/ecr-login) — command usage, `--public` flag, integration configuration.\n- [ECR Public Blog Post](website/blog/2026-05-30-ecr-public-authentication.mdx) — announcement and use cases.\n- PRD: `docs/prd/ecr-public-authentication.md`.\n- AWS Docs: [ECR Public APIs](https://docs.aws.amazon.com/AmazonECR/latest/public/what-is-service.html).\n\n\n<!-- This is an auto-generated comment: release notes by coderabbit.ai -->\n## Summary by CodeRabbit\n\n* **New Features**\n  * ECR Public authentication (aws/ecr-public) with atmos aws ecr login --public, identity-driven auto-provisioning, and enforced us-east-1 auth.\n\n* **Documentation**\n  * Tutorials, blog post, and roadmap updated with ECR Public examples, permissions, CI guidance, and troubleshooting.\n\n* **Bug Fixes**\n  * Improved identity selection UX (confirmation message) and safer CLI behavior for non‑TTY identity selection.\n\n* **Tests**\n  * Extensive unit and integration tests covering ECR Public flows and CLI routing.\n\n* **Chores**\n  * NOTICE/dependencies updated and minor .gitignore tweak.\n<!-- end of auto-generated comment: release notes by coderabbit.ai -->\n</details>\n\n<details>\n  <summary>feat(auth): Atmos Pro STS — JIT GitHub token broker for CI @osterman (#2546)</summary>\n## what\n\n- Add a new auth provider `kind: atmos/pro` that authenticates the Atmos CLI **to Atmos Pro** by federating the GitHub Actions runner's OIDC token into an Atmos Pro session JWT (v1 is OIDC-only).\n- Add a new auth integration `kind: github/sts` — a just-in-time GitHub token broker for CI. On login it mints short-lived, scoped GitHub App installation tokens via `POST /api/v1/sts`, materializes them as per-owner `GIT_CONFIG_*` URL rewrites (`env` or `file` mode), and revokes them at command-end (via `atmos auth exec` in CI) and on `atmos auth logout`.\n- Add a passthrough `kind: atmos/pro` identity, a keyring-registered `ProCredentials` type, realm scoping for integration state, and `via.provider` binding for integrations (in addition to `via.identity`).\n- Add `ATMOS_PRO_GITHUB_TOKEN`, preferred by Atmos-native git operations (vendoring, `source:` provisioning, go-getter) ahead of `ATMOS_GITHUB_TOKEN`/`GITHUB_TOKEN`.\n- Add the PRD (`docs/prd/atmos-pro-sts.md`), a changelog blog post, a shipped roadmap milestone, and configuration docs; full unit-test coverage for the provider, identity, integration, keyring round-trip, `via.provider` matching, revoke gating, and token precedence.\n\n## why\n\n- Fetching private Terraform modules, Atmos `source:` components, and vendored artifacts in CI today requires a long-lived, over-privileged GitHub credential (PAT, machine user, or deploy key) sitting in a CI secret — a standing breach risk that can't be scoped per-run.\n- Atmos Pro STS replaces that with least-privilege, deny-by-default, short-lived tokens minted at the start of a run and revoked at the end — with **zero `.tf` changes** (the injected `GIT_CONFIG_*` rewrites are honored by both go-getter and Terraform's native git), and multi-org support because tokens are minted per `(installation, permission-set)`.\n- Built into Atmos CLI core (CI-native, OIDC-aware) rather than as a GitHub Action, modeled on the existing `aws/ecr`/`aws/eks` integrations; the workflow only needs `permissions: id-token: write`.\n\n## references\n\n- PRD: `docs/prd/atmos-pro-sts.md` (includes deferred Future Work: moving Pro connection config under `auth`, unifying `pkg/pro` onto auth-issued sessions, and broadening command-end revoke beyond `atmos auth exec`)\n- Changelog: `website/blog/2026-05-29-atmos-pro-github-sts.mdx`\n\n\n<!-- This is an auto-generated comment: release notes by coderabbit.ai -->\n## Summary by CodeRabbit\n\n* **New Features**\n  * Atmos Pro GitHub token broker: new atmos/pro provider + github/sts integration for just-in-time GitHub tokens (env or git-config modes) with realm-scoped state and optional token export.\n  * ATMOS_PRO_GITHUB_TOKEN added as preferred GitHub token source.\n  * CI-gated automatic token revocation on command exit/logout.\n  * Ambient credential broker registry to auto-provision env vars for remote reads.\n\n* **Documentation**\n  * PRD, docs, and blog post for Atmos Pro STS and usage guidance.\n<!-- end of auto-generated comment: release notes by coderabbit.ai -->\n</details>\n\n<details>\n  <summary>docs: re-date custom commands step types blog post to 2026-05-30 @osterman (#2550)</summary>\n## what\n\n- Re-dated the \"25+ Interactive Step Types\" blog post from `2026-01-03` to `2026-05-30`.\n- Renamed the file prefix (`git mv`, history preserved) and added a matching `date: 2026-05-30` frontmatter field.\n\n## why\n\n- Aligns the post's publish date with its actual release timing so it surfaces correctly in the changelog feed.\n- Adds the explicit `date:` field to match the repo convention (e.g. `2026-05-28-git-yaml-functions.mdx`).\n- The `slug` is unchanged, so the published URL stays the same.\n\n## references\n\n- N/A — docs-only date adjustment, no user-facing code change.\n\n\n<!-- This is an auto-generated comment: release notes by coderabbit.ai -->\n\n## Summary by CodeRabbit\n\n* **Documentation**\n  * Published comprehensive guide to custom commands and workflow step types, featuring 25+ interactive step types with usage examples, including input collection, output formatting, and variable passing conventions for enhanced automation capabilities.\n\n<!-- review_stack_entry_start -->\n\n[![Review Change Stack](https://storage.googleapis.com/coderabbit_public_assets/review-stack-in-coderabbit-ui.svg)](https://app.coderabbit.ai/change-stack/cloudposse/atmos/pull/2550?utm_source=github_walkthrough&utm_medium=github&utm_campaign=change_stack)\n\n<!-- review_stack_entry_end -->\n\n<!-- end of auto-generated comment: release notes by coderabbit.ai -->\n</details>\n\n<details>\n  <summary>fix(website): use consistent brand-blue announcement bar @osterman (#2551)</summary>\n## what\n\n- Removed the per-announcement `backgroundColor`/`textColor` overrides from `website/src/data/announcements.js` so every announcement bar entry inherits the brand-blue (`#3578e5`) / white-text defaults from the `--announcement-bar-*` CSS variables.\n- Documented the convention in the file header so future announcements don't reintroduce per-entry colors.\n\n## why\n\n- The announcement bar cycled through a rainbow of saturated Tailwind-600 colors (emerald green, violet, cyan, amber, red, indigo, teal...) that looked like \"crayola\" against the site's dark, near-black theme.\n- A single restrained, on-brand color reads as sophisticated and consistent with the rest of the dark site, and matches the bar's original styling.\n\n## references\n\n- N/A (website cosmetic change)\n\n\n<!-- This is an auto-generated comment: release notes by coderabbit.ai -->\n\n## Summary by CodeRabbit\n\n* **Refactor**\n  * Standardized announcement bar styling configuration to use shared CSS variables instead of per-announcement color settings, improving consistency across announcements.\n\n<!-- review_stack_entry_start -->\n\n[![Review Change Stack](https://storage.googleapis.com/coderabbit_public_assets/review-stack-in-coderabbit-ui.svg)](https://app.coderabbit.ai/change-stack/cloudposse/atmos/pull/2551?utm_source=github_walkthrough&utm_medium=github&utm_campaign=change_stack)\n\n<!-- review_stack_entry_end -->\n\n<!-- end of auto-generated comment: release notes by coderabbit.ai -->\n</details>\n\n<details>\n  <summary>feat: Implement workflow step types with registry pattern (DEV-263, DEV-2969) @osterman (#1899)</summary>\n## what\n\n- Add 20+ step types across 4 categories (Interactive, Output, UI, Command) with extensible registry pattern\n- Support Go template variable passing between steps (e.g., `{{ .steps.step1.value }}`)\n- Implement per-step output modes: viewport (pager), raw (passthrough), log (grouped), none (silent)\n- Interactive handlers with TTY detection and clear error messages in CI environments\n\n## why\n\nAddresses DEV-263 (add input type to workflows) and DEV-2969 (add viewport support). Enables users to build complex multi-step workflows with user interaction, conditional execution, and flexible result display.\n\n## references\n\n- Closes #DEV-263\n- Closes #DEV-2969\n\n<!-- This is an auto-generated comment: release notes by coderabbit.ai -->\n## Summary by CodeRabbit\n\n## Release Notes\n\n* **New Features**\n  * Added 25+ interactive step types for workflows and custom commands (input, confirm, choose, filter, file, write, markdown, spin, table, style, and more).\n  * Support for configurable output modes (viewport, raw, log, none) and step-level display options.\n  * Workflow progress rendering and status indicators.\n\n* **Documentation**\n  * Comprehensive guides for interactive workflows and custom commands with step type reference.\n  * New examples demonstrating interactive deployments, credentials collection, and multi-step flows.\n\n* **Bug Fixes**\n  * Improved error messaging for workflow step validation and execution failures.\n\n<!-- review_stack_entry_start -->\n\n[![Review Change Stack](https://storage.googleapis.com/coderabbit_public_assets/review-stack-in-coderabbit-ui.svg)](https://app.coderabbit.ai/change-stack/cloudposse/atmos/pull/1899?utm_source=github_walkthrough&utm_medium=github&utm_campaign=change_stack)\n\n<!-- review_stack_entry_end -->\n<!-- end of auto-generated comment: release notes by coderabbit.ai -->\n</details>\n\n<details>\n  <summary>Add process and I/O execution foundation @shirkevich (#2464)</summary>\n## Summary\n\nThis is PR 1 for the DAG concurrent execution rollout. It introduces the reusable process and stream-isolation foundation without enabling scheduler behavior or changing Terraform bulk routing.\n\nChanges:\n- Add `pkg/process` with `Runner`, `TaskSpec`, `Streams`, `Result`, default `os/exec` runner, context-aware execution, cancellation reporting, and exit-code preservation.\n- Extend `pkg/io` with prefixed per-node stream composition for terminal, file, and capture sinks.\n- Refactor `internal/exec.ExecuteShellCommand()` into a backward-compatible wrapper over `pkg/process` while preserving CI stdout/stderr capture options.\n- Replace the `runTerraformShow()` global `os.Stdout` swap with injected stdout capture.\n\n## Scope\n\nNo scheduler, CLI routing consolidation, concurrency flags, or Terraform adapter behavior is enabled in this PR.\n\n## Stacking\n\nThis PR is the bottom of the DAG rollout stack and targets `main`.\n\nSupersedes the earlier fork-headed draft #2459 now that the stack branches exist in `cloudposse/atmos`.\n\n## Validation\n\n```sh\nrtk env GOCACHE=/private/tmp/atmos-gocache GOMODCACHE=/private/tmp/atmos-gomodcache go test ./pkg/process ./pkg/io ./internal/exec ./cmd/terraform\n```\n\n## Next PR\n\nPR 2 branches from `codex/dag-process-io-foundation` and adds the generic `pkg/scheduler` core with ready-queue scheduling, bounded workers, deterministic aggregate results, and isolated unit tests only.\n\n\n<!-- This is an auto-generated comment: release notes by coderabbit.ai -->\n## Summary by CodeRabbit\n\n## Release Notes\n\n* **New Features**\n  * Configurable subprocess execution with optional contexts and injectable streams\n  * Composable, scope-scoped output writers with per-line prefixing and masking\n\n* **Bug Fixes**\n  * More accurate subprocess exit/error reporting and improved stream-redirection behavior\n\n* **Tests**\n  * Expanded unit tests for subprocess execution, stream injection/capture, and output utilities\n\n* **Documentation**\n  * Updated concurrent execution docs to reflect stream-based output handling\n\n<!-- review_stack_entry_start -->\n\n[![Review Change Stack](https://storage.googleapis.com/coderabbit_public_assets/review-stack-in-coderabbit-ui.svg)](https://app.coderabbit.ai/change-stack/cloudposse/atmos/pull/2464?utm_source=github_walkthrough&utm_medium=github&utm_campaign=change_stack)\n\n<!-- review_stack_entry_end -->\n<!-- end of auto-generated comment: release notes by coderabbit.ai -->\n</details>\n\n\n## 🚀 Enhancements\n\n<details>\n  <summary>fix(auth): honor keyring.type config and send DPoP proof on AWS webflow @osterman (#2545)</summary>\n## what\n\n- Honor `auth.keyring.type` from `atmos.yaml` across **all** auth-manager entrypoints by threading `authConfig` into `credentials.NewCredentialStoreWithConfig(...)` (was silently dropped via the no-arg `NewCredentialStore()`), and inject the manager's config-aware store into AWS `user` identities via a new optional `SetCredentialStore` interface.\n- Add an RFC 9449 **DPoP** proof (EC P-256 / ES256, stdlib-only) to the AWS browser webflow token requests; generate the key per session, persist it in the refresh-token cache, and reuse it on refresh (a cache without a key falls back to the browser flow).\n- Add `AuthManager.CredentialStoreType()` for observability/testability, mark the no-arg `NewCredentialStore()` constructor `Deprecated`, and add unit tests for both fixes (keyring backend selection, DPoP proof structure/signature, key round-trip, header presence).\n\n## why\n\n- **#2544:** with `auth.keyring.type: memory` set, Atmos still selected the default `system` keyring and **hung indefinitely** on hosts where the keyring service is present but unusable (e.g. a locked `gnome-keyring-daemon`). The config value was read and then thrown away before backend selection — only `ATMOS_KEYRING_TYPE` worked. Now the configured backend is honored everywhere an auth manager is built.\n- **#2542:** AWS sign-in's `/v1/token` endpoint now rejects requests without a DPoP proof (`HTTP 400 INVALID_REQUEST`), so browser-based authentication for `aws/user` identities failed at the code-exchange step. Sending the proof restores the flow; because the public-client refresh token is bound to the DPoP key, the key is persisted and reused on refresh.\n\n## references\n\n- closes #2542\n- closes #2544\n- RFC 9449 (DPoP): https://datatracker.ietf.org/doc/html/rfc9449\n\n\n<!-- This is an auto-generated comment: release notes by coderabbit.ai -->\n## Summary by CodeRabbit\n\n* **New Features**\n  * Added RFC 9449 DPoP support for AWS OAuth token exchanges to strengthen token binding.\n  * Auth now respects configured keyring backend across authentication flows.\n\n* **Bug Fixes**\n  * Fixed AWS token parsing to match real-world snake_case responses.\n\n* **Improvements**\n  * Auth manager exposes credential store backend type for easier diagnostics.\n<!-- end of auto-generated comment: release notes by coderabbit.ai -->\n</details>\n\n<details>\n  <summary>fix(yaml-functions): honor init.pass_vars when resolving !terraform.output (#1412) @thejrose1984 (#2548)</summary>\n## what\n\nWhen `components.terraform.init.pass_vars: true` is set, forward the component's vars to the **internal `terraform init`** that runs while resolving `!terraform.output`, via `TF_VAR_*` environment variables.\n\n- `ComponentConfig` gains `PassVars` + `Vars`, populated in `ExtractComponentConfig`.\n- `SetupEnvironment` injects `TF_VAR_*` for each var when `PassVars` is true (strings verbatim, other types JSON-encoded).\n- Regression tests cover the enabled path (string/number/bool/list), the disabled default, and env-section precedence.\n\n## why\n\nCloses #1412.\n\nThe main terraform path honors `pass_vars` by passing `-var-file` to `init` ([`terraform_execute_helpers.go`](https://github.com/cloudposse/atmos/blob/main/internal/exec/terraform_execute_helpers.go#L463-L469)), so modules with **init-time** variable dependencies (e.g. a module `version`/`source` bound to `var.aks_version`) can initialize. But the init that runs while resolving `!terraform.output` goes through `pkg/terraform/output`, which uses the `terraform-exec` library and never honored `pass_vars`:\n\n- `runInit` only set `Upgrade(false)` + optional `Reconfigure(true)`.\n- `ComponentConfig` had no `PassVars`/vars plumbing.\n- `terraform-exec`'s `initConfig` has **no** var-file field — it structurally cannot pass `-var-file` to `init`.\n\nSo `atmos tofu init/plan -s <stack>` failed with `Unable to compute static value` / `module.aks.version depends on var.aks_version which is not available` whenever an init-time var came from a component resolved via `!terraform.output`.\n\n### Why TF_VAR_* rather than a var-file\n\n`terraform-exec` can't attach a var-file to `init`, and an auto-loaded `*.auto.tfvars.json` on disk would risk cross-stack contamination when components are resolved concurrently. `TF_VAR_*` is process/runner-scoped, reaches `init` transparently through the existing `SetEnv` call, and Terraform/OpenTofu accept these values for the matching variable types (JSON encodings of lists/maps are valid HCL2). Gated behind `pass_vars` (default `false`), so it's a no-op unless opted in; an explicit `TF_VAR_*` in the component `env` section still wins.\n\n## references\n\n- Closes #1412\n\n## test plan\n\n```\ngo test ./pkg/terraform/output/...\n```\n\nNew tests:\n- `TestDefaultEnvironmentSetup_PassVars` — vars exported as `TF_VAR_*` with correct encoding.\n- `TestDefaultEnvironmentSetup_PassVarsDisabled` — no `TF_VAR_*` when `pass_vars` is off.\n- `TestDefaultEnvironmentSetup_PassVarsEnvSectionWins` — explicit env-section `TF_VAR_*` wins.\n\n> **Validation note:** verified at the unit level (init env now carries the component vars when `pass_vars` is set; previously the init invocation was unchanged whether `pass_vars` was on or off). I don't have terraform/tofu in this environment to re-run the reporter's full `tofu init/plan` end-to-end, so a maintainer check against a real init-time-dependent module would be worthwhile before release.\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\n<!-- This is an auto-generated comment: release notes by coderabbit.ai -->\n## Summary by CodeRabbit\n\n* **New Features**\n  * Added an option to forward component variables as TF_VAR_* environment entries during Terraform/OpenTofu init; existing TF_VAR_* values are preserved and non-string values are JSON-encoded.\n\n* **Tests**\n  * Added tests for enabled/disabled forwarding, JSON encoding of non-strings, precedence of explicit env values, and end-to-end propagation to the runner env.\n\n* **Documentation**\n  * Docs updated to note init.pass_vars also applies to implicit init runs and how forwarded vars are presented as TF_VAR_*.\n<!-- end of auto-generated comment: release notes by coderabbit.ai -->\n</details>\n\n<details>\n  <summary>test(yaml-functions): regression test for mixed state/output circular dependency (#2005) @thejrose1984 (#2547)</summary>\n## what\n\n- Add a regression test and fixture for a cross-component circular dependency that **mixes** `!terraform.state` and `!terraform.output` (component-a → `!terraform.state` component-b; component-b → `!terraform.output` component-a).\n- New fixture: `tests/fixtures/scenarios/yaml-functions-circular-deps-mixed`.\n- New test: `TestYAMLFunctionsCrossComponentCycleMixed`.\n\n## why\n\nThis is the exact scenario from #2005. It was the same root cause as #2457 and was fixed by #2533 (making `ProcessCustomYamlTags` reuse the goroutine-local `ResolutionContext` so the `Visited` map survives nested walks). That fix covers **both** `state↔state` and the mixed `state↔output` path, but only the `state↔state` case had a regression test — so #2005 could silently regress while the existing test stayed green.\n\nVerified the mixed cycle **hangs** (infinite recursion / goroutine stack overflow) on the commit before #2533, and returns a clean `ErrCircularDependency` on current `main`.\n\n## references\n\n- Closes #2005\n- Follow-up to #2533 / #2457\n\n## test plan\n\n```\ngo test ./tests -run TestYAMLFunctionsCrossComponentCycle -v\n```\n\nBoth `TestYAMLFunctionsCrossComponentCycle` (state↔state) and `TestYAMLFunctionsCrossComponentCycleMixed` (state↔output) pass. The mixed test asserts `ErrCircularDependency` is returned and that the `MaxResolutionDepth` safety net is **not** what fired (which would indicate the primary cycle detector regressed).\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n</details>\n\n<details>\n  <summary>fix: defer custom-command/built-in collision warning to invocation time @thejrose1984 (#2549)</summary>\n## what\n\nScope is intentionally narrow: **change only *when* the existing collision warning fires** — defer it from command-registration time to the moment the conflicting command is actually invoked.\n\n- No change to collision *behavior*: the built-in still wins and custom `steps` are still ignored.\n- No `override:`/`invoke:` work — that opt-in design is tracked separately in the [`custom-command-builtin-override` PRD](https://github.com/cloudposse/atmos/blob/main/docs/prd/custom-command-builtin-override.md).\n- Implemented by wrapping the conflicting built-in command's `PreRunE` in `processCustomCommands` (preserving any existing `PreRunE`/`PreRun` and honoring Cobra's precedence of `PreRunE` over `PreRun`).\n- Adds a regression test asserting the warning is **absent at registration** and **present (exactly once) on invocation**.\n\n## why\n\nToday the warning (introduced in #2191) is emitted from `processCustomCommands`, which runs during root init on **every** Atmos invocation. So a single colliding custom command makes *every* command — `atmos list stacks`, `atmos terraform ...`, etc. — print a warning about, say, a `plan` collision it never touched. The result is worse than noisy:\n\n- It's **misleading** — the warning points at a command the user didn't run.\n- It **breaks scripting/CI** that reads stderr, since every command (except `version`) emits it.\n\nDeferring the warning to invocation makes it **accurate and actionable**: it appears exactly once, only when you run the command the warning is actually about, and stderr stays clean for every other command. Same information, delivered at the moment it's relevant instead of on every unrelated call.\n\n### Behavior\n\n| Invocation | Before | After |\n|---|---|---|\n| `atmos list stacks` (with a colliding custom `plan`) | ⚠ warning printed | no warning |\n| `atmos <colliding command>` | ⚠ warning printed (and also for every other command) | ⚠ warning printed once, here only |\n\n## references\n\n- Refs #2102\n- Related: #2191 (introduced the collision guard / warning)\n\n## test\n\n```\ngo test ./cmd/ -run 'TestCustomCommand_.*Collision|TestCustomCommand_StepsConflictWarning|TestCustomCommand_NamespaceMerge|TestCustomCommand_DeepNesting'\n```\n\nVerified the new test fails against the previous (emit-at-registration) behavior and passes with the fix.\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\n<!-- This is an auto-generated comment: release notes by coderabbit.ai -->\n## Summary by CodeRabbit\n\n* **Bug Fixes**\n  * Collision warnings for custom commands that overlap built-in leaf commands are now deferred until the conflicting command is invoked, reducing startup noise and preserving existing pre-run error behavior.\n\n* **Tests**\n  * Added regression tests to verify deferred warnings are emitted exactly once on invocation and that existing pre-run behavior and error propagation remain intact; tests skip on Windows where stderr capture is unreliable.\n<!-- end of auto-generated comment: release notes by coderabbit.ai -->\n\n</details>\n\n<details>\n  <summary>fix(flags): register --settings-list-merge-strategy as a global flag (#2398) @thejrose1984 (#2540)</summary>\n## what\n\n* Register `--settings-list-merge-strategy` as a global persistent flag on `RootCmd`, with env binding to `ATMOS_SETTINGS_LIST_MERGE_STRATEGY`.\n* Add a Cobra-direct fallback in `ProcessCommandLineArgs` so the value reaches `ConfigAndStacksInfo` even when Cobra strips the flag from `RunE`'s args.\n* In `setSettingsConfig`, scan `os.Args` (mirroring `setLogConfig`'s `parseFlags()` pattern) so command paths that call `InitCliConfig` directly with a zero-value `ConfigAndStacksInfo` (e.g. `describe config`) still honor the flag.\n* Unit test the registration, inheritance, defaults, CLI value, and env-var path.\n\n## why\n\nThe flag is advertised in two places:\n\n- [`atmos.yaml:344`](https://github.com/cloudposse/atmos/blob/main/atmos.yaml#L344) — *\\\"Can also be set using 'ATMOS_SETTINGS_LIST_MERGE_STRATEGY' environment variable, or '--settings-list-merge-strategy' command-line argument\\\"*\n- [`website/docs/cli/configuration/settings/settings.mdx:54`](https://atmos.tools/cli/configuration/settings#list-merge-strategy)\n\nAnd Atmos's internal arg/flag layer already expects it:\n\n- `pkg/config/const.go:147` — `SettingsListMergeStrategyFlag = \\\"--settings-list-merge-strategy\\\"`\n- `internal/exec/cli_utils.go:72` — listed in `commonFlags`\n- `internal/exec/cli_utils.go:495` — string-flag handler that writes `info.SettingsListMergeStrategy`\n- `pkg/config/utils.go:726` — applies it onto `atmosConfig.Settings.ListMergeStrategy`\n\nBut it was never registered with Cobra at the global level. Subcommands that don't whitelist unknown flags (e.g. `terraform plan`, which has no `FParseErrWhitelist`) rejected the flag before the legacy `commonFlags` post-processing ever ran:\n\n```\n$ atmos --settings-list-merge-strategy=append terraform plan vpc -s test\nError: unknown flag --settings-list-merge-strategy for command atmos terraform plan\n```\n\n## references\n\n- Closes #2398\n\n## test plan\n\nUnit tests added in `pkg/flags/global_registry_test.go`:\n\n- `flag is registered on RootCmd as persistent`\n- `defaults to empty string`\n- `CLI flag value flows through Viper`\n- `ATMOS_SETTINGS_LIST_MERGE_STRATEGY env var flows through Viper`\n- `subcommand inherits the persistent flag`\n\nEnd-to-end verification on a minimal project (`atmos.yaml` has `settings.list_merge_strategy: replace`):\n\n| Invocation | `list_merge_strategy` |\n|---|---|\n| `atmos describe config` | `replace` (baseline from `atmos.yaml`) |\n| `atmos --settings-list-merge-strategy=append describe config` | `append` |\n| `atmos describe config --settings-list-merge-strategy=merge` | `merge` |\n| `ATMOS_SETTINGS_LIST_MERGE_STRATEGY=append atmos describe config` | `append` |\n\n`atmos --help` now lists `--settings-list-merge-strategy`.\n\nFull test suites pass for the touched packages:\n\n```\nok  github.com/cloudposse/atmos/pkg/flags\nok  github.com/cloudposse/atmos/pkg/flags/global\nok  github.com/cloudposse/atmos/pkg/config\nok  github.com/cloudposse/atmos/internal/exec\n```\n\n<!-- This is an auto-generated comment: release notes by coderabbit.ai -->\n## Summary by CodeRabbit\n\n* **New Features**\n  * Added --settings-list-merge-strategy CLI flag (replace, append, merge) and ATMOS_SETTINGS_LIST_MERGE_STRATEGY env var to override list-merge behavior for an invocation\n* **Documentation**\n  * Documented the new flag and environment variable with usage and defaults\n* **Tests**\n  * Updated CLI help snapshots to include the new flag and refreshed help text formatting across commands\n\n<!-- review_stack_entry_start -->\n\n[![Review Change Stack](https://storage.googleapis.com/coderabbit_public_assets/review-stack-in-coderabbit-ui.svg)](https://app.coderabbit.ai/change-stack/cloudposse/atmos/pull/2540?utm_source=github_walkthrough&utm_medium=github&utm_campaign=change_stack)\n\n<!-- review_stack_entry_end -->\n<!-- end of auto-generated comment: release notes by coderabbit.ai -->\n</details>\n","mentions_count":3},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/331852288","assets_url":"https://api.github.com/repos/cloudposse/atmos/releases/331852288/assets","upload_url":"https://uploads.github.com/repos/cloudposse/atmos/releases/331852288/assets{?name,label}","html_url":"https://github.com/cloudposse/atmos/releases/tag/v1.221.0-rc.1","id":331852288,"author":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"node_id":"RE_kwDOEW4XoM4Tx6oA","tag_name":"v1.221.0-rc.1","target_commitish":"main","name":"v1.221.0-rc.1","draft":false,"immutable":false,"prerelease":true,"created_at":"2026-05-29T16:40:03Z","updated_at":"2026-05-30T01:55:31Z","published_at":"2026-05-30T01:55:31Z","assets":[{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/433497076","id":433497076,"node_id":"RA_kwDOEW4XoM4Z1qP0","name":"atmos_1.221.0-rc.1_darwin_amd64","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":217999072,"digest":"sha256:4c3fa04f85874c0872aa297fded5fe283c8c1b3a1e673dd44c56278bb753ebb5","download_count":1,"created_at":"2026-05-30T01:54:43Z","updated_at":"2026-05-30T01:54:49Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.221.0-rc.1/atmos_1.221.0-rc.1_darwin_amd64"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/433497073","id":433497073,"node_id":"RA_kwDOEW4XoM4Z1qPx","name":"atmos_1.221.0-rc.1_darwin_arm64","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":204238194,"digest":"sha256:2d4d9ae3e690f3c28106f27450652494df1d3d61cb8ce4b4d1d4ee6778978936","download_count":1,"created_at":"2026-05-30T01:54:42Z","updated_at":"2026-05-30T01:54:48Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.221.0-rc.1/atmos_1.221.0-rc.1_darwin_arm64"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/433497035","id":433497035,"node_id":"RA_kwDOEW4XoM4Z1qPL","name":"atmos_1.221.0-rc.1_freebsd_amd64","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":212238508,"digest":"sha256:5d97630612fa307b0e3d4ebcae12100c5a08a02b4aafb61fb8eaf2b7c607d93b","download_count":1,"created_at":"2026-05-30T01:54:35Z","updated_at":"2026-05-30T01:54:41Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.221.0-rc.1/atmos_1.221.0-rc.1_freebsd_amd64"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/433497030","id":433497030,"node_id":"RA_kwDOEW4XoM4Z1qPG","name":"atmos_1.221.0-rc.1_freebsd_arm64","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":196935852,"digest":"sha256:4a7adf0d7d75901d352a7fbc39852ae6182e33289145d8a1ba58407d1c57c1e3","download_count":1,"created_at":"2026-05-30T01:54:35Z","updated_at":"2026-05-30T01:54:40Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.221.0-rc.1/atmos_1.221.0-rc.1_freebsd_arm64"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/433496984","id":433496984,"node_id":"RA_kwDOEW4XoM4Z1qOY","name":"atmos_1.221.0-rc.1_linux_386","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":198148258,"digest":"sha256:032b453b2524cc0d8e3bc2985a32b1e8988efe9ccb509375ff5e1f9cd1f881ff","download_count":1,"created_at":"2026-05-30T01:54:28Z","updated_at":"2026-05-30T01:54:35Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.221.0-rc.1/atmos_1.221.0-rc.1_linux_386"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/433497041","id":433497041,"node_id":"RA_kwDOEW4XoM4Z1qPR","name":"atmos_1.221.0-rc.1_linux_amd64","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":213057698,"digest":"sha256:02a284fdd3c48b648cf9508b8b3fc228749ae6bffc878a3b29ce1c4fb1f34e50","download_count":17,"created_at":"2026-05-30T01:54:36Z","updated_at":"2026-05-30T01:54:42Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.221.0-rc.1/atmos_1.221.0-rc.1_linux_amd64"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/433497064","id":433497064,"node_id":"RA_kwDOEW4XoM4Z1qPo","name":"atmos_1.221.0-rc.1_linux_arm","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":198246562,"digest":"sha256:c04aeae3879a9868ef7f2f0750b3f6ae67d429e818d2eaf3312235f0a2003880","download_count":1,"created_at":"2026-05-30T01:54:41Z","updated_at":"2026-05-30T01:54:47Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.221.0-rc.1/atmos_1.221.0-rc.1_linux_arm"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/433496983","id":433496983,"node_id":"RA_kwDOEW4XoM4Z1qOX","name":"atmos_1.221.0-rc.1_linux_arm64","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":197722274,"digest":"sha256:872f72cec64133edae099e46f76673f22ebb2d04d3b2bb1110301040a02b93f8","download_count":1,"created_at":"2026-05-30T01:54:28Z","updated_at":"2026-05-30T01:54:35Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.221.0-rc.1/atmos_1.221.0-rc.1_linux_arm64"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/433497097","id":433497097,"node_id":"RA_kwDOEW4XoM4Z1qQJ","name":"atmos_1.221.0-rc.1_SHA256SUMS","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":1085,"digest":"sha256:2f3c4aa360d2bb1d7d826f6d78dec848649361bf22d679505f079f60e91e1d98","download_count":1,"created_at":"2026-05-30T01:54:46Z","updated_at":"2026-05-30T01:54:47Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.221.0-rc.1/atmos_1.221.0-rc.1_SHA256SUMS"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/433497039","id":433497039,"node_id":"RA_kwDOEW4XoM4Z1qPP","name":"atmos_1.221.0-rc.1_windows_386.exe","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/x-ms-dos-executable","state":"uploaded","size":202449408,"digest":"sha256:da431551cd2b5bf7bac11447ee08431b211b350c7252fb1f00ade558f2522f4d","download_count":1,"created_at":"2026-05-30T01:54:36Z","updated_at":"2026-05-30T01:54:46Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.221.0-rc.1/atmos_1.221.0-rc.1_windows_386.exe"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/433496985","id":433496985,"node_id":"RA_kwDOEW4XoM4Z1qOZ","name":"atmos_1.221.0-rc.1_windows_amd64.exe","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/x-ms-dos-executable","state":"uploaded","size":216711680,"digest":"sha256:7e9a206a4e1abddad803c3893cfb0a17ad8ee1ea1d402020293cce819d8557d4","download_count":1,"created_at":"2026-05-30T01:54:28Z","updated_at":"2026-05-30T01:54:34Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.221.0-rc.1/atmos_1.221.0-rc.1_windows_amd64.exe"},{"url":"https://api.github.com/repos/cloudposse/atmos/releases/assets/433496982","id":433496982,"node_id":"RA_kwDOEW4XoM4Z1qOW","name":"atmos_1.221.0-rc.1_windows_arm64.exe","label":"","uploader":{"login":"cloudposse-releaser[bot]","id":163353533,"node_id":"BOT_kgDOCbyTvQ","avatar_url":"https://avatars.githubusercontent.com/in/855608?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D","html_url":"https://github.com/apps/cloudposse-releaser","followers_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/followers","following_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/repos","events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/cloudposse-releaser%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/x-ms-dos-executable","state":"uploaded","size":199096320,"digest":"sha256:18755c06bc566029d0cd0c711d64b95b598e603e5414a73faf1340aa11f30b62","download_count":1,"created_at":"2026-05-30T01:54:28Z","updated_at":"2026-05-30T01:54:35Z","browser_download_url":"https://github.com/cloudposse/atmos/releases/download/v1.221.0-rc.1/atmos_1.221.0-rc.1_windows_arm64.exe"}],"tarball_url":"https://api.github.com/repos/cloudposse/atmos/tarball/v1.221.0-rc.1","zipball_url":"https://api.github.com/repos/cloudposse/atmos/zipball/v1.221.0-rc.1","body":"<details>\n  <summary>Add core git YAML functions @osterman (#2537)</summary>\n## what\n\n- Add core Git YAML functions: `!git.root`, `!git.sha`, `!git.branch`, and `!git.ref`.\n- Resolve Git metadata through `pkg/git`, with `pkg/utils` limited to compatibility shims and YAML tag registration.\n- Wire Git tag resolution through config preprocessing, stack/component YAML processing, and function registry metadata.\n- Add a changelog post and roadmap milestone for the new Git YAML functions.\n\n## why\n\n- Allow dev stack/component source versions to pin to the current Git SHA via `!git.ref`.\n- Keep prod pins explicit while giving dev environments PR-aware source refs.\n- Avoid expanding `pkg/utils` by placing Git behavior in the self-contained Git package.\n\n## references\n\n- n/a\n\n\n<!-- This is an auto-generated comment: release notes by coderabbit.ai -->\n## Summary by CodeRabbit\n\n* **New Features**\n  * Added Git YAML tags (!git.root / !repo-root, !git.sha, !git.ref, !git.branch) to resolve repo root, commit SHA/ref, and branch in configs and stacks; !git.ref can pin source versions.\n\n* **Refactor**\n  * Centralized git tag resolution for consistent behavior, alias support, unified fallbacks, and clearer error handling.\n\n* **Tests**\n  * Expanded coverage for tag resolution, fallbacks, detached‑HEAD behavior, and real-repo scenarios.\n\n* **Documentation**\n  * Updated blog post and roadmap with examples and usage notes.\n\n<!-- review_stack_entry_start -->\n\n[![Review Change Stack](https://storage.googleapis.com/coderabbit_public_assets/review-stack-in-coderabbit-ui.svg)](https://app.coderabbit.ai/change-stack/cloudposse/atmos/pull/2537?utm_source=github_walkthrough&utm_medium=github&utm_campaign=change_stack)\n\n<!-- review_stack_entry_end -->\n<!-- end of auto-generated comment: release notes by coderabbit.ai -->\n</details>\n\n\n## 🚀 Enhancements\n\n<details>\n  <summary>Fix templated store hook execution @osterman (#2539)</summary>\n## what\n\n- Render hook execution fields only after a hook matches the current event and skip filters.\n- Preserve static hook discovery/preflight while supporting `!template` and bare Go templates in store hook names, output keys, and output values.\n- Add regression tests for templated store hooks and non-matching hooks with invalid execution-only templates.\n\n## why\n\n- Fixes a regression where templated `store-outputs.name` values were used literally, causing store lookup failures.\n- Keeps pre-auth hook discovery safe while allowing execution-time hook fields to use the fully available component context.\n- Prevents future regressions for both YAML function and bare Go template forms.\n\n## references\n\n- Closes #2538\n\n\n<!-- This is an auto-generated comment: release notes by coderabbit.ai -->\n## Summary by CodeRabbit\n\n* **New Features**\n  * Hooks now resolve execution-time templates and custom YAML functions, supporting nested templating, rendering into hook execution fields, stronger type validation, and clearer hook-specific error messages.\n\n* **Tests**\n  * Added tests for template rendering, YAML-function evaluation, nested value processing, error cases, and store-hook execution behavior.\n\n<!-- review_stack_entry_start -->\n\n[![Review Change Stack](https://storage.googleapis.com/coderabbit_public_assets/review-stack-in-coderabbit-ui.svg)](https://app.coderabbit.ai/change-stack/cloudposse/atmos/pull/2539?utm_source=github_walkthrough&utm_medium=github&utm_campaign=change_stack)\n\n<!-- review_stack_entry_end -->\n<!-- end of auto-generated comment: release notes by coderabbit.ai -->\n</details>\n\n<details>\n  <summary>fix(auth): normalize override keys to uppercase in filterAtmosOverrides (#2349) @thejrose1984 (#2541)</summary>\n## what\n\n* Uppercase the override key before the prefix check (and in the returned map) inside `pkg/auth/manager_env_overrides.go:filterAtmosOverrides`.\n* Add regression test cases in `TestFilterAtmosOverrides` covering Viper-lowercased keys, mixed-case keys, and mixed atmos/non-atmos casings.\n\n## why\n\n`filterAtmosOverrides` did a case-sensitive `strings.HasPrefix(k, \\\"ATMOS_\\\")`. The function's documented contract was \\\"only keys with the `ATMOS_*` prefix\\\" — but in production the only realistic source of its input map is an MCP server `env:` block in `atmos.yaml` / `.atmos.d/mcp.yaml`, which Viper loads with **all map keys lowercased**.\n\nThis is the same Viper-lowercasing pitfall already documented and handled on a sibling code path by `pkg/mcp/client/mcpconfig.go:copyEnv` (the CLI-provider pass-through that writes config files for Claude Code / Codex / Gemini). That fix wasn't applied to the auth code path, so an authored:\n\n```yaml\nmcp:\n  servers:\n    atmos:\n      command: atmos\n      args: [\\\"mcp\\\", \\\"start\\\"]\n      env:\n        ATMOS_PROFILE: managers\n      identity: core-root/terraform\n```\n\nreached `filterAtmosOverrides` as `{\\\"atmos_profile\\\": \\\"managers\\\"}`, was silently dropped, and the auth manager was rebuilt against the default profile. Identity resolution then surfaced as:\n\n```\n✗ Server failed to start\n   Error: MCP server failed to start: atmos: auth setup failed for \\\"atmos\\\": identity not found: core-root/terraform\n```\n\nI confirmed Viper's lowercasing end-to-end against the actual `schema.MCPServerConfig` shape (`Env map[string]string`):\n\n```\nenv key=\\\"atmos_profile\\\" value=\\\"managers\\\"\nenv key=\\\"aws_region\\\"    value=\\\"us-east-1\\\"\n```\n\n— so the authored `ATMOS_PROFILE` is gone by the time the filter runs.\n\n## scope of behavior change\n\n* Already-uppercase callers (`ATMOS_PROFILE`): unchanged.\n* Previously-dropped lowercase/mixed-case callers (`atmos_profile`, `Atmos_Profile`): now honored — and those are exactly the users hitting the documented bug.\n* Non-`ATMOS_*` keys: still dropped, regardless of case (`aws_profile`, `FOO`, `foo`).\n* Existing `TestFilterAtmosOverrides` cases still pass unchanged.\n* Existing `TestCreateAndAuthenticateManagerWithEnvOverrides_*` tests still pass unchanged.\n\n## alternatives considered\n\nI weighed three fix locations on the original issue:\n\n1. **Uppercase inside `filterAtmosOverrides`** (this PR). Smallest possible surface, single source of truth for the auth path, doesn't touch the MCP layer.\n2. **`copyEnv` (or equivalent) inside `ScopedAuthProvider.ForServer`.** Localizes to the MCP adapter; downside is a future non-MCP consumer of `CreateAndAuthenticateManagerWithEnvOverrides` that loads its env map from YAML would hit the same trap.\n3. **Uppercase at `ParseConfig` time.** Widest reach — would also affect subprocess env propagation. A real (if narrow) behavior change for users who deliberately set unconventionally-cased env vars in `env:` and expected those passed to the spawned MCP server verbatim.\n\nOption 1 fixes the documented case without altering any other code path's behavior or risking the subprocess-env corner case in Option 3.\n\n## references\n\n* Closes #2349\n* Related context: `pkg/mcp/client/mcpconfig.go:128` (`copyEnv`) — the parallel fix on the CLI-provider pass-through path that documents the Viper-lowercasing trap.\n\n## test plan\n\n```\ngo test ./pkg/auth -run 'TestFilterAtmosOverrides|TestCreateAndAuthenticateManagerWithEnvOverrides' -v\ngo test ./pkg/auth ./pkg/mcp/client/...\n```\n\nBoth pass. New regression subtests:\n- `viper-lowercased atmos key is normalized to uppercase`\n- `mixed-case atmos key is normalized to uppercase`\n- `viper-lowercased non-atmos key is dropped`\n- `mixed casings across atmos and non-atmos keys`\n\n<!-- This is an auto-generated comment: release notes by coderabbit.ai -->\n\n## Summary by CodeRabbit\n\n## Bug Fixes\n* Fixed an issue where environment configuration overrides specified in lowercase format (from YAML configuration files) were incorrectly dropped during processing. Environment override keys are now properly normalized to ensure consistent handling regardless of the input format used.\n\n<!-- review_stack_entry_start -->\n\n[![Review Change Stack](https://storage.googleapis.com/coderabbit_public_assets/review-stack-in-coderabbit-ui.svg)](https://app.coderabbit.ai/change-stack/cloudposse/atmos/pull/2541?utm_source=github_walkthrough&utm_medium=github&utm_campaign=change_stack)\n\n<!-- review_stack_entry_end -->\n\n<!-- end of auto-generated comment: release notes by coderabbit.ai -->\n</details>\n","mentions_count":2}]