Skip to content

fix: propagate watch callback errors to KFC for cache reliability#3052

Merged
samayer12 merged 2 commits intomainfrom
fix/watch-callback-error-propagation
Apr 24, 2026
Merged

fix: propagate watch callback errors to KFC for cache reliability#3052
samayer12 merged 2 commits intomainfrom
fix/watch-callback-error-propagation

Conversation

@samayer12
Copy link
Copy Markdown
Contributor

@samayer12 samayer12 commented Apr 17, 2026

Summary

  • Re-throw watch callback errors so KFC knows the callback failed and does not permanently cache items whose callbacks threw. Previously errors were swallowed, causing KFC to skip the item on subsequent relists — making resources like UDSExemptions invisible for hours.
  • Add soak test metric assertions for cache miss growth, resync failures, and watch controller failures that were previously collected but never used as pass/fail criteria.

Context

Production bug reported in product-support: Pepr occasionally misses UDSExemption resources after K8s API server 429 errors during EKS cluster bootstrap (UDS Core 1.1.0-unicorn, Pepr 1.1.5). The missed exemption stays invisible until pod restart or manual annotation.

Root cause spans two repos:

  1. KFC: Watcher#process caches items before running callbacks — a failed callback leaves the item permanently stuck in cache (companion PR forthcoming)
  2. Pepr (this PR): watchCallback catches and swallows all errors, so KFC never learns a callback failed

Changes

src/lib/processors/watch-processor.ts

  • Add throw e after Log.error() in the watch callback catch block (line 139)

src/lib/processors/watch-processor.test.ts

  • 4 new tests: callback error propagation (direct, queue, finalizer) + success regression guard
  • Mock ../finalizer to isolate finalizer tests

scripts/soak-test.sh

  • Assert watch_controller_failures_total == 0 every iteration
  • Assert cache miss growth stays below configurable threshold after stabilization
  • Assert resync failure count stays below configurable threshold

scripts/soak-summary.sh

  • Add "Cache Miss Trend" section with post-stabilization growth analysis

Test plan

@samayer12
Copy link
Copy Markdown
Contributor Author

@greptileai

@greptile-apps
Copy link
Copy Markdown
Contributor

greptile-apps Bot commented Apr 17, 2026

Greptile Summary

This PR fixes a production reliability bug where watchCallback silently swallowed errors, causing KFC to permanently cache items whose callbacks failed (making resources like UDSExemption invisible until pod restart). The fix is a single throw e after the existing Log.error call; four new TDD tests confirm error propagation for the direct, queue, and finalizer paths. The soak-test improvements add enforceable pass/fail assertions for watch controller failures, cache miss growth, and resync failures — and thread CACHE_MISS_GROWTH_THRESHOLD explicitly to soak-summary.sh, closing the previously flagged threshold-mismatch gap.

Confidence Score: 5/5

Safe to merge — the core fix is a minimal, well-tested one-liner and all remaining findings are P2 suggestions on soak-test infrastructure.

The production bug fix is correct and backed by four new unit tests covering all code paths. All previous reviewer concerns (forward-looking comment, threshold mismatch) are addressed. The only open finding is a P2 on the cache-miss growth metric logic in the soak script, which does not affect runtime correctness of Pepr itself.

scripts/soak-test.sh — the cache miss growth assertion compares per-interval deltas rather than cumulative post-stabilization sum, which may miss gradual steady-state accumulation.

Important Files Changed

Filename Overview
src/lib/processors/watch-processor.ts Core fix: adds throw e after logging in the catch block so KFC receives callback failures; includes a clear NOTE about the companion KFC PR dependency
src/lib/processors/watch-processor.test.ts Adds four well-structured TDD tests covering direct watch, queue, finalizer error propagation, and success regression; finalizer mock correctly isolates the new test suite
scripts/soak-test.sh Adds three metric assertions (watch failures, cache miss growth, resync failures); cache miss growth check compares per-interval deltas rather than cumulative post-stabilization sum, which can miss gradual steady-state accumulation
scripts/soak-summary.sh Adds Cache Miss Trend section and now accepts CACHE_MISS_GROWTH_THRESHOLD as a positional argument (resolving the previous env-var inconsistency with soak-test.sh)
.github/workflows/soak.yaml Promotes threshold env vars to job-level env, passes CACHE_MISS_GROWTH_THRESHOLD explicitly to soak-summary.sh — no issues found

Sequence Diagram

sequenceDiagram
    participant KFC as KFC (Watcher#process)
    participant WP as watchCallback (Pepr)
    participant CB as watchCallback/finalizeCallback

    Note over KFC,CB: Before this PR
    KFC->>KFC: cache item
    KFC->>WP: invoke callback
    WP->>CB: await callback
    CB-->>WP: throws Error
    WP->>WP: Log.error (swallow)
    WP-->>KFC: resolve (KFC unaware of failure)
    Note over KFC: item stuck cached ✗

    Note over KFC,CB: After this PR
    KFC->>KFC: cache item (companion PR will reorder this)
    KFC->>WP: invoke callback
    WP->>CB: await callback
    CB-->>WP: throws Error
    WP->>WP: Log.error
    WP-->>KFC: re-throw Error
    KFC->>KFC: aware callback failed ✓
Loading

Reviews (3): Last reviewed commit: "fix: address greptile review feedback" | Re-trigger Greptile

Comment thread src/lib/processors/watch-processor.ts Outdated
Comment thread scripts/soak-test.sh
Re-throw errors from watch callbacks after logging so KFC knows the
callback failed and does not mark the item as successfully cached.
Previously, errors were caught and swallowed, which meant KFC's cache
would permanently consider a failed item as processed — subsequent
relists would skip it and the resource would stay invisible.

This is the Pepr-side fix for a production issue where UDSExemption
resources are occasionally missed after K8s API server 429 errors
during cluster bootstrap. A companion KFC PR will reorder cache
updates to happen after callbacks succeed.

Also hardens the soak test with metric assertions for cache miss
growth, resync failures, and watch controller failures that were
previously collected but never asserted as pass/fail criteria.
Clarify watch-processor comment to reflect current KFC caching behavior
and fix threshold mismatch between soak-test.sh and soak-summary.sh by
defining thresholds at the CI job level and passing explicitly.
@samayer12 samayer12 force-pushed the fix/watch-callback-error-propagation branch from 35fd3bb to 1070a2c Compare April 23, 2026 21:01
@samayer12 samayer12 marked this pull request as ready for review April 23, 2026 22:05
@samayer12 samayer12 requested a review from a team as a code owner April 23, 2026 22:05
github-merge-queue Bot pushed a commit to defenseunicorns/kubernetes-fluent-client that referenced this pull request Apr 24, 2026
…1105)

## Summary

- **Reorder `#process`** to update the cache only after the callback
succeeds. Previously, items were cached before the callback ran — a
failed callback left the item permanently stuck in cache, invisible to
the application.
- **Guard concurrent `#list()` calls** with a `#listInProgress` flag to
prevent cache corruption when the relist timer fires during an
in-progress list.
- **Await `#process` calls in `#list()`** instead of fire-and-forget
(`void`), ensuring list reconciliation completes atomically.
- **Return success/failure from `#list()`** so both `#watch()` and the
relist timer can trigger faster resync when list operations or callbacks
fail.
- **Emit `DATA` event only after callback succeeds and cache is
updated**, eliminating phantom events for items that failed processing.
- **Refresh `lastSeenTime` during list processing** to prevent spurious
resync triggers during slow callback sequences.
- **Fix dead pagination guard** by separating `pageCount` from
`retryCount` — the guard could never trigger because `retryCount` was
always reset to 0 on pagination.
- **Remove dead backoff ternary** and unused `startSleep` import.

## Context

Production bug in Pepr/UDS Core: K8s API server returns 429 Too Many
Requests during EKS cluster bootstrap. The KFC watcher misses
`UDSExemption` CRs because:

1. `#process` caches items *before* running callbacks (line 363:
`this.#cache.set(...)`)
2. If the callback throws, the error is caught internally (line 377-378)
but the item is already in cache
3. On the next `#list()` relist, the item's UID is found in cache at the
same resourceVersion → skipped
4. The resource stays invisible until pod restart or manual annotation

Companion Pepr PR: defenseunicorns/pepr#3052

## Changes

### `src/fluent/watch.ts`
- `#process`: Move `cache.set()`/`cache.delete()` after `await
this.#callback()`. Move `DATA` emit to after cache update. Remove
internal try/catch — callers handle errors.
- `#list()`: Replace `void this.#process()` with `await this.#process()`
wrapped in try/catch. Return `boolean` (false on HTTP error, callback
failure, or max pages). Add `#listInProgress` concurrency guard with
`finally` cleanup. Add `pageCount` parameter for pagination depth
tracking. Refresh `lastSeenTime` before each process call. Remove dead
backoff ternary.
- `#watch()`: Check `#list()` return value. On failure, set
`lastSeenTime = OVERRIDE` to trigger faster resync.
- Relist timer: Await `#list()` return value and trigger faster resync
on failure. Skipped if `#listInProgress`.

10 new test cases covering: callback failure (no cache, no DATA,
DATA_ERROR emitted), relist retry, cached item skip, 429 exhaustion,
sequential processing, delete retry, resync on callback/HTTP failure
(table-driven via `it.each`), concurrent list prevention, pagination
limit.

## Breaking change analysis

**No breaking changes.** `#process`, `#list()`, `#cache`, and
`#listInProgress` are all private. `DATA_ERROR` event signature
unchanged. Cache has no public accessor.

**Behavioral change**: `WatchEvent.DATA` now fires only after successful
callback + cache update (previously fired before callback). No internal
consumers rely on the old timing. External consumers now get a stronger
guarantee: DATA means the item was fully processed.

## Test plan

- [x] 10 new test cases covering all fix commits
- [x] All 205 tests pass
- [x] ESLint: 0 errors (pre-existing warnings only)
- [x] TypeScript: no new type errors
- [x] E2E tests against k3d cluster
- [ ] Soak test with Pepr companion PR (defenseunicorns/pepr#3052)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

---------

Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com>
@github-project-automation github-project-automation Bot moved this to 👀 In review in Pepr Project Board Apr 24, 2026
@samayer12 samayer12 added this pull request to the merge queue Apr 24, 2026
@samayer12 samayer12 removed this pull request from the merge queue due to a manual request Apr 24, 2026
@samayer12 samayer12 mentioned this pull request Apr 24, 2026
5 tasks
@samayer12 samayer12 added this pull request to the merge queue Apr 24, 2026
Merged via the queue into main with commit 8f84add Apr 24, 2026
93 checks passed
@samayer12 samayer12 deleted the fix/watch-callback-error-propagation branch April 24, 2026 19:11
@github-project-automation github-project-automation Bot moved this from 👀 In review to ✅ Done in Pepr Project Board Apr 24, 2026
@codecov
Copy link
Copy Markdown

codecov Bot commented Apr 24, 2026

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 0.00%. Comparing base (ff16fc8) to head (1070a2c).
⚠️ Report is 3 commits behind head on main.

Additional details and impacted files

Impacted file tree graph

@@     Coverage Diff      @@
##   main   #3052   +/-   ##
============================
============================
🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@github-actions
Copy link
Copy Markdown

🎉 This PR is included in version 1.1.7 🎉

The release is available on GitHub release

Your semantic-release bot 📦🚀

mjnagel added a commit to defenseunicorns/uds-core that referenced this pull request May 6, 2026
This PR contains the following updates:

| Package | Change |
[Age](https://docs.renovatebot.com/merge-confidence/) |
[Confidence](https://docs.renovatebot.com/merge-confidence/) | Type |
Update | Pending |
|---|---|---|---|---|---|---|
| [@commitlint/cli](https://commitlint.js.org/)
([source](https://redirect.github.com/conventional-changelog/commitlint/tree/HEAD/@commitlint/cli))
| [`20.5.0` →
`20.5.3`](https://renovatebot.com/diffs/npm/@commitlint%2fcli/20.5.0/20.5.3)
|
![age](https://developer.mend.io/api/mc/badges/age/npm/@commitlint%2fcli/20.5.3?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@commitlint%2fcli/20.5.0/20.5.3?slim=true)
| devDependencies | patch | |
| [@commitlint/config-conventional](https://commitlint.js.org/)
([source](https://redirect.github.com/conventional-changelog/commitlint/tree/HEAD/@commitlint/config-conventional))
| [`20.5.0` →
`20.5.3`](https://renovatebot.com/diffs/npm/@commitlint%2fconfig-conventional/20.5.0/20.5.3)
|
![age](https://developer.mend.io/api/mc/badges/age/npm/@commitlint%2fconfig-conventional/20.5.3?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@commitlint%2fconfig-conventional/20.5.0/20.5.3?slim=true)
| devDependencies | patch | |
| [@vitest/coverage-v8](https://vitest.dev/guide/coverage)
([source](https://redirect.github.com/vitest-dev/vitest/tree/HEAD/packages/coverage-v8))
| [`4.1.4` →
`4.1.5`](https://renovatebot.com/diffs/npm/@vitest%2fcoverage-v8/4.1.4/4.1.5)
|
![age](https://developer.mend.io/api/mc/badges/age/npm/@vitest%2fcoverage-v8/4.1.5?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@vitest%2fcoverage-v8/4.1.4/4.1.5?slim=true)
| devDependencies | patch | |
| [astral-sh/uv](https://redirect.github.com/astral-sh/uv) | `0.11.7` →
`0.11.8` |
![age](https://developer.mend.io/api/mc/badges/age/github-tags/astral-sh%2fuv/0.11.8?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/github-tags/astral-sh%2fuv/0.11.7/0.11.8?slim=true)
| | patch | `0.11.10` (+1) |
| [astral-sh/uv](https://redirect.github.com/astral-sh/uv) | `0.11.7` →
`0.11.8` |
![age](https://developer.mend.io/api/mc/badges/age/github-releases/astral-sh%2fuv/0.11.8?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/github-releases/astral-sh%2fuv/0.11.7/0.11.8?slim=true)
| uses-with | patch | `0.11.10` (+1) |
|
[defenseunicorns/kubernetes-fluent-client](https://redirect.github.com/defenseunicorns/kubernetes-fluent-client)
| `3.11.6` → `3.11.7` |
![age](https://developer.mend.io/api/mc/badges/age/github-tags/defenseunicorns%2fkubernetes-fluent-client/3.11.7?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/github-tags/defenseunicorns%2fkubernetes-fluent-client/3.11.6/3.11.7?slim=true)
| | patch | |
|
[defenseunicorns/uds-cli](https://redirect.github.com/defenseunicorns/uds-cli)
| `v0.30.3` → `v0.30.4` |
![age](https://developer.mend.io/api/mc/badges/age/github-tags/defenseunicorns%2fuds-cli/v0.30.4?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/github-tags/defenseunicorns%2fuds-cli/v0.30.3/v0.30.4?slim=true)
| | patch | |
|
[defenseunicorns/uds-common](https://redirect.github.com/defenseunicorns/uds-common)
| `v1.24.5` → `v1.24.8` |
![age](https://developer.mend.io/api/mc/badges/age/github-tags/defenseunicorns%2fuds-common/v1.24.8?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/github-tags/defenseunicorns%2fuds-common/v1.24.5/v1.24.8?slim=true)
| | patch | |
| ghcr.io/zarf-dev/packages/init | `v0.75.0` → `v0.75.1` |
![age](https://developer.mend.io/api/mc/badges/age/docker/ghcr.io%2fzarf-dev%2fpackages%2finit/v0.75.1?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/docker/ghcr.io%2fzarf-dev%2fpackages%2finit/v0.75.0/v0.75.1?slim=true)
| | patch | |
|
[github/codeql-action](https://redirect.github.com/github/codeql-action)
| `v4.35.2` → `v4.35.3` |
![age](https://developer.mend.io/api/mc/badges/age/github-tags/github%2fcodeql-action/v4.35.3?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/github-tags/github%2fcodeql-action/v4.35.2/v4.35.3?slim=true)
| action | patch | |
|
[googleapis/release-please-action](https://redirect.github.com/googleapis/release-please-action)
| `v4.4.1` → `v5` |
![age](https://developer.mend.io/api/mc/badges/age/github-tags/googleapis%2frelease-please-action/v5?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/github-tags/googleapis%2frelease-please-action/v4.4.1/v5?slim=true)
| action | major | |
|
[kubernetes-fluent-client](https://redirect.github.com/defenseunicorns/kubernetes-fluent-client)
| [`3.11.6` →
`3.11.7`](https://renovatebot.com/diffs/npm/kubernetes-fluent-client/3.11.6/3.11.7)
|
![age](https://developer.mend.io/api/mc/badges/age/npm/kubernetes-fluent-client/3.11.7?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/kubernetes-fluent-client/3.11.6/3.11.7?slim=true)
| devDependencies | patch | |
| [likec4](https://likec4.dev)
([source](https://redirect.github.com/likec4/likec4/tree/HEAD/packages/likec4))
| [`1.55.1` →
`1.56.0`](https://renovatebot.com/diffs/npm/likec4/1.55.1/1.56.0) |
![age](https://developer.mend.io/api/mc/badges/age/npm/likec4/1.56.0?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/likec4/1.55.1/1.56.0?slim=true)
| devDependencies | minor | |
| redis | `8.6.2` → `8.6.3` |
![age](https://developer.mend.io/api/mc/badges/age/docker/redis/8.6.3?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/docker/redis/8.6.2/8.6.3?slim=true)
| | patch | |
|
[slackapi/slack-github-action](https://redirect.github.com/slackapi/slack-github-action)
| `v3.0.1` → `v3.0.3` |
![age](https://developer.mend.io/api/mc/badges/age/github-tags/slackapi%2fslack-github-action/v3.0.3?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/github-tags/slackapi%2fslack-github-action/v3.0.1/v3.0.3?slim=true)
| action | patch | |
| [vitest](https://vitest.dev)
([source](https://redirect.github.com/vitest-dev/vitest/tree/HEAD/packages/vitest))
| [`4.1.4` →
`4.1.5`](https://renovatebot.com/diffs/npm/vitest/4.1.4/4.1.5) |
![age](https://developer.mend.io/api/mc/badges/age/npm/vitest/4.1.5?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/vitest/4.1.4/4.1.5?slim=true)
| devDependencies | patch | |
| [zarf-dev/zarf](https://redirect.github.com/zarf-dev/zarf) | `v0.75.0`
→ `v0.75.1` |
![age](https://developer.mend.io/api/mc/badges/age/github-tags/zarf-dev%2fzarf/v0.75.1?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/github-tags/zarf-dev%2fzarf/v0.75.0/v0.75.1?slim=true)
| | patch | |

---

### Release Notes

<details>
<summary>conventional-changelog/commitlint
(@&#8203;commitlint/cli)</summary>

###
[`v20.5.3`](https://redirect.github.com/conventional-changelog/commitlint/blob/HEAD/@&#8203;commitlint/cli/CHANGELOG.md#2053-2026-04-30)

[Compare
Source](https://redirect.github.com/conventional-changelog/commitlint/compare/v20.5.2...v20.5.3)

**Note:** Version bump only for package
[@&#8203;commitlint/cli](https://redirect.github.com/commitlint/cli)

###
[`v20.5.2`](https://redirect.github.com/conventional-changelog/commitlint/blob/HEAD/@&#8203;commitlint/cli/CHANGELOG.md#2052-2026-04-25)

[Compare
Source](https://redirect.github.com/conventional-changelog/commitlint/compare/v20.5.0...v20.5.2)

**Note:** Version bump only for package
[@&#8203;commitlint/cli](https://redirect.github.com/commitlint/cli)

</details>

<details>
<summary>conventional-changelog/commitlint
(@&#8203;commitlint/config-conventional)</summary>

###
[`v20.5.3`](https://redirect.github.com/conventional-changelog/commitlint/blob/HEAD/@&#8203;commitlint/config-conventional/CHANGELOG.md#2053-2026-04-30)

[Compare
Source](https://redirect.github.com/conventional-changelog/commitlint/compare/v20.5.0...v20.5.3)

**Note:** Version bump only for package
[@&#8203;commitlint/config-conventional](https://redirect.github.com/commitlint/config-conventional)

</details>

<details>
<summary>vitest-dev/vitest (@&#8203;vitest/coverage-v8)</summary>

###
[`v4.1.5`](https://redirect.github.com/vitest-dev/vitest/releases/tag/v4.1.5)

[Compare
Source](https://redirect.github.com/vitest-dev/vitest/compare/v4.1.4...v4.1.5)

#####    🚀 Experimental Features

- **coverage**: Istanbul to support `instrumenter` option  -  by
[@&#8203;BartWaardenburg](https://redirect.github.com/BartWaardenburg)
and [@&#8203;AriPerkkio](https://redirect.github.com/AriPerkkio) in
[#&#8203;10119](https://redirect.github.com/vitest-dev/vitest/issues/10119)
[<samp>(0e0ff)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/0e0ff41c7)

#####    🐞 Bug Fixes

- \--project negation excludes browser instances  -  by
[@&#8203;felamaslen](https://redirect.github.com/felamaslen) in
[#&#8203;10131](https://redirect.github.com/vitest-dev/vitest/issues/10131)
[<samp>(9423d)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/9423dc084)
- Project color label on html reporter  -  by
[@&#8203;hi-ogawa](https://redirect.github.com/hi-ogawa) in
[#&#8203;10142](https://redirect.github.com/vitest-dev/vitest/issues/10142)
[<samp>(596f7)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/596f73986)
- Fix `vi.defineHelper` called as object method  -  by
[@&#8203;hi-ogawa](https://redirect.github.com/hi-ogawa) in
[#&#8203;10163](https://redirect.github.com/vitest-dev/vitest/issues/10163)
[<samp>(122c2)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/122c25b5b)
- Alias `agent` reporter to `minimal`  -  by
[@&#8203;sheremet-va](https://redirect.github.com/sheremet-va) in
[#&#8203;10157](https://redirect.github.com/vitest-dev/vitest/issues/10157)
[<samp>(663b9)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/663b99fe3)
- Respect diff config options in soft assertions  -  by
[@&#8203;Copilot](https://redirect.github.com/Copilot), **sheremet-va**
and [@&#8203;sheremet-va](https://redirect.github.com/sheremet-va) in
[#&#8203;8696](https://redirect.github.com/vitest-dev/vitest/issues/8696)
[<samp>(9787d)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/9787dedad)
- Respect diff config options in soft assertions "  -  by
[@&#8203;sheremet-va](https://redirect.github.com/sheremet-va) in
[#&#8203;8696](https://redirect.github.com/vitest-dev/vitest/issues/8696)
[<samp>(7dc6d)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/7dc6d54fd)
- **ast-collect**: Recognize \_*vi\_import* prefix in static test
discovery  -  by
[@&#8203;Yejneshwar](https://redirect.github.com/Yejneshwar) in
[#&#8203;10129](https://redirect.github.com/vitest-dev/vitest/issues/10129)
[<samp>(32546)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/325463ab2)
- **coverage**: Descriptive error message when reports directory is
removed during test run  -  by
[@&#8203;DaveT1991](https://redirect.github.com/DaveT1991) and
[@&#8203;AriPerkkio](https://redirect.github.com/AriPerkkio) in
[#&#8203;10117](https://redirect.github.com/vitest-dev/vitest/issues/10117)
[<samp>(14133)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/1413382e1)
- **snapshot**: Increase default snapshot max output length  -  by
[@&#8203;hi-ogawa](https://redirect.github.com/hi-ogawa) and **Codex**
in
[#&#8203;10150](https://redirect.github.com/vitest-dev/vitest/issues/10150)
[<samp>(21e66)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/21e66ff63)
- **ui**: Fix jsx/tsx syntax highlight  -  by
[@&#8203;hi-ogawa](https://redirect.github.com/hi-ogawa) in
[#&#8203;10152](https://redirect.github.com/vitest-dev/vitest/issues/10152)
[<samp>(f1b1f)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/f1b1f6c7b)
- **web-worker**: Support MessagePort objects referenced inside
postMessage data  -  by
[@&#8203;whitphx](https://redirect.github.com/whitphx) and **Claude Opus
4.6 (1M context)** in
[#&#8203;9927](https://redirect.github.com/vitest-dev/vitest/issues/9927)
and
[#&#8203;10124](https://redirect.github.com/vitest-dev/vitest/issues/10124)
[<samp>(7ad7d)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/7ad7d39af)
- **api**: Make test-specification options writable  -  by
[@&#8203;sheremet-va](https://redirect.github.com/sheremet-va) in
[#&#8203;10154](https://redirect.github.com/vitest-dev/vitest/issues/10154)
[<samp>(6abd5)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/6abd557b7)

#####     [View changes on
GitHub](https://redirect.github.com/vitest-dev/vitest/compare/v4.1.4...v4.1.5)

</details>

<details>
<summary>astral-sh/uv (astral-sh/uv)</summary>

###
[`v0.11.8`](https://redirect.github.com/astral-sh/uv/blob/HEAD/CHANGELOG.md#0118)

[Compare
Source](https://redirect.github.com/astral-sh/uv/compare/0.11.7...0.11.8)

Released on 2026-04-27.

##### Enhancements

- Add `--python-downloads-json-url` to `python pin`
([#&#8203;19092](https://redirect.github.com/astral-sh/uv/pull/19092))
- Fetch uv from Astral mirror during self-update
([#&#8203;18682](https://redirect.github.com/astral-sh/uv/pull/18682))
- Support `pip uninstall -y`
([#&#8203;19082](https://redirect.github.com/astral-sh/uv/pull/19082))
- Add `UV_PYTHON_NO_REGISTRY`
([#&#8203;19035](https://redirect.github.com/astral-sh/uv/pull/19035))
- Allow `exclude-newer` to be missing from the lockfile when
`exclude-newer-span` is present
([#&#8203;19024](https://redirect.github.com/astral-sh/uv/pull/19024))
- Only show the version number in `uv self version --short`
([#&#8203;19019](https://redirect.github.com/astral-sh/uv/pull/19019))
- Silence warnings on empty `SSL_CERT_DIR` directory
([#&#8203;19018](https://redirect.github.com/astral-sh/uv/pull/19018))
- Use a sentinel timestamp for relative `exclude-newer` and
`exclude-newer-package` values in lockfiles
([#&#8203;19022](https://redirect.github.com/astral-sh/uv/pull/19022),
[#&#8203;19101](https://redirect.github.com/astral-sh/uv/pull/19101))

##### Configuration

- Add an environment variable for `UV_NO_PROJECT`
([#&#8203;19052](https://redirect.github.com/astral-sh/uv/pull/19052))
- Expose `UV_PYTHON_SEARCH_PATH` for Python discovery `PATH` overrides
([#&#8203;19034](https://redirect.github.com/astral-sh/uv/pull/19034))

##### Bug fixes

- Add `rust-toolchain.toml` to uv-build sdist
([#&#8203;19131](https://redirect.github.com/astral-sh/uv/pull/19131))
- Ensure uv invocations of git do not inherit repository location
environment variables
([#&#8203;19088](https://redirect.github.com/astral-sh/uv/pull/19088))
- Redact pre-signed upload URLs in verbose output
([#&#8203;19146](https://redirect.github.com/astral-sh/uv/pull/19146))
- Handle transitive URL dependencies in PEP 517 build requirements
([#&#8203;19076](https://redirect.github.com/astral-sh/uv/pull/19076),
[#&#8203;19086](https://redirect.github.com/astral-sh/uv/pull/19086))
- Support `uv lock` on a `pyproject.toml` that only contains
dependency-groups
([#&#8203;19087](https://redirect.github.com/astral-sh/uv/pull/19087))
- Disable transparent Python upgrades in projects when a patch version
is requested via `.python-version`
([#&#8203;19102](https://redirect.github.com/astral-sh/uv/pull/19102))
- Fix Python variant tagging in the Windows registry
([#&#8203;19012](https://redirect.github.com/astral-sh/uv/pull/19012))
- Use a single codepath for extracting a .tar.zst wheel, disallowing
external symlinks
([#&#8203;19144](https://redirect.github.com/astral-sh/uv/pull/19144))

##### Documentation

- Bump astral-sh/setup-uv version in docs
([#&#8203;19030](https://redirect.github.com/astral-sh/uv/pull/19030))
- Update PyTorch documentation for PyTorch 2.11
([#&#8203;19095](https://redirect.github.com/astral-sh/uv/pull/19095))
- Remove deprecated license classifiers from uv-build and add Python
3.14 classifier
([#&#8203;19130](https://redirect.github.com/astral-sh/uv/pull/19130))

</details>

<details>
<summary>defenseunicorns/kubernetes-fluent-client
(defenseunicorns/kubernetes-fluent-client)</summary>

###
[`v3.11.7`](https://redirect.github.com/defenseunicorns/kubernetes-fluent-client/releases/tag/v3.11.7)

[Compare
Source](https://redirect.github.com/defenseunicorns/kubernetes-fluent-client/compare/v3.11.6...v3.11.7)

##### Bug Fixes

- cache items after callback succeeds to prevent permanent loss
([#&#8203;1105](https://redirect.github.com/defenseunicorns/kubernetes-fluent-client/issues/1105))
([1cbb083](https://redirect.github.com/defenseunicorns/kubernetes-fluent-client/commit/1cbb08309b6113012e7b4a5ce4906389052b1c7d)),
closes
[defenseunicorns/pepr#3052](https://redirect.github.com/defenseunicorns/pepr/issues/3052)
[defenseunicorns/pepr#3052](https://redirect.github.com/defenseunicorns/pepr/issues/3052)

</details>

<details>
<summary>defenseunicorns/uds-cli (defenseunicorns/uds-cli)</summary>

###
[`v0.30.4`](https://redirect.github.com/defenseunicorns/uds-cli/releases/tag/v0.30.4)

[Compare
Source](https://redirect.github.com/defenseunicorns/uds-cli/compare/v0.30.3...v0.30.4)

##### What's Changed

- chore(deps): update github-actions by
[@&#8203;renovate](https://redirect.github.com/renovate)\[bot] in
[#&#8203;1372](https://redirect.github.com/defenseunicorns/uds-cli/pull/1372)
- chore(deps): update github-actions by
[@&#8203;renovate](https://redirect.github.com/renovate)\[bot] in
[#&#8203;1374](https://redirect.github.com/defenseunicorns/uds-cli/pull/1374)
- fix(deps): update zarf to v0.75.1 by
[@&#8203;renovate](https://redirect.github.com/renovate)\[bot] in
[#&#8203;1376](https://redirect.github.com/defenseunicorns/uds-cli/pull/1376)
- chore: update min go version to 1.25.9 by
[@&#8203;jasonwashburn](https://redirect.github.com/jasonwashburn) in
[#&#8203;1378](https://redirect.github.com/defenseunicorns/uds-cli/pull/1378)

**Full Changelog**:
<defenseunicorns/uds-cli@v0.30.3...v0.30.4>

</details>

<details>
<summary>defenseunicorns/uds-common
(defenseunicorns/uds-common)</summary>

###
[`v1.24.8`](https://redirect.github.com/defenseunicorns/uds-common/releases/tag/v1.24.8)

[Compare
Source](https://redirect.github.com/defenseunicorns/uds-common/compare/v1.24.7...v1.24.8)

##### Miscellaneous

- add cgr to renovate config
([#&#8203;666](https://redirect.github.com/defenseunicorns/uds-common/issues/666))
([3c8bc77](https://redirect.github.com/defenseunicorns/uds-common/commit/3c8bc779e87b4266c6a3c92795cf6815985f1762))
- add chainguard creds
([#&#8203;664](https://redirect.github.com/defenseunicorns/uds-common/issues/664))
([f95716f](https://redirect.github.com/defenseunicorns/uds-common/commit/f95716f5b5b6ec93db52474a4efeda8efd9253c6))
- **deps:** update uds common foundation dependencies to v0.30.4
([#&#8203;663](https://redirect.github.com/defenseunicorns/uds-common/issues/663))
([15bd9c1](https://redirect.github.com/defenseunicorns/uds-common/commit/15bd9c11ba783db90595a587890145b72f385efa))

###
[`v1.24.7`](https://redirect.github.com/defenseunicorns/uds-common/releases/tag/v1.24.7)

[Compare
Source](https://redirect.github.com/defenseunicorns/uds-common/compare/v1.24.6...v1.24.7)

##### Bug Fixes

- pull oci artifact from proper tags
([#&#8203;660](https://redirect.github.com/defenseunicorns/uds-common/issues/660))
([a10bd99](https://redirect.github.com/defenseunicorns/uds-common/commit/a10bd99108e7b3a265788b72ed82068777ae6af6))

##### Miscellaneous

- **deps:** update uds common foundation dependencies to v1.3.0
([#&#8203;659](https://redirect.github.com/defenseunicorns/uds-common/issues/659))
([d99e231](https://redirect.github.com/defenseunicorns/uds-common/commit/d99e23129301ff06ddf2c6be3e9ac5467eb44b44))

###
[`v1.24.6`](https://redirect.github.com/defenseunicorns/uds-common/releases/tag/v1.24.6)

[Compare
Source](https://redirect.github.com/defenseunicorns/uds-common/compare/v1.24.5...v1.24.6)

##### Bug Fixes

- downgrade oras cli version
([#&#8203;658](https://redirect.github.com/defenseunicorns/uds-common/issues/658))
([448dc8c](https://redirect.github.com/defenseunicorns/uds-common/commit/448dc8c745aa640a1bc3db3d73ba9c3011df40b1))

##### Miscellaneous

- **deps:** update uds common foundation dependencies
([#&#8203;650](https://redirect.github.com/defenseunicorns/uds-common/issues/650))
([295d464](https://redirect.github.com/defenseunicorns/uds-common/commit/295d464d6c3e3c449131b302e258a85024400c8a))
- **deps:** update uds common foundation dependencies to v1.2.2
([#&#8203;657](https://redirect.github.com/defenseunicorns/uds-common/issues/657))
([13d6ea5](https://redirect.github.com/defenseunicorns/uds-common/commit/13d6ea52d8a1c53d19e13fa784d35f53ac3ebffa))
- **deps:** update uds common package dependencies
([#&#8203;651](https://redirect.github.com/defenseunicorns/uds-common/issues/651))
([0a0046f](https://redirect.github.com/defenseunicorns/uds-common/commit/0a0046f7ff0d3ef2fbb58485ddefdc9a5488a2e2))
- **deps:** update uds common support dependencies
([#&#8203;653](https://redirect.github.com/defenseunicorns/uds-common/issues/653))
([45de06c](https://redirect.github.com/defenseunicorns/uds-common/commit/45de06c2d5b8dca0cb7622b50ba77479098dc062))

</details>

<details>
<summary>github/codeql-action (github/codeql-action)</summary>

###
[`v4.35.3`](https://redirect.github.com/github/codeql-action/releases/tag/v4.35.3)

[Compare
Source](https://redirect.github.com/github/codeql-action/compare/v4.35.2...v4.35.3)

- *Upcoming breaking change*: Add a deprecation warning for customers
using CodeQL version 2.19.3 and earlier. These versions of CodeQL were
discontinued on 9 April 2026 alongside GitHub Enterprise Server 3.15,
and will be unsupported by the next minor release of the CodeQL Action.
[#&#8203;3837](https://redirect.github.com/github/codeql-action/pull/3837)
- Configurations for private registries that use Cloudsmith or GCP OIDC
are now accepted.
[#&#8203;3850](https://redirect.github.com/github/codeql-action/pull/3850)
- Best-effort connection tests for private registries now use `GET`
requests instead of `HEAD` for better compatibility with various
registry implementations. For NuGet feeds, the test is now always
performed against the service index.
[#&#8203;3853](https://redirect.github.com/github/codeql-action/pull/3853)
- Fixed a bug where two diagnostics produced within the same millisecond
could overwrite each other on disk, causing one of them to be lost.
[#&#8203;3852](https://redirect.github.com/github/codeql-action/pull/3852)
- Update default CodeQL bundle version to
[2.25.3](https://redirect.github.com/github/codeql-action/releases/tag/codeql-bundle-v2.25.3).
[#&#8203;3865](https://redirect.github.com/github/codeql-action/pull/3865)

</details>

<details>
<summary>googleapis/release-please-action
(googleapis/release-please-action)</summary>

###
[`v5`](https://redirect.github.com/googleapis/release-please-action/compare/v5.0.0...v5.0.0)

[Compare
Source](https://redirect.github.com/googleapis/release-please-action/compare/v5.0.0...v5.0.0)

###
[`v5.0`](https://redirect.github.com/googleapis/release-please-action/compare/v5.0.0...v5.0.0)

[Compare
Source](https://redirect.github.com/googleapis/release-please-action/compare/v5.0.0...v5.0.0)

###
[`v5.0.0`](https://redirect.github.com/googleapis/release-please-action/releases/tag/v5.0.0)

[Compare
Source](https://redirect.github.com/googleapis/release-please-action/compare/v4.4.1...v5.0.0)

##### ⚠ BREAKING CHANGES

- upgrade to node24
([#&#8203;1188](https://redirect.github.com/googleapis/release-please-action/issues/1188))

##### Features

- upgrade to node24
([#&#8203;1188](https://redirect.github.com/googleapis/release-please-action/issues/1188))
([46dfc01](https://redirect.github.com/googleapis/release-please-action/commit/46dfc01594fc6ec99626bc73e479c52bdf554f88))

##### Bug Fixes

- bump release-please from 17.3.0 to 17.6.0
([#&#8203;1199](https://redirect.github.com/googleapis/release-please-action/issues/1199))
([f533c26](https://redirect.github.com/googleapis/release-please-action/commit/f533c26b74c2778db7edc90c96b63a7d08035765))

</details>

<details>
<summary>likec4/likec4 (likec4)</summary>

###
[`v1.56.0`](https://redirect.github.com/likec4/likec4/blob/HEAD/packages/likec4/CHANGELOG.md#1560)

[Compare
Source](https://redirect.github.com/likec4/likec4/compare/v1.55.1...v1.56.0)

##### Patch Changes

- [#&#8203;2904](https://redirect.github.com/likec4/likec4/pull/2904)
[`935f6bb`](https://redirect.github.com/likec4/likec4/commit/935f6bb3fc42b88669bd8af65947a201f8e3d490)
Thanks [@&#8203;davydkov](https://redirect.github.com/davydkov)! -
Support applying view changes without LSP connection (e.g. in
vite-plugin/CLI mode)

-
[`ab726ed`](https://redirect.github.com/likec4/likec4/commit/ab726eda9ec87b75fd72e056fb5f89ef78fe71e0)
Thanks [@&#8203;davydkov](https://redirect.github.com/davydkov)! -
Extract web app into a separate `@likec4/spa` package, decoupling it
from the CLI for better modularity, faster builds and smaller bundles —
resolves
[#&#8203;2689](https://redirect.github.com/likec4/likec4/issues/2689)

The new package also improves DX by eliminating the dependency "magic"
that existed in the CLI package

- [#&#8203;2906](https://redirect.github.com/likec4/likec4/pull/2906)
[`af34764`](https://redirect.github.com/likec4/likec4/commit/af3476421fd8938a897240ad6fd1c70068d1e070)
Thanks [@&#8203;davydkov](https://redirect.github.com/davydkov)! - Load
icons on demand from CDN instead of bundling all icon components,
reducing bundle size. Icons are resolved from local cache, then
`@likec4/icons` package, then fetched from `icons.like-c4.dev`.

- [#&#8203;2921](https://redirect.github.com/likec4/likec4/pull/2921)
[`5f46082`](https://redirect.github.com/likec4/likec4/commit/5f460821526d851ef3bbf8be5a2bd749c2df6a8a)
Thanks [@&#8203;davydkov](https://redirect.github.com/davydkov)! -
Update Mantine to 9.1.0. The `light` variant of Buttons, Alerts, and
ActionIcons now uses solid colors instead of transparency.

- Updated dependencies
\[[`ace5b2e`](https://redirect.github.com/likec4/likec4/commit/ace5b2e5cd261f47bd2e93b6f495e2122ceef16d),
[`5f46082`](https://redirect.github.com/likec4/likec4/commit/5f460821526d851ef3bbf8be5a2bd749c2df6a8a)]:
-
[@&#8203;likec4/core](https://redirect.github.com/likec4/core)@&#8203;1.56.0

</details>

<details>
<summary>slackapi/slack-github-action
(slackapi/slack-github-action)</summary>

###
[`v3.0.3`](https://redirect.github.com/slackapi/slack-github-action/compare/v3.0.2...v3.0.3)

[Compare
Source](https://redirect.github.com/slackapi/slack-github-action/compare/v3.0.2...v3.0.3)

###
[`v3.0.2`](https://redirect.github.com/slackapi/slack-github-action/releases/tag/v3.0.2):
Slack GitHub Action v3.0.2

[Compare
Source](https://redirect.github.com/slackapi/slack-github-action/compare/v3.0.1...v3.0.2)

##### Patch Changes

-
[`79529d7`](https://redirect.github.com/slackapi/slack-github-action/commit/79529d7):
fix: resolve url.parse deprecation warning for webhook techniques

</details>

<details>
<summary>zarf-dev/zarf (zarf-dev/zarf)</summary>

###
[`v0.75.1`](https://redirect.github.com/zarf-dev/zarf/releases/tag/v0.75.1)

[Compare
Source](https://redirect.github.com/zarf-dev/zarf/compare/v0.75.0...v0.75.1-rc1)

##### Features

- parse multi doc zarf.yaml files
([#&#8203;4827](https://redirect.github.com/zarf-dev/zarf/issues/4827))
([44ae0e2](https://redirect.github.com/zarf-dev/zarf/commit/44ae0e25503931e6825100a2a17eac192c2c497a))
- stop adding Zarf service default values to state when the service does
not exist
([#&#8203;4832](https://redirect.github.com/zarf-dev/zarf/issues/4832))
([c4a06fb](https://redirect.github.com/zarf-dev/zarf/commit/c4a06fb5dc5f80c6577cddbea34189bfa54c591d))
- **verfication:** trusted root fetch command
([#&#8203;4829](https://redirect.github.com/zarf-dev/zarf/issues/4829))
([73825da](https://redirect.github.com/zarf-dev/zarf/commit/73825da520a53fa6c245bb8a6ee1138c1248e3b3))

##### Bug Fixes

- **create:** built package path separators
([#&#8203;4857](https://redirect.github.com/zarf-dev/zarf/issues/4857))
([48574c2](https://redirect.github.com/zarf-dev/zarf/commit/48574c29288e740d5498fb469e77793e40bc1b46))
- ensure zarf say honors no-color
([#&#8203;4850](https://redirect.github.com/zarf-dev/zarf/issues/4850))
([f9748d5](https://redirect.github.com/zarf-dev/zarf/commit/f9748d5993d5c2eb9cf8d21c2db9e98ec9965ecd))
- **template:** add to dissallowed functions
([#&#8203;4848](https://redirect.github.com/zarf-dev/zarf/issues/4848))
([cedec4d](https://redirect.github.com/zarf-dev/zarf/commit/cedec4dcbae3e5cfd234c030ebd4c71aebfe7c8b))

<!-- Release notes generated using configuration in .github/release.yml
at v0.75.1 -->

#### What's Changed

##### 🚀 Updates

- chore(main): release 0.75.1 by
[@&#8203;zarf-release-please](https://redirect.github.com/zarf-release-please)\[bot]
in [#&#8203;4833](https://redirect.github.com/zarf-dev/zarf/pull/4833)

**Full Changelog**:
<zarf-dev/zarf@v0.75.1-rc2...v0.75.1>

</details>

---

### Configuration

📅 **Schedule**: (in timezone America/New_York)

- 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 PR becomes conflicted, or you tick the
rebase/retry checkbox.

👻 **Immortal**: This PR will be recreated if closed unmerged. Get
[config
help](https://redirect.github.com/renovatebot/renovate/discussions) if
that's undesired.

---

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

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/defenseunicorns/uds-core).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My4xNTkuMiIsInVwZGF0ZWRJblZlciI6IjQzLjE1OS4yIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6W119-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Micah Nagel <micah.nagel@defenseunicorns.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

Status: ✅ Done

Development

Successfully merging this pull request may close these issues.

2 participants