From 1e0b2dc1fe7d0a7ee76d4573685ce6253b98105a Mon Sep 17 00:00:00 2001 From: NRGLine4sec Date: Wed, 23 Sep 2026 16:38:38 +0200 Subject: [PATCH] feat(claude): pin Claude Code 2.1.280 until nixos-unstable catches up Opus 5.5 is only selectable from Claude Code 2.1.280 onwards. The locked nixpkgs ships 2.1.258 and nixos-unstable is currently at 2.1.278, so a plain lock bump is not enough yet. Override the nixpkgs derivation with the upstream 2.1.280 release manifest (taken verbatim from nixpkgs master) instead of vendoring a package. The override only applies while pkgs.claude-code is older than the pinned manifest, so the next lock update that brings a newer version makes it a no-op. Co-Authored-By: Claude Opus 5.5 --- modules/agents/claude-code-manifest.json | 92 ++++++++++++++++++++++++ modules/agents/claude.nix | 17 ++++- 2 files changed, 107 insertions(+), 2 deletions(-) create mode 100644 modules/agents/claude-code-manifest.json diff --git a/modules/agents/claude-code-manifest.json b/modules/agents/claude-code-manifest.json new file mode 100644 index 0000000..bf3dbd2 --- /dev/null +++ b/modules/agents/claude-code-manifest.json @@ -0,0 +1,92 @@ +{ + "version": "2.1.280", + "manifestSignatureEnforcement": "flag", + "commit": "80abbfe7d7232280011ff01a21ae3338f4c6e372", + "modsCommit": "8187baaaafb3a9ada02d3d6fb4e8d68587aef6b0", + "buildDate": "2026-09-21T20:56:45Z", + "platforms": { + "darwin-arm64": { + "binary": "claude.zst", + "checksum": "214fafd9d60bc0397cb68747b765ab752be4b53303c176ad885c4cafbe30826f", + "size": 72900982, + "bundle": { + "checksum": "5882f558c44d569dd35047588143a536711d4e415bebf94da1543a25e5bc5898", + "size": 72903461 + } + }, + "darwin-x64": { + "binary": "claude.zst", + "checksum": "2b5ca074d02ea5dd507db0a90ba55847e297061ca3e987ddc49ea89ae0ff2e7e", + "size": 77008555, + "bundle": { + "checksum": "bf78bfd5af2400f39d21378198f689c3856d7a11aeb9919b012f27143e946cbf", + "size": 77013965 + } + }, + "linux-arm64": { + "binary": "claude.zst", + "checksum": "6a01f30418f35122a672ccf74bed64aba5119ad47c71548a3b447cc9fec48c81", + "size": 82030081 + }, + "linux-x64": { + "binary": "claude.zst", + "checksum": "27910e2ae704d8f2e8024897d8fdf1e7710807baf4f6982c0e3797c058315384", + "size": 82761570 + }, + "linux-arm64-musl": { + "binary": "claude.zst", + "checksum": "32dbe8a94da9689791688e0febfb88c39897ad67f055853e7ae1b6d11c4b4e39", + "size": 80444179 + }, + "linux-x64-musl": { + "binary": "claude.zst", + "checksum": "2b2e206987e357997bf5c06baf697379b5980a7cc6f1462ca70a6757ece58890", + "size": 81193598 + }, + "win32-x64": { + "binary": "claude.exe.zst", + "checksum": "cb50dbe5b595b52925d753b10d5907748a4137e7f0bff84d03ea60cd9a28eaf9", + "size": 85069447 + }, + "win32-arm64": { + "binary": "claude.exe.zst", + "checksum": "705dccf9d924d471e32efa19157283da2cdd0b8cfc71d7e0a9e3ec4d13ac381b", + "size": 81530251 + } + }, + "sdkCompat": { + "testedWrapperVersions": [ + "0.3.240", + "0.3.241", + "0.3.242", + "0.3.243", + "0.3.245", + "0.3.246", + "0.3.247", + "0.3.248", + "0.3.250", + "0.3.251", + "0.3.252", + "0.3.257", + "0.3.258", + "0.3.259", + "0.3.260", + "0.3.261", + "0.3.263", + "0.3.266", + "0.3.267", + "0.3.268", + "0.3.269", + "0.3.270", + "0.3.271", + "0.3.272", + "0.3.273", + "0.3.274", + "0.3.275", + "0.3.276", + "0.3.277", + "0.3.278" + ], + "harnessSchema": 1 + } +} diff --git a/modules/agents/claude.nix b/modules/agents/claude.nix index e38d894..3dbc7a2 100644 --- a/modules/agents/claude.nix +++ b/modules/agents/claude.nix @@ -1,9 +1,22 @@ -{ pkgs, ... }: +{ pkgs, lib, ... }: +let + # nixos-unstable routinely trails upstream Claude Code by a few releases, and + # new models are gated on a minimum CLI version (e.g. Opus 5.5 needs 2.1.280). + # Feed nixpkgs' own derivation a newer release manifest when the locked + # nixpkgs is behind; once it catches up, the stock package wins again and + # this pin becomes a no-op. + pinnedManifest = lib.importJSON ./claude-code-manifest.json; + claude-code = + if lib.versionOlder pkgs.claude-code.version pinnedManifest.version then + pkgs.claude-code.override { manifest = pinnedManifest; } + else + pkgs.claude-code; +in { claude-vm.agent = { name = "claude"; launchCommand = "claude"; - extraPackages = [ pkgs.claude-code ]; + extraPackages = [ claude-code ]; shellInit = '' # Seed microVM disk-space awareness into Claude's user-level memory. This # runs inside base.nix's seed lock (it inlines shellInit there), so it