fix: propagate watch callback errors to KFC for cache reliability#3052
fix: propagate watch callback errors to KFC for cache reliability#3052
Conversation
Greptile SummaryThis PR fixes a production reliability bug where Confidence Score: 5/5Safe 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
Sequence DiagramsequenceDiagram
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 ✓
Reviews (3): Last reviewed commit: "fix: address greptile review feedback" | Re-trigger Greptile |
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.
35fd3bb to
1070a2c
Compare
…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>
Codecov Report✅ All modified and coverable lines are covered by tests. Additional details and impacted files@@ Coverage Diff @@
## main #3052 +/- ##
============================
============================
🚀 New features to boost your workflow:
|
|
🎉 This PR is included in version 1.1.7 🎉 The release is available on GitHub release Your semantic-release bot 📦🚀 |
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) |  |  | 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) |  |  | 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) |  |  | devDependencies | patch | | | [astral-sh/uv](https://redirect.github.com/astral-sh/uv) | `0.11.7` → `0.11.8` |  |  | | patch | `0.11.10` (+1) | | [astral-sh/uv](https://redirect.github.com/astral-sh/uv) | `0.11.7` → `0.11.8` |  |  | 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` |  |  | | patch | | | [defenseunicorns/uds-cli](https://redirect.github.com/defenseunicorns/uds-cli) | `v0.30.3` → `v0.30.4` |  |  | | patch | | | [defenseunicorns/uds-common](https://redirect.github.com/defenseunicorns/uds-common) | `v1.24.5` → `v1.24.8` |  |  | | patch | | | ghcr.io/zarf-dev/packages/init | `v0.75.0` → `v0.75.1` |  |  | | patch | | | [github/codeql-action](https://redirect.github.com/github/codeql-action) | `v4.35.2` → `v4.35.3` |  |  | action | patch | | | [googleapis/release-please-action](https://redirect.github.com/googleapis/release-please-action) | `v4.4.1` → `v5` |  |  | 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) |  |  | 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) |  |  | devDependencies | minor | | | redis | `8.6.2` → `8.6.3` |  |  | | patch | | | [slackapi/slack-github-action](https://redirect.github.com/slackapi/slack-github-action) | `v3.0.1` → `v3.0.3` |  |  | 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) |  |  | devDependencies | patch | | | [zarf-dev/zarf](https://redirect.github.com/zarf-dev/zarf) | `v0.75.0` → `v0.75.1` |  |  | | patch | | --- ### Release Notes <details> <summary>conventional-changelog/commitlint (@​commitlint/cli)</summary> ### [`v20.5.3`](https://redirect.github.com/conventional-changelog/commitlint/blob/HEAD/@​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 [@​commitlint/cli](https://redirect.github.com/commitlint/cli) ### [`v20.5.2`](https://redirect.github.com/conventional-changelog/commitlint/blob/HEAD/@​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 [@​commitlint/cli](https://redirect.github.com/commitlint/cli) </details> <details> <summary>conventional-changelog/commitlint (@​commitlint/config-conventional)</summary> ### [`v20.5.3`](https://redirect.github.com/conventional-changelog/commitlint/blob/HEAD/@​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 [@​commitlint/config-conventional](https://redirect.github.com/commitlint/config-conventional) </details> <details> <summary>vitest-dev/vitest (@​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 [@​BartWaardenburg](https://redirect.github.com/BartWaardenburg) and [@​AriPerkkio](https://redirect.github.com/AriPerkkio) in [#​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 [@​felamaslen](https://redirect.github.com/felamaslen) in [#​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 [@​hi-ogawa](https://redirect.github.com/hi-ogawa) in [#​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 [@​hi-ogawa](https://redirect.github.com/hi-ogawa) in [#​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 [@​sheremet-va](https://redirect.github.com/sheremet-va) in [#​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 [@​Copilot](https://redirect.github.com/Copilot), **sheremet-va** and [@​sheremet-va](https://redirect.github.com/sheremet-va) in [#​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 [@​sheremet-va](https://redirect.github.com/sheremet-va) in [#​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 [@​Yejneshwar](https://redirect.github.com/Yejneshwar) in [#​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 [@​DaveT1991](https://redirect.github.com/DaveT1991) and [@​AriPerkkio](https://redirect.github.com/AriPerkkio) in [#​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 [@​hi-ogawa](https://redirect.github.com/hi-ogawa) and **Codex** in [#​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 [@​hi-ogawa](https://redirect.github.com/hi-ogawa) in [#​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 [@​whitphx](https://redirect.github.com/whitphx) and **Claude Opus 4.6 (1M context)** in [#​9927](https://redirect.github.com/vitest-dev/vitest/issues/9927) and [#​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 [@​sheremet-va](https://redirect.github.com/sheremet-va) in [#​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` ([#​19092](https://redirect.github.com/astral-sh/uv/pull/19092)) - Fetch uv from Astral mirror during self-update ([#​18682](https://redirect.github.com/astral-sh/uv/pull/18682)) - Support `pip uninstall -y` ([#​19082](https://redirect.github.com/astral-sh/uv/pull/19082)) - Add `UV_PYTHON_NO_REGISTRY` ([#​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 ([#​19024](https://redirect.github.com/astral-sh/uv/pull/19024)) - Only show the version number in `uv self version --short` ([#​19019](https://redirect.github.com/astral-sh/uv/pull/19019)) - Silence warnings on empty `SSL_CERT_DIR` directory ([#​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 ([#​19022](https://redirect.github.com/astral-sh/uv/pull/19022), [#​19101](https://redirect.github.com/astral-sh/uv/pull/19101)) ##### Configuration - Add an environment variable for `UV_NO_PROJECT` ([#​19052](https://redirect.github.com/astral-sh/uv/pull/19052)) - Expose `UV_PYTHON_SEARCH_PATH` for Python discovery `PATH` overrides ([#​19034](https://redirect.github.com/astral-sh/uv/pull/19034)) ##### Bug fixes - Add `rust-toolchain.toml` to uv-build sdist ([#​19131](https://redirect.github.com/astral-sh/uv/pull/19131)) - Ensure uv invocations of git do not inherit repository location environment variables ([#​19088](https://redirect.github.com/astral-sh/uv/pull/19088)) - Redact pre-signed upload URLs in verbose output ([#​19146](https://redirect.github.com/astral-sh/uv/pull/19146)) - Handle transitive URL dependencies in PEP 517 build requirements ([#​19076](https://redirect.github.com/astral-sh/uv/pull/19076), [#​19086](https://redirect.github.com/astral-sh/uv/pull/19086)) - Support `uv lock` on a `pyproject.toml` that only contains dependency-groups ([#​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` ([#​19102](https://redirect.github.com/astral-sh/uv/pull/19102)) - Fix Python variant tagging in the Windows registry ([#​19012](https://redirect.github.com/astral-sh/uv/pull/19012)) - Use a single codepath for extracting a .tar.zst wheel, disallowing external symlinks ([#​19144](https://redirect.github.com/astral-sh/uv/pull/19144)) ##### Documentation - Bump astral-sh/setup-uv version in docs ([#​19030](https://redirect.github.com/astral-sh/uv/pull/19030)) - Update PyTorch documentation for PyTorch 2.11 ([#​19095](https://redirect.github.com/astral-sh/uv/pull/19095)) - Remove deprecated license classifiers from uv-build and add Python 3.14 classifier ([#​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 ([#​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 [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​1372](https://redirect.github.com/defenseunicorns/uds-cli/pull/1372) - chore(deps): update github-actions by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​1374](https://redirect.github.com/defenseunicorns/uds-cli/pull/1374) - fix(deps): update zarf to v0.75.1 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​1376](https://redirect.github.com/defenseunicorns/uds-cli/pull/1376) - chore: update min go version to 1.25.9 by [@​jasonwashburn](https://redirect.github.com/jasonwashburn) in [#​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 ([#​666](https://redirect.github.com/defenseunicorns/uds-common/issues/666)) ([3c8bc77](https://redirect.github.com/defenseunicorns/uds-common/commit/3c8bc779e87b4266c6a3c92795cf6815985f1762)) - add chainguard creds ([#​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 ([#​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 ([#​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 ([#​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 ([#​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 ([#​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 ([#​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 ([#​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 ([#​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. [#​3837](https://redirect.github.com/github/codeql-action/pull/3837) - Configurations for private registries that use Cloudsmith or GCP OIDC are now accepted. [#​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. [#​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. [#​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). [#​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 ([#​1188](https://redirect.github.com/googleapis/release-please-action/issues/1188)) ##### Features - upgrade to node24 ([#​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 ([#​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 - [#​2904](https://redirect.github.com/likec4/likec4/pull/2904) [`935f6bb`](https://redirect.github.com/likec4/likec4/commit/935f6bb3fc42b88669bd8af65947a201f8e3d490) Thanks [@​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 [@​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 [#​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 - [#​2906](https://redirect.github.com/likec4/likec4/pull/2906) [`af34764`](https://redirect.github.com/likec4/likec4/commit/af3476421fd8938a897240ad6fd1c70068d1e070) Thanks [@​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`. - [#​2921](https://redirect.github.com/likec4/likec4/pull/2921) [`5f46082`](https://redirect.github.com/likec4/likec4/commit/5f460821526d851ef3bbf8be5a2bd749c2df6a8a) Thanks [@​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)]: - [@​likec4/core](https://redirect.github.com/likec4/core)@​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 ([#​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 ([#​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 ([#​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 ([#​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 ([#​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 ([#​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 [@​zarf-release-please](https://redirect.github.com/zarf-release-please)\[bot] in [#​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>
Summary
Context
Production bug reported in product-support: Pepr occasionally misses
UDSExemptionresources 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:
Watcher#processcaches items before running callbacks — a failed callback leaves the item permanently stuck in cache (companion PR forthcoming)watchCallbackcatches and swallows all errors, so KFC never learns a callback failedChanges
src/lib/processors/watch-processor.tsthrow eafterLog.error()in the watch callback catch block (line 139)src/lib/processors/watch-processor.test.ts../finalizerto isolate finalizer testsscripts/soak-test.shwatch_controller_failures_total == 0every iterationscripts/soak-summary.shTest plan
#processto cache after callback succeeds (see fix: cache items after callback succeeds to prevent permanent loss kubernetes-fluent-client#1105)