Skip to content

fix(config): include main pkl path in cache fresh files#879

Merged
jdx merged 2 commits intomainfrom
fix/pkl-cache-invalidation-pklr
Apr 26, 2026
Merged

fix(config): include main pkl path in cache fresh files#879
jdx merged 2 commits intomainfrom
fix/pkl-cache-invalidation-pklr

Conversation

@jdx
Copy link
Copy Markdown
Owner

@jdx jdx commented Apr 26, 2026

Summary

  • Closes discussion #877.
  • When HK_PKL_BACKEND=pklr was set, edits to hk.pkl weren't picked up until hk cache clear was run. The default pkl CLI didn't have this issue.
  • Always append the main config path to the config cache's fresh_files so changes to hk.pkl invalidate the cache regardless of which backend's analyze_imports is used.

Root cause

Config::load_config_cached built fresh_files from analyze_imports's output. The two backends return different things:

  • The pkl CLI path reads pkl analyze imports's resolvedImports map. Its keys include the main file itself plus its transitive imports, so hk.pkl ended up in fresh_files by accident.
  • pklr::analyze_imports parses the source and returns only the direct/transitive import URIs — it never includes the source file in its output.

With pklr, fresh_files therefore did not contain hk.pkl. Editing hk.pkl updated its mtime but no file in fresh_files was newer than the cache, so is_fresh() returned true and the stale Config was reused.

The pre-existing comment // Build the config cache with all fresh files (imports + main config) shows the intent already was "imports + main config" — this was a missed step in implementation, not a design decision.

Test plan

  • Build with mise run build.
  • Reproduce against main: with HK_PKL_BACKEND=pklr and a scratch hk.pkl, run hk check --why, then rename a step name in hk.pkl. Confirmed hk check --why still reports the old name without the fix; reports the new name with the fix.
  • Repeat without HK_PKL_BACKEND (default backend): edits picked up correctly — no regression.
  • mise run test:cargo — 145 passed.
  • test/config_pkl_imports.bats — passes.

🤖 Generated with Claude Code


Note

Low Risk
Low risk: small change limited to cache invalidation inputs for .pkl configs, with minimal chance of side effects beyond slightly more frequent cache refreshes.

Overview
Ensures .pkl config cache invalidation always considers the main config file by inserting path into the fresh_files set built from analyze_imports.

This fixes stale Config reuse when HK_PKL_BACKEND=pklr, where analyze_imports doesn’t include the source file (while avoiding duplicates for the pkl CLI backend via IndexSet).

Reviewed by Cursor Bugbot for commit ec979b0. Bugbot is set up for automated code reviews on this repo. Configure here.

When HK_PKL_BACKEND=pklr was active, edits to hk.pkl were not
detected because pklr::analyze_imports does not include the source
file itself in its output (only its imports). The default pkl CLI's
resolvedImports happens to include the main file as a key, masking
the bug for that backend.

Always append the main config path to fresh_files so the config
cache is invalidated whenever hk.pkl changes, regardless of which
backend's analyze_imports is used.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@gemini-code-assist
Copy link
Copy Markdown
Contributor

Warning

You have reached your daily quota limit. Please wait up to 24 hours and I will start processing your requests again!

@greptile-apps
Copy link
Copy Markdown

greptile-apps Bot commented Apr 26, 2026

Greptile Summary

Fixes a cache invalidation bug in Config::load_config_cached where edits to hk.pkl were not detected when HK_PKL_BACKEND=pklr was set, because the pklr backend's analyze_imports omits the source file from its output. The fix unconditionally inserts the main config path into the IndexSet<PathBuf> of fresh_files, and uses IndexSet's deduplication to avoid double-listing the path for the pkl CLI backend, which already includes it.

Confidence Score: 5/5

Safe to merge — targeted fix that only broadens cache invalidation inputs, with correct deduplication via IndexSet.

Single-file, four-line change with no logic regressions. The use of IndexSet correctly handles the pre-existing concern about duplicate entries for the pkl CLI backend. No security, data, or correctness issues identified.

No files require special attention.

Important Files Changed

Filename Overview
src/config.rs Adds path.clone() to the IndexSet of fresh_files after populating it from analyze_imports, ensuring the main config file always participates in cache invalidation regardless of which pkl backend is active.

Flowchart

%%{init: {'theme': 'neutral'}}%%
flowchart TD
    A[load_config_cached] --> B{is_pkl?}
    B -- No --> C["fresh_files = [path]"]
    B -- Yes --> D[analyze_imports cache\nfresh_file = path]
    D --> E["imports: IndexSet<PathBuf>"]
    E --> F["files = imports\nfiles.insert(path)\n← fix: always include main config"]
    F --> G["fresh_files = files (deduplicated)"]
    C --> H[config_cache_mgr\nwith_fresh_files]
    G --> H
    H --> I{cache fresh?}
    I -- Yes --> J[return cached Config]
    I -- No --> K[read & parse hk.pkl\nrefill cache]
Loading

Reviews (2): Last reviewed commit: "refactor(config): use IndexSet to avoid ..." | Re-trigger Greptile

Comment thread src/config.rs Outdated
The pkl CLI's analyze_imports already includes the main config path
(via resolvedImports' keys), so unconditionally pushing it produced
a duplicate entry. Switch to IndexSet::insert so the dedup happens
by construction.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@jdx jdx enabled auto-merge (squash) April 26, 2026 20:27
@jdx jdx merged commit 4b28d64 into main Apr 26, 2026
20 checks passed
@jdx jdx deleted the fix/pkl-cache-invalidation-pklr branch April 26, 2026 20:33
@jdx jdx mentioned this pull request Apr 26, 2026
jdx added a commit that referenced this pull request Apr 26, 2026
### 🐛 Bug Fixes

- **(builtins)** silence pklr deprecation warnings on Builtins.pkl load
by [@jdx](https://github.com/jdx) in
[#880](#880)
- **(ci)** serialize docs lint step by [@jdx](https://github.com/jdx) in
[#874](#874)
- **(config)** include main pkl path in cache fresh files by
[@jdx](https://github.com/jdx) in
[#879](#879)
- **(docs)** stack banner message and link on mobile by
[@jdx](https://github.com/jdx) in
[#865](#865)
- **(docs)** pin banner close button to top-right corner on mobile by
[@jdx](https://github.com/jdx) in
[#867](#867)

### 📚 Documentation

- **(site)** show release version and github stars by
[@jdx](https://github.com/jdx) in
[#872](#872)

### 🔍 Other Changes

- add pr-closer workflow by [@jdx](https://github.com/jdx) in
[#876](#876)

### 📦️ Dependency Updates

- bump communique 1.0.3 → 1.0.4 by [@jdx](https://github.com/jdx) in
[#868](#868)
- update anthropics/claude-code-action digest to 2da6cfa by
[@renovate[bot]](https://github.com/renovate[bot]) in
[#869](#869)
- update anthropics/claude-code-action digest to 567fe95 by
[@renovate[bot]](https://github.com/renovate[bot]) in
[#870](#870)
- bump communique to 1.1.2 by [@jdx](https://github.com/jdx) in
[#875](#875)

<!-- CURSOR_SUMMARY -->
---

> [!NOTE]
> <sup>[Cursor Bugbot](https://cursor.com/bugbot) is generating a
summary for commit 62ff432. Configure
[here](https://www.cursor.com/dashboard/bugbot).</sup>
<!-- /CURSOR_SUMMARY -->

Co-authored-by: mise-en-dev <123107610+mise-en-dev@users.noreply.github.com>
tmeijn pushed a commit to tmeijn/dotfiles that referenced this pull request May 8, 2026
This MR contains the following updates:

| Package | Update | Change |
|---|---|---|
| [hk](https://github.com/jdx/hk) | minor | `1.43.0` → `1.45.0` |

MR created with the help of [el-capitano/tools/renovate-bot](https://gitlab.com/el-capitano/tools/renovate-bot).

**Proposed changes to behavior should be submitted there as MRs.**

---

### Release Notes

<details>
<summary>jdx/hk (hk)</summary>

### [`v1.45.0`](https://github.com/jdx/hk/blob/HEAD/CHANGELOG.md#1450---2026-05-04)

[Compare Source](jdx/hk@v1.44.3...v1.45.0)

##### 🚀 Features

- **(builtins)** add `buildifier` format and lint built-ins by [@&#8203;plx](https://github.com/plx) in [#&#8203;896](jdx/hk#896)

##### 🐛 Bug Fixes

- **(step)** only auto-batch when rendered command exceeds ARG\_MAX by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;901](jdx/hk#901)

##### 📚 Documentation

- thank Namespace for GitHub Actions runner support by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;895](jdx/hk#895)

##### 🔍 Other Changes

- **(ci)** use !cancelled() instead of always() for final job by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;906](jdx/hk#906)
- **(docs)** remove shrill.en.dev analytics script by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;903](jdx/hk#903)
- remove rust-cache from release jobs by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;893](jdx/hk#893)
- invert CLAUDE.md/AGENTS.md so AGENTS.md is canonical by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;905](jdx/hk#905)
- set dev profile debug to 1 by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;907](jdx/hk#907)

##### 📦️ Dependency Updates

- update anthropics/claude-code-action digest to [`fefa07e`](jdx/hk@fefa07e) by [@&#8203;renovate\[bot\]](https://github.com/renovate\[bot]) in [#&#8203;897](jdx/hk#897)
- update jdx/mise-action digest to [`1648a78`](jdx/hk@1648a78) by [@&#8203;renovate\[bot\]](https://github.com/renovate\[bot]) in [#&#8203;898](jdx/hk#898)
- update apple-actions/import-codesign-certs action to v7 by [@&#8203;renovate\[bot\]](https://github.com/renovate\[bot]) in [#&#8203;900](jdx/hk#900)
- update autofix-ci/action action to v1.3.4 by [@&#8203;renovate\[bot\]](https://github.com/renovate\[bot]) in [#&#8203;899](jdx/hk#899)
- lock file maintenance by [@&#8203;renovate\[bot\]](https://github.com/renovate\[bot]) in [#&#8203;908](jdx/hk#908)

##### New Contributors

- [@&#8203;plx](https://github.com/plx) made their first contribution in [#&#8203;896](jdx/hk#896)

### [`v1.44.3`](https://github.com/jdx/hk/blob/HEAD/CHANGELOG.md#1443---2026-04-30)

[Compare Source](jdx/hk@v1.44.2...v1.44.3)

##### 🐛 Bug Fixes

- **(hook)** do not stage fixes when fail\_on\_fix=true by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;892](jdx/hk#892)
- use site domain for plausible data-domain by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;886](jdx/hk#886)
- make text-mode progress output usable in CI by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;890](jdx/hk#890)

##### 📚 Documentation

- prefix GitHub star count with ★ glyph by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;883](jdx/hk#883)

##### 🔍 Other Changes

- **(release)** dedupe sponsor section in release notes by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;881](jdx/hk#881)
- switch analytics from gtm/goatcounter to plausible by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;885](jdx/hk#885)
- migrate to namespace.so runners by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;891](jdx/hk#891)

### [`v1.44.2`](https://github.com/jdx/hk/blob/HEAD/CHANGELOG.md#1442---2026-04-26)

[Compare Source](jdx/hk@v1.44.1...v1.44.2)

##### 🐛 Bug Fixes

- **(builtins)** silence pklr deprecation warnings on Builtins.pkl load by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;880](jdx/hk#880)
- **(ci)** serialize docs lint step by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;874](jdx/hk#874)
- **(config)** include main pkl path in cache fresh files by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;879](jdx/hk#879)
- **(docs)** stack banner message and link on mobile by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;865](jdx/hk#865)
- **(docs)** pin banner close button to top-right corner on mobile by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;867](jdx/hk#867)

##### 📚 Documentation

- **(site)** show release version and github stars by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;872](jdx/hk#872)

##### 🔍 Other Changes

- add pr-closer workflow by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;876](jdx/hk#876)

##### 📦️ Dependency Updates

- bump communique 1.0.3 → 1.0.4 by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;868](jdx/hk#868)
- update anthropics/claude-code-action digest to [`2da6cfa`](jdx/hk@2da6cfa) by [@&#8203;renovate\[bot\]](https://github.com/renovate\[bot]) in [#&#8203;869](jdx/hk#869)
- update anthropics/claude-code-action digest to [`567fe95`](jdx/hk@567fe95) by [@&#8203;renovate\[bot\]](https://github.com/renovate\[bot]) in [#&#8203;870](jdx/hk#870)
- bump communique to 1.1.2 by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;875](jdx/hk#875)

### [`v1.44.1`](https://github.com/jdx/hk/blob/HEAD/CHANGELOG.md#1441---2026-04-24)

[Compare Source](jdx/hk@v1.44.0...v1.44.1)

##### 🐛 Bug Fixes

- **(git)** skip untracked scan when HK\_STASH\_UNTRACKED=false by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;861](jdx/hk#861)
- **(run)** add post-commit and pre-rebase subcommands by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;858](jdx/hk#858)

##### 📚 Documentation

- **(install)** recommend global hooks as primary setup path by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;855](jdx/hk#855)
- add cross-site announcement banner by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;857](jdx/hk#857)
- respect banner expires field by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;862](jdx/hk#862)

##### 🔍 Other Changes

- vendor bats test helpers instead of git submodules by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;859](jdx/hk#859)

##### 📦️ Dependency Updates

- bump communique to 1.0.3 by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;863](jdx/hk#863)
- update anthropics/claude-code-action digest to [`e58dfa5`](jdx/hk@e58dfa5) by [@&#8203;renovate\[bot\]](https://github.com/renovate\[bot]) in [#&#8203;864](jdx/hk#864)

### [`v1.44.0`](https://github.com/jdx/hk/blob/HEAD/CHANGELOG.md#1440---2026-04-23)

[Compare Source](jdx/hk@v1.43.0...v1.44.0)

##### 🚀 Features

- **(check)** implement --plan, --why, and --json by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;848](jdx/hk#848)
- **(cocogitto)** add cocogitto conventional commits config to hk builtin config by [@&#8203;hituzi-no-sippo](https://github.com/hituzi-no-sippo) in [#&#8203;838](jdx/hk#838)
- **(git)** support GIT\_DIR/GIT\_WORK\_TREE for bare-repo dotfile managers by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;847](jdx/hk#847)
- **(install)** use Git 2.54 config-based hooks with --global support by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;853](jdx/hk#853)

##### 🐛 Bug Fixes

- use text progress in CI by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;845](jdx/hk#845)

##### 📚 Documentation

- generalize agent guidelines by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;846](jdx/hk#846)
- add releases nav and aube lock by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;849](jdx/hk#849)

##### 🔍 Other Changes

- **(release)** append en.dev sponsor blurb to release notes by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;854](jdx/hk#854)
- bump communique to 1.0.1 by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;850](jdx/hk#850)

##### 📦️ Dependency Updates

- update actions-rust-lang/setup-rust-toolchain digest to [`2b1f5e9`](jdx/hk@2b1f5e9) by [@&#8203;renovate\[bot\]](https://github.com/renovate\[bot]) in [#&#8203;832](jdx/hk#832)
- update anthropics/claude-code-action digest to [`c3d45e8`](jdx/hk@c3d45e8) by [@&#8203;renovate\[bot\]](https://github.com/renovate\[bot]) in [#&#8203;833](jdx/hk#833)
- update rust crate tokio to v1.52.1 by [@&#8203;renovate\[bot\]](https://github.com/renovate\[bot]) in [#&#8203;834](jdx/hk#834)
- update actions/upload-pages-artifact action to v5 by [@&#8203;renovate\[bot\]](https://github.com/renovate\[bot]) in [#&#8203;835](jdx/hk#835)
- update taiki-e/upload-rust-binary-action digest to [`f0d45ae`](jdx/hk@f0d45ae) by [@&#8203;renovate\[bot\]](https://github.com/renovate\[bot]) in [#&#8203;839](jdx/hk#839)
- update rust crate clx to v2 by [@&#8203;renovate\[bot\]](https://github.com/renovate\[bot]) in [#&#8203;836](jdx/hk#836)
- update anthropics/claude-code-action digest to [`0d2971c`](jdx/hk@0d2971c) by [@&#8203;renovate\[bot\]](https://github.com/renovate\[bot]) in [#&#8203;841](jdx/hk#841)
- update anthropics/claude-code-action digest to [`38ec876`](jdx/hk@38ec876) by [@&#8203;renovate\[bot\]](https://github.com/renovate\[bot]) in [#&#8203;842](jdx/hk#842)
- lock file maintenance by [@&#8203;renovate\[bot\]](https://github.com/renovate\[bot]) in [#&#8203;851](jdx/hk#851)

</details>

---

### Configuration

📅 **Schedule**: (UTC)

- Branch creation
  - At any time (no schedule defined)
- Automerge
  - At any time (no schedule defined)

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever MR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this MR and you won't be reminded about this update again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this MR, check this box

---

This MR has been generated by [Mend Renovate](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My4xNjguNSIsInVwZGF0ZWRJblZlciI6IjQzLjE2OC41IiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6WyJSZW5vdmF0ZSBCb3QiLCJhdXRvbWF0aW9uOmJvdC1hdXRob3JlZCIsImRlcGVuZGVuY3ktdHlwZTo6bWlub3IiXX0=-->
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant