v1.228.0-rc.2
Pre-release
Pre-release
Add json file manager, fix empty version.files, fix lock YAML indent Erik Osterman (Cloud Posse) (@osterman) (#2966)
## what- Add a
jsonfile manager to the Version Tracker (manager: json), configured viaoptions.set: [{path, from}], that writes locked values into JSON files usingsjson/gjson— patching only the targeted field and leaving the rest of the document's formatting, key order, and whitespace untouched. - Fix
atmos version track applyto treat an explicitversion.files: []as "manage zero files" instead of silently falling back to each manager's default paths — previously there was no way to configure zero managed files. - Fix
toolchain.lock.yaml,vendor.lock.yaml, andversions.lock.yamlto write with the repo's 2-space YAML indent standard instead ofyaml.v3's bare-Marshal4-space default. - Add a changelog post and link a roadmap milestone for the new
jsonmanager.
why
- Neither the
markermanager (needs an adjacent comment annotation, which JSON has no syntax for) nor thetemplatemanager (requires hand-maintaining a separate*.tmplsource in sync with the generated file) could cleanly keep a version field in a plain JSON file — such as apackage.jsonor a Claude Code plugin manifest — up to date. This gap was found while wiring Atmos's ownagent-skills/.claude-plugin/plugin.json/.claude-plugin/marketplace.jsonto track Atmos's release version. fileRules()usedlen(Version.Files) > 0, which can't distinguish an omittedversion.fileskey (should fall back to manager defaults) from an explicitly configured empty list (should manage nothing) — both took the same fallback path.- The three lock-file writers used a bare
yaml.Marshal, which drifted their indentation away from every other Atmos-generated YAML file.
references
- Related to the Claude Code plugin version-pinning work (#2895).
Summary by CodeRabbit
-
New Features
- Added a JSON version-file manager for updating configured fields while preserving formatting, key order, whitespace, and unrelated content.
- Supports multiple fields and files, missing simple paths, and explicitly empty configurations.
- Planning now reports errors from all selected rules.
-
Documentation
- Added configuration guidance, examples, and blog documentation.
-
Improvements
- Lockfiles now use consistent two-space YAML indentation.
- Clarified import precedence and default file behavior.
- Added validation for unsupported paths, mismatches, duplicates, and missing targets.
feat: FIPS 140-3 crypto by default; build via native mage target Erik Osterman (Cloud Posse) (@osterman) (#2993)
## what- Every atmos binary — dev builds, official releases, CI test binaries, and the sharded acceptance-test suite — now builds with
GOFIPS140=latest, linking Go's native FIPS 140-3 validated cryptographic module and defaulting the binary to FIPS-enforcing mode (GODEBUG=fips140=on) at runtime. No flag or config change is required. - Documents the one known gap in
docs/prd/fips-140-mode.md: the age/NaCl-based encryption used by declarative secrets management (atmos secret keygen, the SOPS/age backend, and sealed GitHub Actions secret values) sits outside Go's FIPS module boundary and isn't covered by this change. - Converts
scripts/build-atmos.shto a native Go mage target (magefiles/build.go,Build.Binary), matching the repo's existing mage-based tooling for lint and acceptance-test orchestration, and updates every CI workflow and doc comment that referenced the old script. - Adds a changelog post and links a shipped milestone on the roadmap.
why
- Operators in regulated environments (federal, financial services, healthcare) are often required to run only FIPS 140-validated cryptography, and Atmos had no way to make that claim for any official binary.
- Verification (build + binary smoke tests, including a real outbound TLS call, plus short-test-suite runs compared against a non-FIPS baseline) found no incompatibility in Atmos's own code — its TLS config, EC curve choice, and randomness usage were already FIPS-compatible patterns; this just makes that enforced by default instead of incidental.
scripts/build-atmos.shwas the last shell-script build entrypoint in a repo that otherwise self-hosts its build/lint/test tooling through Atmos custom commands and mage targets; converting it removes the shell/Go split and adds proper unit test coverage the shell script never had.
references
docs/prd/fips-140-mode.md
Summary by CodeRabbit
-
New Features
- Official releases and build outputs now use Go’s FIPS 140-3 cryptographic module by default.
atmos versionreports the current runtime FIPS status, including structured output.- Unified build support now covers standard and cross-platform targets.
-
Bug Fixes
- Builds retry dependency downloads after temporary failures.
- Unsupported FIPS targets are rejected with clear errors.
-
Documentation
- Added guidance on FIPS mode, runtime overrides, verification, limitations, and platform exclusions.
- Added an announcement describing the updated cryptographic defaults.
-
Tests
- Expanded coverage for builds, retries, environment settings, and FIPS-enabled binaries.
🚀 Enhancements
fix: correct CI base resolution for merged PRs and symlinked repos Erik Osterman (Cloud Posse) (@osterman) (#3005)
## what- Fix
describe affectedCI base auto-detection resolving a wrong base commit for merged pull requests: merged PRs now classify what the workflow actually checked out (PR head, merge commit, or syntheticrefs/pull/<n>/merge) and anchor the base on event-payload facts (merge_commit_sha^1, orbase.shafor fast-forward merges wheremerge_commit_sha == head.sha), instead of the oldmerge-base(HEAD, origin/<target>)→HEAD~1chain that degenerates after the merge. - Fix
describe affectedmis-computing BASE worktree paths when the repository lives under a symlinked path (e.g. macOS/tmp): symlink-normalize both sides of the path re-basing, and hard-error (instead of silently guessing) when a config path cannot be represented inside the BASE checkout. - Add the checkout classification to the
Auto-detected CI baselog line (checkout=head.sha|merge-commit|synthetic-merge|unknown) so wrong-base reports are diagnosable from a single line. - New
pkg/githelpers (CommitParents,MergeBaseSHAs,FetchCommit), red-first regression tests for every checkout × merge-strategy combination (merge, squash, fast-forward, queue-merged, synthetic, unknown, closed-unmerged), and a new end-to-end test covering base auto-detection through the full affected computation. - Update the
describe affectedCLI docs and the native-CI base-resolution PRD to match; add fix-log entries underdocs/fixes/.
why
- On a
pull_request closed (merged)event with the PR head checked out (the documented workflow),merge-base(HEAD, origin/<target>)collapses to HEAD (the head is now an ancestor of the target) and theHEAD~1fallback diffs only the PR's final commit. A multi-commit PR whose last commit reverts an earlier org-wide change then reports every component as affected and dispatches a wall of post-merge plan/apply runs; conversely, changes in earlier commits could be silently missed. Observed in production with the zero-config setup. - Fast-forward/externally-merged PRs (
merge_commit_sha == head.sha) would hit the same last-commit-only failure through the new anchor, so they get a dedicated payload-base.shaanchor — caught in an adversarial field-test pass before release. - Under a symlinked repo path,
filepath.Relmixed git's symlink-resolved repo root with logical CWD-derived config paths, producing an escaping path that — depending on filesystem depth — either scanned a nonexistent BASE (greenfield fallback → everything affected) or clamped back onto the HEAD repo (BASE == HEAD → nothing affected). Both failure modes were silent. - Every strategy in the old fallback chain was only correct under an assumed checkout that nothing verified; classifying the actual checkout makes the strategy selection provably correct per case and loud when it can't be.
references
docs/fixes/2026-08-27-describe-affected-merged-pr-base-resolution.mddocs/fixes/2026-08-27-describe-affected-symlink-base-path-mangling.mddocs/prd/native-ci/framework/base-resolution.md(updated resolution matrix)- Builds on the base-resolution self-healing from #2380 and zero-config CI detection from #2241
🤖 Generated with Claude Code
Summary by CodeRabbit
-
Bug Fixes
- Improved
atmos describe affectedaccuracy for merged pull requests and varied checkout strategies. - Fixed affected-component detection for repositories accessed through symlinked paths.
- Added safeguards for configuration paths outside the repository worktree.
- Improved CI base-resolution diagnostics by identifying the detected checkout type.
- Improved
-
Documentation
- Updated CI auto-detection guidance for merged pull requests and merge groups.
-
Tests
- Added end-to-end and regression coverage for merged-PR base resolution and symlinked repositories.