GitHub
11/17/2025, 1:16 AMtofu init in OpenTofu v1.10.6 and earlier could potentially use unbounded memory if there is a direct or indirect dependency on a maliciously-crafted module package distributed as a "tar" archive.
This would require the attacker to coerce a root module author to depend (directly or indirectly) on a module package they control, using the HTTP, Amazon S3, or Google Cloud Storage source types to refer to a tar archive.
This release incorporates the upstream fixes for CVE-2025-58183.
• When making requests to HTTPS servers, OpenTofu v1.10.6 and earlier could potentially use unbounded memory or crash with a "panic" error if TLS verification involves an excessively-long certificate chain or a chain including DSA public keys.
This affected all outgoing HTTPS requests made by OpenTofu itself, including requests to HTTPS-based state storage backends, module registries, and provider registries. For example, an attacker could coerce a root module author to depend (directly or indirectly) on a module they control which then refers to a module or provider from an attacker-controlled registry. That mode of attack would cause failures in tofu init, at module or provider installation time.
Provider plugins contain their own HTTPS client code, which may have similar problems. OpenTofu v1.10.7 cannot address similar problems within provider plugins, and so we recommend checking for similar advisories and fixes in the provider plugins you use.
This release incorporates upstream fixes for CVE-2025-58185, CVE-2025-58187, and CVE-2025-58188.
BUG FIXES:
• Fix crash in tofu test when using deprecated outputs (#3249)
• Fix missing provider functions when parentheses are used (#3402)
• for_each inside dynamic blocks can now call provider-defined functions. (#3429)
Full Changelog: opentofu/opentofu@v1.10.6...v1.10.7
---
### Configuration
📅 Schedule: Branch creation - Between 12:00 AM and 03:59 AM ( * 0-3 * * * ) (UTC), Automerge - At any time (no schedule defined).
🚦 Automerge: Enabled.
♻️ Rebasing: Whenever PR is behind base branch, or you tick the rebase/retry checkbox.
🔕 Ignore: Close this PR and you won't be reminded about this update again.
---
• If you want to rebase/retry this PR, check this box
---
This PR was generated by Mend Renovate. View the repository job log.
runatlantis/atlantisGitHub
11/18/2025, 3:07 AMGitHub
11/18/2025, 11:52 AMCVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:L
#### References
• https://nvd.nist.gov/vuln/detail/CVE-2025-47914
• https://go.dev/cl/721960
• https://go.dev/issue/76364
• https://go.googlesource.com/crypto
• https://groups.google.com/g/golang-announce/c/w-oX3UxNcZA
• https://pkg.go.dev/vuln/GO-2025-4135
This data is provided by <https://osv.dev/vulnerabi…
runatlantis/atlantisGitHub
11/18/2025, 11:53 AMCVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:L
#### References
• https://nvd.nist.gov/vuln/detail/CVE-2025-47914
• https://go.dev/cl/721960
• https://go.dev/issue/76364
• https://go.googlesource.com/crypto
• https://groups.google.com/g/golang-announce/c/w-oX3UxNcZA
• https://pkg.go.dev/vuln/GO-2025-4135
This data is provided by <https://osv.dev/vulnerabi…
runatlantis/atlantisGitHub
11/18/2025, 11:53 AMCVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:L
#### References
• https://nvd.nist.gov/vuln/detail/CVE-2025-47914
• https://go.dev/cl/721960
• https://go.dev/issue/76364
• https://go.googlesource.com/crypto
• https://groups.google.com/g/golang-announce/c/w-oX3UxNcZA
• https://pkg.go.dev/vuln/GO-2025-4135
This data is provided by <https://osv.dev/vulnerabi…
runatlantis/atlantisGitHub
11/20/2025, 1:12 AMatlantis version command causes two bugs:
Bug 1: Nil pointer panic
• When terraform binary cache is empty (after Atlantis restart, upgrade, or cache clear)
• Panic at terraform_client.go:509 when calling dist.BinName() on nil distribution
Bug 2: Command failure on fresh instances
• On fresh Atlantis instances with existing PRs
• Fails with "no such file or directory" / "no projects to run version in"
## tests
Reproduction:
1. Clear cached binaries: rm -rf ~/.atlantis/bin/*
2. Run atlantis version
Result:
• Before fix: Panic with nil pointer dereference
• After fix: Downloads required terraform version and executes successfully
Tested on locally built Docker image with fix applied.
## references
runatlantis/atlantisGitHub
11/20/2025, 2:10 AMisMinimized attribute to avoid minimizing already minimized comments on each Atlantis command execution.
## why
This helps to avoid performance degradation by minimizing only non-minimized Atlantis comments, as opposed to processing all comments sequentially on each Atlantis command execution.
## tests
• I have tested my changes by running unit tests.
• I have tested my changes by running this version of Atlantis and checking if the --hide-prev-plan-comments performance still works in general and the performance degradation disappears.
## references
• Closes #5232
runatlantis/atlantisGitHub
11/20/2025, 2:56 AM@dependabot rebase.
---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR:
• @dependabot rebase will rebase this PR
• @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
• @dependabot merge will merge this PR after your CI passes on it
• @dependabot squash and merge will squash and merge this PR after your CI passes on it
• @dependabot cancel merge will cancel a previously requested merge and block automerging
• @dependabot reopen will reopen this PR if it is closed
• @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
• @dependabot show <dependency name> ignore conditions will show all of the ignore conditions of the specified dependency
• @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
• @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
• @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
You can disable automated security fix PRs for this repo from the Security Alerts page.
runatlantis/atlantisGitHub
11/20/2025, 5:35 PMCVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:L
#### References
• https://nvd.nist.gov/vuln/detail/CVE-2025-58181
• https://go.dev/cl/721961
• https://go.dev/issue/76363
• https://groups.google.com/g/golang-announce/c/w-oX3UxNcZA
• https://pkg.go.dev/vuln/GO-2025-4134
This data is provided by OSV and the GitHub Advisory Database (CC-BY 4.0).
---
### Malformed constraint may cause denial of service in golang.org/x/crypto/ssh/agent
CVE-2025-47914 / GHSA-f6x5-jh6r-wrfv / GO-2025-4135
More information
#### Details
SSH Agent servers do not validate the size of messages when processing new identity requests, which may cause the program to panic if the message is malformed due to an out of bounds read.
#### Severity
Unknown
#### References
• https://groups.google.com/g/golang-announce/c/w-oX3UxNcZA
• https://go.dev/cl/721960
• https://go.dev/issue/76364
This data is provided by OSV and the Go Vulnerability Database (CC-BY 4.0).
---
### golang.org/x/crypto/ssh/agent vulnerable to panic if message is malformed due to out of bounds read
CVE-2025-47914 / GHSA-f6x5-jh6r-wrfv / GO-2025-4135
More information
#### Details
SSH Agent servers do not validate the size of messages when processing new identity requests, which may cause the program to panic if the message is malformed due to an out of bounds read.
#### Severity
• CVSS Score: 5.3 / 10 (Medium)
• Vector String: CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:L
#### References
• https://nvd.nist.gov/vuln/detail/CVE-2025-47914
• https://go.dev/cl/721960
• https://go.dev/issue/76364
• https://go.googlesource.com/crypto
• https://groups.google.com/g/golang-announce/c/w-oX3UxNcZA
• https://pkg.go.dev/vuln/GO-2025-4135
This data is provided by OSV and the GitHub Advisory Database (CC-BY 4.0).
---
### Unbounded memory consumption in golang.org/x/crypto/ssh
CVE-2025-58181 / GHSA-j5w8-q4qc-rx2x / GO-2025-4134
More information
#### Details
SSH servers parsing GSSAPI authentication requests do not validate the number of mechanisms specified in the request, allowing an attacker to cause unbounded memory consumption.
#### Severity
Unknown
#### References
• https://groups.google.com/g/golang-announce/c/w-oX3UxNcZA
• https://go.dev/cl/721961
• https://go.dev/issue/76363
This data is provided by OSV and the Go Vulnerability Database (CC-BY 4.0).
---
### Configuration
📅 Schedule: Branch creation - "" (UTC), Automerge - At any time (no schedule defined).
🚦 Automerge: …
runatlantis/atlantisGitHub
11/21/2025, 6:59 PMGiteaClient.UpdateStatus method so that src (which should be atlantis/plan or atlantis/apply afaict) is passed as the Context for the gitea.CreateStatusOption struct. This should give status checks names which can be seen in the UI and pattern matched against. This seems like how the other clients are passing the status name along as well.
## why
This should make it possible for status checks to be pattern matched in branch protection rules. i.e. atlantis/plan and atlantis/apply could be explicitly required before merge.
## tests
I don't see any related tests for the client though this is my first PR, so if I'm missing something I'm happy to address it.
Edit: I tested this locally
### Before patch
Status updates have no name, a branch protection rule that has atlantis/* means nothing in this context (see screenshot)
[Screenshot 2025-11-23 at 1 03 16 AM](https://private-user-images.githubusercontent.com/8498296/517797920-dcbf3465-9ca1-4f26-9032-4a0950bdadf0.png?jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3NjM4NzgzNjMsIm5iZiI6MTc2Mzg3ODA2MywicGF0aCI6Ii84NDk4Mjk2LzUxNzc5NzkyMC1kY2JmMzQ2NS05Y2ExLTRmMjYtOTAzMi00YTA5NTBiZGFkZjAucG5nP1gtQW16LUFsZ29yaXRobT1BV1M0LUhNQUMtU0hBMjU2JlgtQW16LUNyZWRlbnRpYWw9QUtJQVZDT0RZTFNBNTNQUUs0WkElMkYyMDI1MTEyMyUyRnVzLWVhc3QtMSUyRnMzJTJGYXdzNF9yZXF1ZXN0JlgtQW16LURhdGU9MjAyNTExMjNUMDYwNzQzWiZYLUFtei1FeHBpcmVzPTMwMCZYLUFtei1TaWduYXR1cmU9OGRlZjJlNWYzOGVmY2E3NmM4ZjEwN2I5YmNiOWYwMjE5ODA1ZDNlMDllYTVmMmQzOWIwZTBiMjU3ODVkN2ViMiZYLUFtei1TaWduZWRIZWFkZXJzPWhvc3QifQ.2p6MZp-hY9OlJ-5Dq0UewRg1bE0v59JBCDveupQ3pSo)
### After patch
I built the patched version locally and re-ran a test, seeing context appear and able to assert branch protection rules. I think this was as simple as it seemed!
[Screenshot 2025-11-23 at 12 53 07 AM](https://private-user-images.githubusercontent.com/8498296/517798033-7ab8744b-0d55-4c33-974d-13ec79755d04.png?jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3NjM4NzgzNjMsIm5iZiI6MTc2Mzg3ODA2MywicGF0aCI6Ii84NDk4Mjk2LzUxNzc5ODAzMy03YWI4NzQ0Yi0wZDU1LTRjMzMtOTc0ZC0xM2VjNzk3NTVkMDQucG5nP1gtQW16LUFsZ29yaXRobT1BV1M0LUhNQUMtU0hBMjU2JlgtQW16LUNyZWRlbnRpYWw9QUtJQVZDT0RZTFNBNTNQUUs0WkElMkYyMDI1MTEyMyUyRnVzLWVhc3QtMSUyRnMzJTJGYXdzNF9yZXF1ZXN0JlgtQW16LURhdGU9MjAyNTExMjNUMDYwNzQzWiZYLUFtei1FeHBpcmVzPTMwMCZYLUFtei1TaWduYXR1cmU9NmQ4YTcxMmQzYzVhM2Q2NzY0NjE2YzhjMDVkMWY1MDI3ZmM5NGI2NzM5NThlYTI0NDZkOTIzYjQ3MTI1NTUzOSZYLUFtei1TaWduZWRIZWFkZXJzPWhvc3QifQ.1Wf6hEVbiktVcD1egYIfx_zOBIOgD3DVAFNQYFb3Kfw) [Screenshot 2025-11-23 at 12 57 09 AM](https://private-user-images.githubusercontent.com/8498296/517798037-97c44f65-a2dc-4f8c-851c-99cf056149a6.png?jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3NjM4NzgzNjMsIm5iZiI6MTc2Mzg3ODA2MywicGF0aCI6Ii84NDk4Mjk2LzUxNzc5ODAzNy05N2M0NGY2NS1hMmRjLTRmOGMtODUxYy05OWNmMDU2MTQ5YTYucG5nP1gtQW16LUFsZ29yaXRobT1BV1M0LUhNQUMtU0hBMjU2JlgtQW16LUNyZWRlbnRpYWw9QUtJQVZDT0RZTFNBNTNQUUs0WkElMkYyMDI1MTEyMyUyRnVzLWVhc3QtMSUyRnMzJTJGYXdzNF9yZXF1ZXN0JlgtQW16LURhdGU9MjAyNTExMjNUMDYwNzQzWiZYLUFtei1FeHBpcmVzPTMwMCZYLUFtei1TaWduYXR1cmU9Y2U4NDVjN2U0YWNkNDljNTk1NzA3YTA5NGRlYjJhNTNjYWY3ODAxYTFjMGRhNzBkNTU5MGM3YTcwODYyMDYyMyZYLUFtei1TaWduZWRIZWFkZXJzPWhvc3QifQ.7oxalFYNVKOBGom1_uCTA7XPxKF7YbV333LlrdNDqok)
## references
Closes #5802
runatlantis/atlantisGitHub
11/22/2025, 9:39 AMgo test ./server/events/webhooks (passes)
## references
• #5707
runatlantis/atlantisGitHub
11/23/2025, 2:33 AMdestroy_execution_order_group
## why
To support reverse execution order during destroy operations atlantis plan/apply -- -destroy. Currently, Atlantis supports execution_order_group for both resource creation and destruction. However, when hierarchical dependencies orchestrated by Terragrunt are present, resource destruction must be performed in reverse order, ensuring that child resources are removed before their parent resources. The implementation adds automatic detection of the -destroy flag, calculates effective execution groups based on operation type, and maintains backward compatibility with existing configurations. Both destructive and non-destructive global plan/apply operations work correctly in the same PR - regular operations use execution_order_group while destroy operations use destroy_execution_order_group, allowing users to safely test both creation and destruction workflows before merging.
## tests
Tests added in
• server/core/config/raw/project_test.go
• server/events/apply_command_runner_test.go
• server/events/plan_command_runner_test.go
• server/events/project_command_pool_executor_test.go
## references
• #2243
runatlantis/atlantisGitHub
11/24/2025, 8:54 PMCopyright 2017 HootSuite Media Inc. from before the project was made open source. We don't want remove that per the license, but for new files we should be tracking the copyright status.
I used the https://github.com/google/addlicense tool to makes sure all newer go files have a license using the condensed SPDX format, and labeling the copyright owners as The Atlantis Authors.
I also added a check to CI so we wouldn't forget to add them to new files.
Longer term we can add to files other than go, I just wanted to start us off somewhere.
## tests
I ran the script a few times
## references
N/A
runatlantis/atlantisGitHub
11/25/2025, 10:19 AMatlantis which uses conftest 0.63.0, policies were passing even though rego syntax was wrong.
{"level":"error","ts":"2025-11-25T09:00:44.892Z","caller":"events/project_command_runner.go:559","msg":"[{\"PolicySetName\":\"common-policies\",\"PolicyOutput\":\"Error: running test: load: loading policies: load: 2 errors occurred during loading:\\n/opt/atlantis/policies/plan_rds_test.rego:41: rego_parse_error: `if` keyword is required before rule body\\n/opt/atlantis/policies/plan_rds_test.rego:45: rego_parse_error: `if` keyword is required before rule body\\n\",\"Passed\":true,\"ReqApprovals\":1,\"CurApprovals\":0}]","json":{"repo":"myorg/myrepo","pull":"72176"},"stacktrace":"<http://github.com/runatlantis/atlantis/server/events.(*DefaultProjectCommandRunner).doPolicyCheck|github.com/runatlantis/atlantis/server/events.(*DefaultProjectCommandRunner).doPolicyCheck>\n\tgithub.com/runatlantis/atlantis/server/events/project_command_runner.go:559\ngithub.com/runatlantis/atlantis/server/events.(*DefaultProjectCommandRunner).PolicyCheck\n\tgithub.com/runatlantis/atlantis/server/events/project_command_runner.go:265\ngithub.com/runatlantis/atlantis/server/events.RunAndEmitStats\n\tgithub.com/runatlantis/atlantis/server/events/instrumented_project_command_runner.go:74\ngithub.com/runatlantis/atlantis/server/events.(*InstrumentedProjectCommandRunner).PolicyCheck\n\tgithub.com/runatlantis/atlantis/server/events/instrumented_project_command_runner.go:42\ngithub.com/runatlantis/atlantis/server/events.runProjectCmds\n\tgithub.com/runatlantis/atlantis/server/events/project_command_pool_executor.go:48\ngithub.com/runatlantis/atlantis/server/events.(*PolicyCheckCommandRunner).Run\n\tgithub.com/runatlantis/atlantis/server/events/policy_check_command_runner.go:65\ngithub.com/runatlantis/atlantis/server/events.(*PlanCommandRunner).runAutoplan\n\tgithub.com/runatlantis/atlantis/server/events/plan_command_runner.go:177\ngithub.com/runatlantis/atlantis/server/events.(*PlanCommandRunner).Run\n\tgithub.com/runatlantis/atlantis/server/events/plan_command_runner.go:319\ngithub.com/runatlantis/atlantis/server/events.(*DefaultCommandRunner).RunAutoplanCommand\n\tgithub.com/runatlantis/atlantis/server/events/command_runner.go:251"}
{"level":"info","ts":"2025-11-25T09:00:44.892Z","caller":"events/instrumented_project_command_runner.go:88","msg":"policy_check success. output available at: <https://github.com/myorg/myrepo/pull/72176%22,%22json%22:{%22repo%22:%22myorg/myrepo%22,%22pull%22:%2272176%22}}|https://github.com/myorg/myrepo/pull/72176","json":{"repo":"myorg/myrepo","pull":"72176"}}>
introduced by https://github.com/runatlantis/atlantis/pull/5820/files
syntax changed after 0.60.0
• https://github.com/open-policy-agent/conftest/releases/tag/v0.60.0
• https://support.hashicorp.com/hc/en-us/articles/43942069326483-OPA-Policy-Evaluations-Fail-With-Errors-if-keyword-is-required-before-rule-body-and-contains-keyword-is-required-for-partial-set-rules
runatlantis/atlantisGitHub
11/26/2025, 6:17 AMglob
Updates markdownlint-cli from 0.45.0 to 0.46.0
Release notes
Sourced from markdownlint-cli's releases.
## v0.46.0
• Replacedependency withglob(smaller and fewer dependencies)tinyglobby
• Updatedependency tomarkdownlint0.39.0
• Add `MD060`/`table-column-style`
• Improve `MD001`/`MD007`/`MD009`/`MD010`/`MD029`/`MD033`/`MD037`/`MD059`
• Update all dependencies viaCommits • `c8fd500` Bump version 0.46.0 • `5d85fc6` Delete and recreate package-lock.json via "npm install" to bump indirect js-y... • `1b2b54c` Bump glob from 10.4.5 to 10.5.0 • `845c5ff` Bump smol-toml from 1.4.2 to 1.5.2 • `00e4437` Bump js-yaml from 4.1.0 to 4.1.1 • `76208f1` Bump minimatch from 10.0.3 to 10.1.1 • `8e31aca` Bump commander from 14.0.1 to 14.0.2 • `15c3ed0` Bump actions/setup-node from 5 to 6 • `9cc24e8` Update tests for previous commit upgrading markdownlint library. • `34c77a6` Bump markdownlint from 0.38.0 to 0.39.0 • Additional commits viewable in compare view Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commentingDependabot
@dependabot rebase.
---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR:
• @dependabot rebase will rebase this PR
• @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
• @dependabot merge will merge this PR after your CI passes on it
• @dependabot squash and merge will squash and merge this PR after your CI passes on it
• @dependabot cancel merge will cancel a previously requested merge and block automerging
• @dependabot reopen will reopen this PR if it is closed
• @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
• @dependabot show <dependency name> ignore conditions will show all of the ignore conditions of the specified dependency
• @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
• @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
• @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
You can disable automated security fix PRs for this repo from the Security Alerts page.
runatlantis/atlantisGitHub
11/26/2025, 6:45 PMGitHub
11/28/2025, 6:48 PMATLANTIS_GITLAB_STATUS_RETRY_ENABLED that enables additional retries with back-off logic for GItLab client pipeline id query.
No change to default behavior, addresses issue #5944 when set to true.
## why
• Auto-merge does not work leading to manual action required when pipelines are left in running state (more details in issue #5944)
• Adding optional flag to allow for more retries allows GitLab to create the "merge request" pipeline and prevents this state
## tests
• I have tested my changes by adding regression tests
• Thoroughly E2E testing cases where issue was previously reproducible
## references
Closes #5944
runatlantis/atlantisGitHub
11/29/2025, 6:21 AMatlantis reset command that addresses issue #1944 by providing a way to clear PR state when Atlantis gets confused about which projects to plan after PR modifications.
### Problem
When a PR starts with many projects and then gets reworked with some removed, Atlantis may continue trying to plan projects that no longer exist. The only workaround was to close and reopen the PR.
### Solution
The new atlantis reset command simulates closing and reopening a PR by:
1. Cleaning up the PR state (clearing locks, workspaces, and database entries) - same as when a PR is closed
2. Triggering autoplan on all currently modified projects - same as when a PR is opened/updated
## Changes
• server/events/command/name.go: Add Reset to the Name enum and AllCommentCommands
• server/events/comment_parser.go: Add help text for the reset command
• server/events/reset_command_runner.go: New ResetCommandRunner that:
• Uses PullCleaner.CleanUpPull() to clear PR state
• Calls RunAutoplanCommand() to trigger replanning
• Comments on success/failure
• server/server.go: Register the reset command runner
• cmd/server.go: Add reset to default allowed commands
## Test Plan
• Unit tests for ResetCommandRunner covering:
• Successful reset flow
• Cleanup failure handling
• Comment creation failure handling
• Combined failure scenarios
• Tests verify proper interaction with PullCleaner and CommandRunner
• All existing tests pass
## Usage
atlantis reset
When commented on a PR, this will:
1. Delete all locks and workspaces for the PR
2. Re-run autoplan to detect current projects
3. Post a comment confirming the reset
Fixes #1944
🤖 Generated with Claude Code
runatlantis/atlantisGitHub
11/29/2025, 7:00 PMCONTRIBUTING.md to reflect the use of the new API, ran go mod tidy to observe that pkg/errors was no longer a direct dependency, and fix up some errors that did not match our suggested format previously (but weren't caught by the linter).
run golangci-lint
Running [/home/runner/golangci-lint-2.5.0-linux-amd64/golangci-lint config path] in [/home/runner/work/atlantis/atlantis] ...
Running [/home/runner/golangci-lint-2.5.0-linux-amd64/golangci-lint config verify] in [/home/runner/work/atlantis/atlantis] ...
Running [/home/runner/golangci-lint-2.5.0-linux-amd64/golangci-lint run] in [/home/runner/work/atlantis/atlantis] ...
Error: server/events/vcs/bitbucketcloud/client.go:67:16: ST1005: error strings should not be capitalized (staticcheck)
return nil, fmt.Errorf("Could not parse response %q: %w", string(resp), err)
^
Error: server/events/vcs/bitbucketcloud/client.go:124:10: ST1005: error strings should not be capitalized (staticcheck)
return fmt.Errorf("Cannot get my uuid! Please check required scope of the auth token!: %w", err)
^
Error: server/events/vcs/bitbucketcloud/client.go:174:20: ST1005: error strings should not be capitalized (staticcheck)
return comments, fmt.Errorf("Could not parse response %q: %w", string(res), err)
## tests
Ran tests.
## references
Close: #5269
runatlantis/atlantisGitHub
11/30/2025, 6:40 PMPreWorkflowHooksCommandRunner.RunPreHooks() before calling </atlantis/server/controllers/api_controller.go550-88:1|request.getCommands()>
• This allows pre-workflow hooks to generate atlantis.yaml before it's needed
• Matches the architecture of <atlantis/server/events/command_runner.go431-46:151|RunCommentCommand()>
2. Added Auto-Discovery Support
• When both Projects and Paths are empty in API request, create an empty <atlantis/server/events/event_parser.go1180-146:1|CommentCommand>
• Triggers </atlantis/server/events/project_command_builder.go4620-600:1|buildAllCommandsByCfg()> → discovers all modified projects
• Enables atlantis plan-equivalent behavior via API
### Changes Made
File: <atlantis/server/controllers/api_controller.go00-0:0|server/controllers/api_controller.go>
1. <atlantis/server/controllers/api_controller.go550-88:1|getCommands()>: Auto-discovery when Projects/Paths empty (lines 71-77)
2. <atlantis/server/controllers/api_controller.go2420-305:1|apiPlan()>: Run hooks before building commands (lines 244-258)
3. <atlantis/server/controllers/api_controller.go3070-370:1|apiApply()>: Run hooks before building commands (lines 309-323)
### Testing
Before Fix:
# Failed with "atlantis.yaml file exists" error
data = {"Repository": "...", "Projects": ["dev"], "PR": 2}
After Fix:
# Works - hooks generate config, then Projects resolved
data = {"Repository": "...", "Projects": ["dev"], "PR": 2}
# Also works - auto-discovers all projects
data = {"Repository": "...", "PR": 2} # No Projects/Paths
### Benefits
✅ Dynamic config generation via pre-workflow hooks now works in API
✅ Architectural consistency between API and comment flows
✅ Backward compatible - existing API calls continue to work
✅ New capability - auto-discovery via empty Projects/Paths
✅ Fixes real user issue - repo-level configurations properly merged
### Related
This fixes the issue where repo-level workflow configurations were ignored when using the API, defaulting to the server-defined workflow instead of the project-specified one (e.g., terragrunt workflow).
### Log Evidence:
Before: Only "setting workflow: default from repos[1]"
After: Both "setting workflow: default..." AND "overriding server-defined workflow with repo-specified workflow: 'terragrunt'"
runatlantis/atlantisGitHub
11/30/2025, 8:42 PMapproved mean "Approved by a user other than the author" for gitlab
• Revert #3744, as the original wording is now accurate
• Update docs to clarify that "approved" means "Approved by a user other than the author" regardless of VCS, whereas "mergeable" incorporates VCS-specific approval conditions.
## why
Per #2605, gitlab does not respect the approved the way users would expect, i.e. has someone clicked the "approved" button. This is how the other VCSs interpret approved.
The current implementation for gitlab is closer to "are approval rules passing". That's what I thought "approved" meant when I implemented #3744 (since I'm most familiar with gitlab).
However, looking closer, it turns out:
• The other VCSs treat this as "someone other than the author clicked approve"
• gitlab itself already implements "follows approval rules" (it asserts that mr.ApprovalsBeforeMerge <= 0)
Thus there was this inconsistency, plus it meant that approved was strictly weaker than mergeable for gitlab.
The theory here I think is that it is nice to have one knob for users to turn that means "a user needs to approve this" vs "a user needs to approve this if the project thinks a user needs to approve this".
I personally will only use mergeable in my setup, since I have tight control over all the repos, but without a change like this, there's no way to implement #2605 , and force workflows to have approvals from the "atlantis side".
## tests
Before:
| apply_requirements | Project has MR Approval Rule | Project does not have MR Approval Rule |
| --------------------- | ------------------------------ | ---------------------------------------- |
| [] | Does not require approval | Does not require approval |
| [approved] | Requires approval | Does not require approval |
| [mergeable] | Requires approval | Does not require approval |
| [approved, mergeable] | Requires approval | Does not require approval |
After:
| apply_requirements | Project has MR Approval Rule | Project does not have MR Approval Rule |
| --------------------- | ------------------------------ | ---------------------------------------- |
| [] | Does not require approval | Does not require approval |
| [approved] | Requires approval | Requires approval |
| [mergeable] | Requires approval | Does not require approval |
| [approved, mergeable] | Requires approval | Requires approval |
As you can see from the above, the functional change here is, for projects that do not have an MR Approval Rule, setting approved requires approval.
## references
reverts #3744
closes: #2605
runatlantis/atlantisGitHub
11/30/2025, 9:27 PMvcs.
## why
I always found it a bit confusing that some VCSs (bitbucketcloud, bitbucketserver, and recently gitea) had their own packages, whereas github, azuredevops, and gitlab lived side-by-side in vcs. Especially as github has become bigger and more complicated, it makes sense to make these subpackages.
This also makes it more clear where we think we're testing "general VCS behavior" but in fact are testing github specific behavior.
Finally, this can help move us more towards the "plugin" architecture for VCSs that has been discussed in other places, by first providing this isolation.
## tests
This is a pure refactor; passing tests should be sufficient.
## references
Relates to #5574
runatlantis/atlantisGitHub
12/01/2025, 5:11 PMGitHub
12/02/2025, 3:20 AMProjectResult into another struct ProjectCommandOutput, which is then embedded into ProjectResult
### Secondary changes
1. Plumb SubCommand into command.ProjectContext
2. Add project information to expected output of TestApplyCommandRunner_ExecutionOrder test
3. Add mock to TestPlanCommandRunner_IsSilenced to handle call to Plan
## why
### Primary change
My main goal here was to clean up the half dozen calls in project_command_runner.go that correspond (roughly) to each possible "project command" from:
func (p *DefaultProjectCommandRunner) Apply(ctx command.ProjectContext) command.ProjectResult {
applyOut, failure, err := p.doApply(ctx)
return command.ProjectResult{
Command: command.Apply,
Failure: failure,
Error: err,
ApplySuccess: applyOut,
RepoRelDir: ctx.RepoRelDir,
Workspace: ctx.Workspace,
ProjectName: ctx.ProjectName,
SilencePRComments: ctx.SilencePRComments,
}
}
to look like:
// Apply runs terraform apply for the project described by ctx.
func (p *DefaultProjectCommandRunner) Apply(ctx command.ProjectContext) command.ProjectCommandOutput {
applyOut, failure, err := p.doApply(ctx)
return command.ProjectCommandOutput{
Failure: failure,
Error: err,
ApplySuccess: applyOut,
}
}
The goal here, as described in #5962, was to not have to set the Command as part what is returned from a the run. This makes conceptual sense; the caller of this function knows it was told to do so by "apply", why is the return of this function including that? It's not purely academic either, as we add commands, the translation might not be so easily 1:1 (for example "autoplan").
In addition, we are copy/pasting these returns for RepoRelDir, Workspace, etc., into each command, which is error prone and brittle. The new logic has each command return just what the command returns, then the call site adds in the additional context (that it already knows) before passing it up.
This would have prevented a few very subtle bugs, like #5934 and #5963, since we rely less on specifying the exact right things, in either production code or unit tests.
### Secondary changes
Most of the work to make the above work, outside of the intentional changes to project_command_runner.go, the new types in project_result.go, and consolidating the call site in project_command_pool_executor.go, was highly mechanical, just an exercise in breaking up types in unit tests. There were however some additional changes that were necessary to make this work.
All of these changes of which ended up being improvements, albeit minor ones. This gave me confidence that this change was the right direction, since it was setting up the code to be cleaner.
1. We were previously not including SubCommand in ProjectContext, even though we know it in all the same places we know CommandName. This was needed to deal with the hard-coded literal of "rm" that was again essentially "guessed" in StateRm. It was mostly just an exercising in passing an additional argument to functions
2. Now that we don't "lose" the information about "project" in the mocked version of these commands, the output is slightly different. Specifically, when we know the project we add it, whereas when the project is an empty string we omit it, so I needed to add to the expected output strings (again, in a preferable way, since previously we were specifying project in the input but having it missing in the expected output). Example: https://github.com/runatlantis/atlantis/pull/5964/files#diff-bd810f7a2c49ffcc9b60b2cd559bad49dc77687760e0b9073a9c88a362e6985aL357
3. This was a very subtle bug, basically after I made the change the was a unit test that was panicking trying to add to the database. The issue turned out to be that, because the mocked functions "forgot" about command name, the command name was specified as the default (command.Apply), which does not exercise the code path that had the missing pointer. Now that our code keeps its command even after calling mocked version of Plan(), we need to make sure we specify a non-nil value in the PlanSuccess https://github.com/runatlantis/atlantis/pull/5964/files#diff-0afeda625c8feb719ac324deab2c577861662762aecde074307d5a19aa0b1126R129
## tests
This is a refactor so should be safe.
I'm not sure the "command" is used anywhere but logs and outputs anyway
## references
closes: #5962
Would have prevented bugs: #5934 and #5963
runatlantis/atlantisGitHub
12/02/2025, 3:32 AM## 13.2.1
#### Fix
• ab3a795 Fix support for spaces in class names
#### Types
• efb5312 Refactor to use `@import`s
• a5bc210 Add declaration maps
Full Changelog: syntax-tree/mdast-util-to-hast@13.2.0...13.2.1Commits • `174795b` 13.2.1 • `3d05b3a` Update Node in Actions • `ab3a795` Fix support for spaces in class names • `efb5312` Refactor to use `@import`s • `a5bc210` Add declaration maps • `b54955d` Add
.tsbuildinfo to .gitignore
• See full diff in compare view
[Dependabot compatibility score](https://camo.githubusercontent.com/a438aa6daca7fdd58cb57105ac01f392d7a150ff735f8d86552cc525f54e08b9/68747470733a2f2f646570656e6461626f742d6261646765732e6769746875626170702e636f6d2f6261646765732f636f6d7061746962696c6974795f73636f72653f646570656e64656e63792d6e616d653d6d646173742d7574696c2d746f2d68617374267061636b6167652d6d616e616765723d6e706d5f616e645f7961726e2670726576696f75732d76657273696f6e3d31332e322e30266e65772d76657273696f6e3d31332e322e31)
Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.
---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR:
• @dependabot rebase will rebase this PR
• @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
• @dependabot merge will merge this PR after your CI passes on it
• @dependabot squash and merge will squash and merge this PR after your CI passes on it
• @dependabot cancel merge will cancel a previously requested merge and block automerging
• @dependabot reopen will reopen this PR if it is closed
• @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
• @dependabot show <dependency name> ignore conditions will show all of the ignore conditions of the specified dependency
• @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
• @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
• @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
You can disable automated security fix PRs for this repo from the Security Alerts page.
runatlantis/atlantisGitHub
12/02/2025, 3:36 AMatlantis % go test ./... -short -race
? <http://github.com/runatlantis/atlantis|github.com/runatlantis/atlantis> [no test files]
ok <http://github.com/runatlantis/atlantis/cmd|github.com/runatlantis/atlantis/cmd> (cached)
ok <http://github.com/runatlantis/atlantis/server|github.com/runatlantis/atlantis/server> 2.899s
PASS
panic: Log in goroutine after TestAPIController_Plan has completed: 2025-10-15T20:28:02.707-0400 DEBUG gauge {"name": "tally_internal_counter_cardinality", "value": 0, "tags": {"host":"global","instance":"global","version":"4.1.17"}, "type": "gauge"}
goroutine 22 [running]:
testing.(*common).log(0xc00009ac40, {0xc0000ec840, 0xb6})
/Users/lmassa/go/pkg/mod/golang.org/toolchain@v0.0.1-go1.25.1.darwin-arm64/src/testing/testing.go:1030 +0x178
testing.(*common).Logf(0xc00009ac40, {0x10515c2c8, 0x2}, {0xc0004aa410, 0x1, 0x1})
/Users/lmassa/go/pkg/mod/golang.org/toolchain@v0.0.1-go1.25.1.darwin-arm64/src/testing/testing.go:1191 +0x80
<http://go.uber.org/zap/zaptest.TestingWriter.Write({{0x10547b050|go.uber.org/zap/zaptest.TestingWriter.Write({{0x10547b050>?, 0xc00009ac40?}, 0x0?}, {0xc0001b5400, 0xb7, 0x400})
/Users/lmassa/go/pkg/mod/go.uber.org/zap@v1.27.0/zaptest/logger.go:146 +0xf0
<http://go.uber.org/zap/zapcore.(*ioCore).Write(0xc0001a3c80|go.uber.org/zap/zapcore.(*ioCore).Write(0xc0001a3c80>, {0xff, {0xc2342ce4aa2a28b0, 0x3ce12682, 0x105a22fc0}, {0x0, 0x0}, {0x10516232e, 0x5}, {0x0, ...}, ...}, ...)
/Users/lmassa/go/pkg/mod/go.uber.org/zap@v1.27.0/zapcore/core.go:99 +0x114
<http://go.uber.org/zap/zapcore.(*CheckedEntry).Write(0xc0003c6b60|go.uber.org/zap/zapcore.(*CheckedEntry).Write(0xc0003c6b60>, {0x0, 0x0, 0x0})
/Users/lmassa/go/pkg/mod/go.uber.org/zap@v1.27.0/zapcore/entry.go:253 +0x154
<http://go.uber.org/zap.(*SugaredLogger).log(0xc00006ec00|go.uber.org/zap.(*SugaredLogger).log(0xc00006ec00>, 0xff, {0x10516232e, 0x5}, {0x0, 0x0, 0x0}, {0x0, 0x0, 0x0})
/Users/lmassa/go/pkg/mod/go.uber.org/zap@v1.27.0/sugar.go:355 +0x108
<http://go.uber.org/zap.(*SugaredLogger).Debugf(...)|go.uber.org/zap.(*SugaredLogger).Debugf(...)>
/Users/lmassa/go/pkg/mod/go.uber.org/zap@v1.27.0/sugar.go:198
<http://github.com/runatlantis/atlantis/server/logging.(*StructuredLogger).Debug|github.com/runatlantis/atlantis/server/logging.(*StructuredLogger).Debug>(0xc0004dd640, {0x10516232e, 0x5}, {0x0, 0x0, 0x0})
/Users/lmassa/atlantis/server/logging/simple_logger.go:134 +0x74
<http://github.com/runatlantis/atlantis/server/metrics.(*debugReporter).ReportGauge(0xc00012a420|github.com/runatlantis/atlantis/server/metrics.(*debugReporter).ReportGauge(0xc00012a420>, {0xc000035350, 0x22}, 0xc0000f8d20, 0x0)
/Users/lmassa/atlantis/server/metrics/debug.go:47 +0x2b8
<http://github.com/uber-go/tally/v4.(*scopeRegistry).reportInternalMetrics(0xc00053a180)|github.com/uber-go/tally/v4.(*scopeRegistry).reportInternalMetrics(0xc00053a180)>
/Users/lmassa/go/pkg/mod/github.com/uber-go/tally/v4@v4.1.17/scope_registry.go:339 +0x1ec
<http://github.com/uber-go/tally/v4.(*scopeRegistry).Report(0xc00053a180|github.com/uber-go/tally/v4.(*scopeRegistry).Report(0xc00053a180>, {0x10547c680, 0xc00012a420})
/Users/lmassa/go/pkg/mod/github.com/uber-go/tally/v4@v4.1.17/scope_registry.go:115 +0x74
<http://github.com/uber-go/tally/v4.(*scope).reportRegistry(0xc000174900)|github.com/uber-go/tally/v4.(*scope).reportRegistry(0xc000174900)>
/Users/lmassa/go/pkg/mod/github.com/uber-go/tally/v4@v4.1.17/scope.go:275 +0x70
<http://github.com/uber-go/tally/v4.(*scope).reportLoopRun(0xc000174900)|github.com/uber-go/tally/v4.(*scope).reportLoopRun(0xc000174900)>
/Users/lmassa/go/pkg/mod/github.com/uber-go/tally/v4@v4.1.17/scope.go:270 +0x5c
<http://github.com/uber-go/tally/v4.(*scope).reportLoop|github.com/uber-go/tally/v4.(*scope).reportLoop>(0xc000174900, 0x3b9aca00)
/Users/lmassa/go/pkg/mod/github.com/uber-go/tally/v4@v4.1.17/scope.go:258 +0x90
<http://github.com/uber-go/tally/v4.newRootScope.func1()|github.com/uber-go/tally/v4.newRootScope.func1()>
/Users/lmassa/go/pkg/mod/github.com/uber-go/tally/v4@v4.1.17/scope.go:198 +0x7c
created by <http://github.com/uber-go/tally/v4.newRootScope|github.com/uber-go/tally/v4.newRootScope> in goroutine 21
/Users/lmassa/go/pkg/mod/github.com/uber-go/tally/v4@v4.1.17/scope.go:196 +0xa48
FAIL <http://github.com/runatlantis/atlantis/server/controllers|github.com/runatlantis/atlantis/server/controllers> 1.470s
I dug into it and the issue wasn't with that race detector detected a data race, it's because the race detector reordered some code exposing a bug where we in many places create a new scope but then discard its closer. Metrics are emitted during the tests, so if we don't close it, with the reordering, the metrics try to write to t.Log() in test that has already ended.
This code consolidates the places where we create a new metrics scope, and properly calls a Cleanup() handler to close the scope when the test is done.
I did most of the conversions
#!/bin/bash
for file in $(git grep -l '_, _.*metrics.NewLogging')
do
echo $file
cat $file | perl -pe 's/(.*), _, _ := metrics\.NewLoggingScope\((.*), (.*)/\1 := metricstest.NewLoggingScope(t, \2, \3/g' | sponge $file
~/go/bin/goimports -w $file
done
## tests
Running CI
## references
N/A
runatlantis/atlantisGitHub
12/02/2025, 5:01 AMgh-allow-mergeable-bypass-apply-flag is enabled.
• Use check suite conclusion rather than check run conclusion to determine required workflow outcome
## why
• Resolves the issue #5884
• The conclusion of an individual check run is insufficient for determining the conclusion of a workflow as it may have multiple check runs, the outcomes of which may differ, meaning a successful check run does not necessarily entail a successful workflow. Use the conclusion of the check suite instead, which holds the combined conclusion of each associated check run.
## tests
• Adding a test case where a required workflow has multiple checks in the same suite but only the first is successful
• This test fails with the implementation on main, but passes with the changes made by this PR
• Making a release on this feature branch: https://github.com/nordnet/atlantis/releases/tag/v0.37.0-pre.mergeability-from-check-suite-20250929-001
• See the associated Docker image: <http://ghcr.io/nordnet/atlantis:v0.37.0-pre.mergeability-from-check-suite-20250929-001-alpine@sha256:d7153cc2916d9c9bc0c6743ad1732bdea8d7eca73a1cd944f9f959695397cde5|ghcr.io/nordnet/atlantis:v0.37.0-pre.mergeability-from-check-suite-20250929-001-alpine@sha256:d7153cc2916d9c9bc0c6743ad1732bdea8d7eca73a1cd944f9f959695397cde5>
## references
runatlantis/atlantisGitHub
12/02/2025, 3:39 PM/api/plan and /api/apply endpoints to run pre-workflow hooks before building commands instead of after
• Added support for auto-discovery when both Projects and Paths fields are empty in API requests
• Aligned API execution order with the comment flow architecture to ensure consistent behavior
• Fixed issue where dynamically generated atlantis.yaml files (via pre-workflow hooks) could not be used with the API
## why
• The API had a critical chicken-and-egg problem: it tried to load atlantis.yaml before pre-workflow hooks could generate it
• This caused "cannot specify a project name unless an atlantis.yaml file exists" errors for repos using dynamic config generation
• The API flow was architecturally inconsistent with the comment flow (which runs hooks early and works correctly)
• Without auto-discovery support, API users couldn't replicate atlantis plan (no args) behavior
• Repo-level workflow configurations were being ignored when using the API, defaulting to server-defined workflows instead of project-specified ones (e.g., custom terragrunt workflow)
Execution Order Before Fix:
API: Clone → Load Config ❌ → Build Commands → Run Pre-Hooks (too late) Comment: Clone → Run Pre-Hooks ✅ → Load Config → Build Commands
Execution Order After Fix:
API: Clone → Run Pre-Hooks ✅ → Load Config → Build Commands Comment: Clone → Run Pre-Hooks ✅ → Load Config → Build Commands
## tests
• Tested with dynamically generated atlantis.yaml via pre-workflow hooks - config now generates before being read
• Verified API requests with Projects: ["dev"] properly resolve project configurations and apply repo-level workflows
• Confirmed auto-discovery works when Projects and Paths are omitted from API request
• Validated backward compatibility - existing API calls with explicit Projects/Paths continue to work
• Verified logs show correct workflow merging: "overriding server-defined workflow with repo-specified workflow"
runatlantis/atlantisGitHub
12/02/2025, 5:46 PMplan command's validator to ignore the policies_passed requirement when present in ProjectContext.PlanRequirements.
This resolves issue #5993 introduced by #5851: When a policy check fails, the subsequent plan always fails. Plans run after this run as normal.
It seems that after a failure, atlantis updates its internal state to a point before the policy check - so any subsequent plan will succeed. An alternative solution could be to "pretend" the policy checks haven't run yet in the context of the plan.Specifying
repos[*].plan_requirements: [] in the server-side repos.yaml does not successfully work around the issue - the value seems to be overwritten somewhere.
## why
This fixes an issue with the standard use case for policy checks. We want to upgrade to the latest atlantis version to make use of parallel plan & apply - but the additional friction caused by this (and potential contacts from teams not familiar with atlantis) means we cannot adopt this version.
I believe atlantis can only run policy checks after a plan is completed, so this small-scoped solution makes the most sense to me. If this assumption is wrong, I'd be happy to look into an alternative solution that fits a broader set of use cases!
## tests
• I have updated the relevant unit tests to account for this new test case
## references
• caused by #5851
• closes #5993
runatlantis/atlantisGitHub
12/02/2025, 8:25 PMDEFAULT_CONFTEST_VERSION available to runtime without explicitly defining it.
## why
Prevent annoying log message related to conftest version not being defined.
## tests
I have tested my changes by build atlantis and running it with docker run.
## references
closes #5996
runatlantis/atlantis