diff --git a/.github/workflows/aeon.yml b/.github/workflows/aeon.yml index 6ca90491018..21918d0e9af 100644 --- a/.github/workflows/aeon.yml +++ b/.github/workflows/aeon.yml @@ -240,15 +240,14 @@ jobs: if: steps.work.outputs.mode != '' # ~/.npm is npm's content-addressable download cache — reusing it lets the # pinned install run fully offline. Version is baked into the key (immutable, - # ~100% hit after the first run of a version, shared with messages.yml). The - # restore-keys prefix degrades gracefully on a version bump. Keep the version - # in the key in sync with the pin below. + # ~100% hit after the first run of a version, shared with messages.yml). Keep + # the version in the key in sync with the pin below. No restore-keys: an older + # cache carries a stale packument, and --prefer-offline trusts it, so a bumped + # pin fails with ETARGET forever (the failed install never saves a new key). uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6 with: path: ~/.npm key: claude-code-${{ runner.os }}-2.1.287 - restore-keys: | - claude-code-${{ runner.os }}- - name: Install Claude Code if: steps.work.outputs.mode != '' diff --git a/.github/workflows/messages.yml b/.github/workflows/messages.yml index d5896458f59..0dfc5e4abac 100644 --- a/.github/workflows/messages.yml +++ b/.github/workflows/messages.yml @@ -405,13 +405,12 @@ jobs: - name: Cache Claude Code (npm) if: steps.msg.outputs.source != '' # Shares the pinned-version cache with aeon.yml so the global install runs - # offline. Keep the version in the key in sync with the pin below. + # offline. Keep the version in the key in sync with the pin below. No + # restore-keys (see aeon.yml: a stale packument breaks a bumped pin). uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6 with: path: ~/.npm key: claude-code-${{ runner.os }}-2.1.287 - restore-keys: | - claude-code-${{ runner.os }}- - name: Install Claude Code if: steps.msg.outputs.source != ''