Skip to content

chore: v1.44.0 release#9495

Draft
matthewkeil wants to merge 74 commits into
stablefrom
rc/v1.44.0
Draft

chore: v1.44.0 release#9495
matthewkeil wants to merge 74 commits into
stablefrom
rc/v1.44.0

Conversation

@matthewkeil

Copy link
Copy Markdown
Member

No description provided.

wemeetagain and others added 30 commits May 14, 2026 14:37
**Motivation**

- #8892 

**Description**

- move light-client spec functions to state-transition/light-client
- move the rest of the light-client and the whole prover to a separate
monorepo
- remove the lightclient cli command

**AI Assistance Disclosure**

- codex assistance
**Motivation**

Follow consensus-specs PR
ethereum/consensus-specs#5222.

`compute_ptc` samples PTC seats by effective balance and may place the
same validator at multiple positions in a slot's PTC.
The previous `on_payload_attestation_message` recorded the vote only at
`ptc.index(validator_index)` (first occurrence), leaving the other
duplicate seats as `None`.
With enough duplicates this can make `PAYLOAD_TIMELY_THRESHOLD =
PTC_SIZE // 2` unreachable, particularly in testnets with many `0x02`
validators.
Sync committee already counts duplicate votes; PTC should match.

**Description**

- replace `getIndexInPayloadTimelinessCommittee` with
`getIndicesInPayloadTimelinessCommittee` returning every PTC position a
validator occupies
- handle `PayloadAttestationPool.add()` to support multiple validator
committee indices

**AI Assistance Disclosure**

Used Claude Code.

Co-authored-by: Tuyen Nguyen <twoeths@users.noreply.github.com>
**Motivation**

- Implements
[ethereum/consensus-specs#5254](ethereum/consensus-specs#5254).
Avoid eager BLS signature verification of the whole `pending_deposits`
queue when onboarding builders at the Gloas fork transition.
- Also improve `processDepositRequest()` in Gloas to avoid eager BLS
signature verification of the whole `pending_deposits` queue. This does
not need a spec change.

**Description**

- implement `PendingDepositsLookup` grouped by pubkey, track verified
deposits so we will never do it again. This is also a preparation when
we move it to EpochCache or higher level cache.
- Reworks `onboardBuildersFromPendingDeposits` at the Fulu→Gloas fork
transition to mirror the new spec structure. Behavior change from the
spec PR: invalid-signature validator deposits now stay in the pending
queue (previously dropped).
- Threads a shared lookup through `applyParentExecutionPayload →
processDepositRequest` so successive deposit-requests in the same
envelope share verification results. The lookup is kept as a faithful
mirror of `state.pendingDeposits`.
- Adds unit tests for `PendingDepositsLookup`.

**AI Assistance Disclosure**

Used Claude Code.

---------

Co-authored-by: Tuyen Nguyen <twoeths@users.noreply.github.com>
**Motivation**

- gloas

**Description**

- Add proposer preferences API endpoints
ethereum/beacon-APIs#593
- Add proposer preferences pool
- Use proposer preference during execution bid gossip validation
- Add proposer preference validator service (publish `SLOTS_PER_EPOCH /
4` slots before proposal)

**AI Assistance Disclosure**

- claude assistance

---------

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Co-authored-by: Tuyen Nguyen <twoeths@users.noreply.github.com>
# Summary

Fixes Lodestar's handling of proposer duties under the post-Fulu
(EIP-7917) deterministic 1-epoch proposer lookahead. Surfaced while
reviewing #9377: the validator was never querying `currentEpoch + 1`
proposer duties post-Fulu, and the BN's dep_root computation was wrong
when serving duties for an epoch other than `state.epoch`.

Contains two related stories:
1. **BN-side bug fixes + lookahead support** so `getProposerDutiesV2`
correctly serves `currentEpoch + 1` (and `currentEpoch + 2` near the
boundary).
2. **Validator-side refactor** to consume that lookahead through an
event-driven model that mirrors `AttestationDutiesService`, instead of
per-slot polling.

# BN side

**`proposerShufflingDecisionRoot` bug fix**
(`state-transition/src/util/shuffling.ts`)

Previously derived the decision slot from `state.epoch`, which gave the
wrong dep_root whenever the state was one epoch off the requested epoch
(e.g. serving `state.epoch + 1` duties from the head state). Now takes
`proposalEpoch` explicitly:

- Pre-Fulu: `dep_root(E) = block@(startSlot(E) - 1)` — unchanged
- Post-Fulu (MIN_SEED_LOOKAHEAD = 1): `dep_root(E) = block@(startSlot(E
- 1) - 1)` — shifted back one epoch

**`getProposerDuties` (`beacon-node/src/api/impl/validator/index.ts`)**

Allows `epoch === currentEpoch + 2` near the next-epoch boundary
post-Fulu. The duties are served from the upcoming-epoch (`currentEpoch
+ 1`) checkpoint state's `nextProposers`, which is populated by the
`proposer_lookahead` field. The existing `nearNextEpoch` gate
(`msToNextEpoch < prepareNextSlotLookAheadMs`) determines availability.

# Validator side

Original draft of this PR added a fork-aware `pollBeaconProposers` that,
post-Fulu, polled `nextEpoch` every slot and `nextEpoch + nextEpoch+1`
at the boundary. That was functional but raised a fair concern in
review: *why fetch two epochs at the boundary, and why poll next-epoch
every slot if its dep_root is stable post-Fulu?*

The refactor (`refactor(validator): event-driven proposer duties via SSE
head events`) replaces that with an attester-style model:

| Trigger | Action |
|---------|--------|
| `clock.runEveryEpoch(epoch)` | Fetch `epoch` (+ `epoch + 1` post-Fulu,
using the EIP-7917 lookahead) |
| `chainHeaderTracker.runOnNewHead(headEvent)` | Compare incoming
dep_roots against cache; refetch only the affected epoch on mismatch |
| `clock.runEverySlot(slot)` | Notify block production from cache;
pre-Fulu only — schedule the 1s-before-boundary fetch for `nextEpoch`
(its dep_root only stabilizes at the boundary and isn't exposed via SSE)
|

The SSE head event already carries everything needed for both forks via
a nice coincidence in the dep_root math:

- **Pre-Fulu:** `currentDutyDependentRoot ≡
proposer_dep_root(currentEpoch)`
- **Post-Fulu:** `previousDutyDependentRoot ≡
proposer_dep_root(currentEpoch)`, `currentDutyDependentRoot ≡
proposer_dep_root(nextEpoch)`

No spec/event changes required — the same fields the validator already
uses for attester duties cover the post-Fulu proposer lookahead window.

A per-slot notification dedup (`notifiedSlot` / `notifiedProposers`)
replaces the old "two-pass with `differenceHex`" pattern so any source
of cache update (SSE refetch, cold-cache back-fill, epoch tick) only
notifies *newly discovered* proposers and never duplicates
`createAndPublishBlock` calls.

# Results

In steady state, the validator now makes **2 proposer-duty calls per
epoch** (current + next epoch pre-fetch) plus refetches only on dep_root
changes — matching the per-epoch cadence of `AttestationDutiesService`
(which previously had been 32× more frequent).

# Tests

- 11 new `BlockDutiesService` unit tests covering: post-Fulu pre-fetch
of next epoch, pre-Fulu vs post-Fulu fork detection, SSE-driven refetch
on dep_root mismatch, no-op on dep_root match, cold-cache back-fill,
pre-Fulu boundary scheduling + post-Fulu suppression, signer removal
across epochs.
- BN-side `getProposerDuties` tests updated to exercise the V2 path with
a post-Fulu config.
- E2E tests verified: `proposerBoostReorg`, `finalizedSync`,
`checkpointSync` (Fulu fork crossings, reorgs, checkpoint sync) — all
pass, all 30+ block proposals fire correctly, no new errors.

# Known follow-ups (non-blocking)

1. **Genesis-state dep_root quirk (BN-side, cosmetic).** At very early
genesis, the BN's `getProposerDuties` returns `genesisBlockRoot` via the
`state.slot === decisionSlot` fallback, but later returns
`state.getBlockRootAtSlot(0)` for the same epoch — they're cosmetically
different roots for the same logical block. The old code didn't observe
this because it didn't pre-fetch `nextEpoch` until ~1s before the
boundary; the new code pre-fetches at the start of epoch 0 and sees one
or two spurious `Proposer duties re-org` warnings per VC at startup.
Duties are correct — pure metric noise. Worth a small BN-side
normalization or a "skip pre-fetch on first epoch tick" guard.

2. **Concurrent `pollBeaconProposers` race.** If `onNewHead` and
`runEveryEpochTask` race on the same epoch with asymmetric HTTP
latencies, last-write-wins can briefly leave a stale dep_root cached. In
practice the same BN serves both calls and returns identical payloads.
Documented in a code comment; a per-epoch sequence number would harden
it if it ever becomes a real problem.

3. **Gloas timing.** `BLOCK_DUTIES_LOOKAHEAD_BPS` may want to flip from
"1s before the boundary" to "1s after" post-Gloas. Existing `TODO GLOAS:
re-evaluate timing` is preserved.

# AI disclosure

Refactor designed and implemented with AI assistance.

---------

Co-authored-by: Cayman <caymannava@gmail.com>
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Co-authored-by: Tuyen Nguyen <twoeths@users.noreply.github.com>
…oas graffiti (#9381)

## Summary

Fixes two issues with auto-graffiti for blocks proposed by Lodestar:

1. **Ethrex EL code mapped to `XX`.** `ClientCode` is missing an `EX`
entry, so `engine_getClientVersionV1` responses from Ethrex (`code:
"EX"`) fall through to `ClientCode.XX` in `http.ts:getClientVersion`.
Result on chain: `XX2123LS...` instead of `EX2123LS...`. Adds `EX =
"EX", // ethrex`.

2. **CL commit suffix dropped in `produceBlockV4` (Gloas).** The
pre-Gloas path (`produceBlockV3`) calls `getLodestarClientVersion(opts)`
so `commit` is populated; the Gloas path calls
`getLodestarClientVersion()` with no argument, leaving `commit` as `""`.
`getDefaultGraffiti` then produces 8-byte `<EL><EL_commit><LS>` instead
of the intended 12-byte `<EL><EL_commit><LS><LS_commit>`. Result on
chain: `NMd654LS` / `XX2123LS` for every post-Gloas Lodestar block,
regardless of EL pair. Aligns the Gloas call site with the pre-Gloas one
by passing the in-scope `opts: ApiOptions`.

Observed on a glamsterdam-devnet-4 kurtosis enclave (Lodestar v1.42.0
\`a07e25c\`, \`gloas_fork_epoch=1\`, \`preset=minimal\`). Pre-Gloas
first block from a Lodestar+Ethrex pair: graffiti \`XX2123LSa07e\`. All
later post-Gloas slots from the same proposer: \`XX2123LS\`.
Nethermind+Lodestar pairs show the same truncation: \`NMd654LS\`.

## Test plan
- [x] Existing \`graffiti.test.ts\` and \`metadata.test.ts\` still pass
(no behavior change in those units)
- [ ] Manual: rebuild + re-run kurtosis enclave with Ethrex+Lodestar,
confirm graffiti is \`EX<el_commit>LS<ls_commit>\` (12 bytes) for
post-Gloas slots
**Motivation**

Upgrade Lodestar to the `v1.7.0-alpha.8` following #9375

**What's changed since #9375**
- consume ProposerPreferencesPool in #9377
- use `PAYLOAD_DUE_BPS` instead of `PAYLOAD_ATTESTATION_DUE_BPS`
- the onboard builder is implemented in #9374, reenable spec tests

**Detailed Description**

- Bump `spec-tests-version.json` to `v1.7.0-alpha.8` and apply the
matching `specrefs/*` updates.
- Config: `MIN_BUILDER_WITHDRAWABILITY_DELAY` `64 → 8192`; add
`PAYLOAD_DUE_BPS` (mainnet/minimal/types + validator critical params).
- Add Gloas `targetGasLimit` to `PayloadAttributes` (SSZ,
execution-engine `PayloadAttributes`/RPC + serialize/deserialize).
- Rename `ProposerPreferences.gasLimit → targetGasLimit` (alpha.8) and
update the unstable-only consumers not present on the #9375 branch:
`validatorStore.signProposerPreferences`, gossip
`validateExecutionPayloadBid`, and test/event fixtures. The gossip
bid-validation rule keeps strict equality (rename only);
`is_gas_limit_target_compatible` is a separate follow-up.
- `upgradeStateToGloas`: set `latestExecutionPayloadBid.gasLimit` from
the Fulu header and bump the spec-comment URL. The existing
`onboardBuildersFromPendingDeposits` is already spec-equivalent and is
left as-is; the previously-skipped
`fork_invalid_validator_deposit_followed_by_builder_credentials` spec
test is re-enabled and passes.
- `produceBlockBody`: resolve the Gloas payload-attributes
`targetGasLimit` from the `ProposerPreferencesPool` (same `(slot,
dependent_root)` lookup as bid validation), falling back to the parent
payload gas limit when no preferences are pooled. Addresses the #9375
review note that the builder-registration source was incorrect.
- Add `getPayloadDueMs()` to `forkConfig` (spec `get_payload_due_ms`,
`PAYLOAD_DUE_BPS`) and gate `producePayloadAttestationData`'s
`payloadPresent` on the execution payload envelope being seen before
that deadline (uses the envelope's own arrival time). Addresses the
#9375 review note about using `PAYLOAD_DUE_BPS` instead of
`PAYLOAD_ATTESTATION_DUE_BPS`.
- Skip the new `gloas/fork_choice/on_payload_attestation_message` spec
suite (PTC fork choice not yet implemented).


**AI Assistance Disclosure**

Used Claude Code to port and adapt the changes, address the PR review
comments, and run verification.

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

---------

Co-authored-by: Tuyen Nguyen <twoeths@users.noreply.github.com>
Co-authored-by: Cayman <caymannava@gmail.com>
## Summary

Installs Zig 0.16.0 in the build paths that will exercise the
`lodestar-z` prepare script when `@chainsafe/lodestar-z` is added _as a
git dependency_.

This unblocks the lodestar-z development workflow: building, testing,
deploying lodestar with an _unpublished_ lodestar-z.

This doesn't negatively affect the production release, eg bloating the
production docker image.
Careful attention will still be needed to ensure that only a published
lodestar-z is used in in releases.

## What's added

**Build images** (`Dockerfile`, `Dockerfile.dev`):
- Manual curl + tar unpack of zig toolchain
- Multi-arch zig install (`TARGETARCH` → zig's `x86_64`/`aarch64`
naming)
- SHA256 verification of each tarball against ziglang.org's release
manifest
- Symlink onto `/usr/local/bin/zig` so `prepare` finds it via `PATH`

**CI** (4 files, covering 11 workflows):
- Uses [`mlugg/setup-zig`](https://github.com/mlugg/setup-zig) v2.2.1,
pinned by commit SHA per repo convention.
- `.github/actions/setup-and-build` — composite action used by `test`,
`test-sim`, `benchmark`, `nightly-spec-tests`, `binaries`, `publish-rc`,
`publish-stable`, `docs-check`
- `native-portability.yml`, `docs.yml`, `publish-dev.yml`,
`publish-nextfork.yml` — standalone workflows that don't use the
composite

---------

Co-authored-by: Cayman <caymannava@gmail.com>
**Motivation**

- alpha.8 spec

**Description**

- implement ethereum/consensus-specs#5236

**AI Assistance Disclosure**

- codex

---------

Co-authored-by: Tuyen Nguyen <twoeths@users.noreply.github.com>
**Motivation**

- know more details about the execution payload

**Description**
- mimic what's currently in receive/import block flow

Co-authored-by: Tuyen Nguyen <twoeths@users.noreply.github.com>
**Motivation**

- implement `shouldBuildOnFull()` as in
ethereum/consensus-specs#5186

**Description**

- track blob data available in a new `daVotes`
- thread blob data available from block import, gossip handler and api
- track ptc voted in a new `ptcAttested`
- count NO votes and implement `shouldBuildOnFull()` when producing
block


**AI Assistance Disclosure**

Created with Claude

---------

Co-authored-by: Tuyen Nguyen <twoeths@users.noreply.github.com>
Co-authored-by: Cayman <caymannava@gmail.com>
As title. Also add publishExecutionPayloadBid beacon api endpoint

---------

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Co-authored-by: Cayman <caymannava@gmail.com>
closes #9231

---------

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
## Summary

- Browser Tests CI has been hanging for ~6h on every PR run, hitting
GitHub Actions' default job timeout.
- Root cause: `pnpm playwright install` hangs after Chromium download
completes due to a yauzl zip extraction lifecycle regression in Node
24.16.0+
([microsoft/playwright#40724](microsoft/playwright#40724)).
Our CI runs Node v24.16.0, so it hits this bug. Fixed upstream in
playwright 1.60.0 via
[microsoft/playwright#40747](microsoft/playwright#40747).

Additional CI hardening:
- Cache `~/.cache/ms-playwright` keyed on `pnpm-lock.yaml` hash so
subsequent runs skip the download entirely.
- Install only the browsers we actually use: `chromium`,
`chromium-headless-shell`, `firefox` (skips webkit + ffmpeg).
- Add `timeout-minutes: 15` so any future install hang fails fast
instead of consuming a 6h job slot.

## Test plan

- [x] `pnpm install` resolves all `playwright` / `playwright-core`
entries in `pnpm-lock.yaml` to `1.60.0`
- [x] `pnpm playwright install chromium chromium-headless-shell firefox`
completes without hang locally
- [x] `pnpm test:browsers` passes locally (52 files, 606/606 tests,
~60s) on darwin/arm64
- [X] Browser Tests CI job completes successfully (verified on this PR)

## AI disclosure

This change was investigated and implemented with AI assistance (Claude
Code).

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

---------

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
**Motivation**

- gloas spec `should_extend_payload` requires `(payload_is_timely AND
payload_data_is_available)`; lodestar checks only timely. With PTC
voting timely=YES + data=NO, fork-choice keeps extending FULL while
`shouldBuildOnFull` reorgs the producer onto EMPTY — producer-policy and
head-policy disagree and locally-produced blocks get orphaned. Observed
on glamsterdam-devnet-4: head stuck at slot 22903 for 27+ slots.
- found when investigating
#9415

**Description**

- AND `isPayloadDataAvailable` into condition 1 of `shouldExtendPayload`

**AI Assistance Disclosure**

Created with Claude

---------

Co-authored-by: twoeths <twoeths@users.noreply.github.com>
Co-authored-by: Nico Flaig <nflaig@protonmail.com>
**Motivation**

`lodestar_bls_thread_pool_same_message_jobs_retries_total` and its
sibling `..._same_message_sets_retries_total` are emitted by
`retryJobItemSameMessage` but were not plotted anywhere in dashboards.

They diagnose the same class of event as batch_retries_total — a BLS
verification fast-path failing and forcing a slow-path re-verification —
just for the **same message / aggregated pubkey** optimization instead
of the regular batch optimization. Without them on the dashboard,
regressions in the same-message path are invisible.

**Description**

Adds two series to the existing "BLS thread pool - Error rates" panel in
dashboards/lodestar_bls_thread_pool.json, alongside batch_retries:

-
rate(lodestar_bls_thread_pool_same_message_jobs_retries_total[$rate_interval])
→ same_message_job_retries
-
rate(lodestar_bls_thread_pool_same_message_sets_retries_total[$rate_interval])
→ same_message_set_retries

Both should stay near zero; sustained non-zero values mean the
same-message optimization is paying off less often and CPU is being
wasted on re-verification.
### Motivation
- The release binary workflow used `npx -y -p @chainsafe/caxa@3.0.6 ...`
which dynamically fetched and executed an npm package at release time,
bypassing the repository's `pnpm` lockfile and `pnpm-workspace.yaml`
supply-chain protections.
- Running unpinned/npm-resolved tooling during artifact creation creates
a supply-chain risk where an attacker could tamper with release
artifacts or access workflow secrets if a packaged dependency is
compromised.

### Description
- Replace runtime `npx -p` invocation with a locked invocation by
calling `pnpm exec caxa` in `.github/workflows/binaries.yml` so the
packager is resolved from the workspace dependency graph and lockfile.
- Add `@chainsafe/caxa@3.0.6` to the root `devDependencies` in
`package.json` so `caxa` is pinned and installed via `pnpm` rather than
fetched by `npx` at release time.
- Update `pnpm-lock.yaml` to include the pinned `@chainsafe/caxa@3.0.6`
resolution and its transitive entries so CI will install the exact
package graph under `pnpm` policy.
- Files changed: `.github/workflows/binaries.yml`, `package.json`, and
`pnpm-lock.yaml`.

### Testing
- Ran `pnpm lint` and it passed successfully.
- Ran `pnpm check-types` which failed in this environment due to
pre-existing missing built artifacts (unrelated to the workflow change)
and is documented here as an environment issue.
- Ran `pnpm test:unit` which failed in this environment due to missing
generated/linked `@lodestar/params` artifacts (unrelated to this change)
and is documented here as an environment issue.

> This PR was written primarily by Claude Code.

------
[Codex
Task](https://chatgpt.com/codex/cloud/tasks/task_e_6a1704b7f0b0833199c777ff75468ac7)
**Motivation**

- it's tricky to use BitArray, which is defined in ssz for binding, see
this
[concern](ChainSafe/lodestar-z#368 (comment))

**Description**
- the native binding does not have to do anything with `BitArray`, use
`{uint8Array: Uint8Array; bitLen: number}` instead, the binding needs to
conform to`IBeaconStateViewNative` overall
- implement `NativeBeaconStateView` wrapper that conform to the public
api of `IBeaconStateViewLatestFork` so `beacon-node` does not need to
change. It also contains a cache layer so that it does not need to fetch
native multiple times for the same data

---------

Co-authored-by: twoeths <twoeths@users.noreply.github.com>
…#9405)

Bumps the actions group with 7 updates in the / directory:

| Package | From | To |
| --- | --- | --- |
| [github/codeql-action](https://github.com/github/codeql-action) |
`4.35.4` | `4.36.0` |
|
[docker/setup-buildx-action](https://github.com/docker/setup-buildx-action)
| `4.0.0` | `4.1.0` |
| [docker/login-action](https://github.com/docker/login-action) |
`4.1.0` | `4.2.0` |
| [pnpm/action-setup](https://github.com/pnpm/action-setup) | `5.0.0` |
`6.0.8` |
| [actions/setup-node](https://github.com/actions/setup-node) | `6.3.0`
| `6.4.0` |
|
[peaceiris/actions-gh-pages](https://github.com/peaceiris/actions-gh-pages)
| `4.0.0` | `4.1.0` |
| [codecov/codecov-action](https://github.com/codecov/codecov-action) |
`6.0.0` | `6.0.1` |


Updates `github/codeql-action` from 4.35.4 to 4.36.0
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/github/codeql-action/releases">github/codeql-action's
releases</a>.</em></p>
<blockquote>
<h2>v4.36.0</h2>
<ul>
<li><em>Breaking change</em>: Bump the minimum required CodeQL bundle
version to 2.19.4. <a
href="https://redirect.github.com/github/codeql-action/pull/3894">#3894</a></li>
<li>Add support for SHA-256 Git object IDs. <a
href="https://redirect.github.com/github/codeql-action/pull/3893">#3893</a></li>
<li>Update default CodeQL bundle version to <a
href="https://github.com/github/codeql-action/releases/tag/codeql-bundle-v2.25.5">2.25.5</a>.
<a
href="https://redirect.github.com/github/codeql-action/pull/3926">#3926</a></li>
</ul>
<h2>v4.35.5</h2>
<ul>
<li>We have improved how the JavaScript bundles for the CodeQL Action
are generated to avoid duplication across bundles and reduce the size of
the repository by around 70%. This should have no effect on the runtime
behaviour of the CodeQL Action. <a
href="https://redirect.github.com/github/codeql-action/pull/3899">#3899</a></li>
<li>For performance and accuracy reasons, <a
href="https://redirect.github.com/github/roadmap/issues/1158">improved
incremental analysis</a> will now only be enabled on a pull request when
diff-informed analysis is also enabled for that run. If diff-informed
analysis is unavailable (for example, because the PR diff ranges could
not be computed), the action will fall back to a full analysis. <a
href="https://redirect.github.com/github/codeql-action/pull/3791">#3791</a></li>
<li>If multiple inputs are provided for the GitHub-internal
<code>analysis-kinds</code> input, only <code>code-scanning</code> will
be enabled. The <code>analysis-kinds</code> input is experimental, for
GitHub-internal use only, and may change without notice at any time. <a
href="https://redirect.github.com/github/codeql-action/pull/3892">#3892</a></li>
<li>Added an experimental change which, when running a Code Scanning
analysis for a PR with <a
href="https://redirect.github.com/github/roadmap/issues/1158">improved
incremental analysis</a> enabled, prefers CodeQL CLI versions that have
a cached overlay-base database for the configured languages. This speeds
up analysis for a repository when there is not yet a cached overlay-base
database for the latest CLI version. We expect to roll this change out
to everyone in May. <a
href="https://redirect.github.com/github/codeql-action/pull/3880">#3880</a></li>
</ul>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/github/codeql-action/blob/main/CHANGELOG.md">github/codeql-action's
changelog</a>.</em></p>
<blockquote>
<h1>CodeQL Action Changelog</h1>
<p>See the <a
href="https://github.com/github/codeql-action/releases">releases
page</a> for the relevant changes to the CodeQL CLI and language
packs.</p>
<h2>[UNRELEASED]</h2>
<p>No user facing changes.</p>
<h2>4.36.0 - 22 May 2026</h2>
<ul>
<li><em>Breaking change</em>: Bump the minimum required CodeQL bundle
version to 2.19.4. <a
href="https://redirect.github.com/github/codeql-action/pull/3894">#3894</a></li>
<li>Add support for SHA-256 Git object IDs. <a
href="https://redirect.github.com/github/codeql-action/pull/3893">#3893</a></li>
<li>Update default CodeQL bundle version to <a
href="https://github.com/github/codeql-action/releases/tag/codeql-bundle-v2.25.5">2.25.5</a>.
<a
href="https://redirect.github.com/github/codeql-action/pull/3926">#3926</a></li>
</ul>
<h2>4.35.5 - 15 May 2026</h2>
<ul>
<li>We have improved how the JavaScript bundles for the CodeQL Action
are generated to avoid duplication across bundles and reduce the size of
the repository by around 70%. This should have no effect on the runtime
behaviour of the CodeQL Action. <a
href="https://redirect.github.com/github/codeql-action/pull/3899">#3899</a></li>
<li>For performance and accuracy reasons, <a
href="https://redirect.github.com/github/roadmap/issues/1158">improved
incremental analysis</a> will now only be enabled on a pull request when
diff-informed analysis is also enabled for that run. If diff-informed
analysis is unavailable (for example, because the PR diff ranges could
not be computed), the action will fall back to a full analysis. <a
href="https://redirect.github.com/github/codeql-action/pull/3791">#3791</a></li>
<li>If multiple inputs are provided for the GitHub-internal
<code>analysis-kinds</code> input, only <code>code-scanning</code> will
be enabled. The <code>analysis-kinds</code> input is experimental, for
GitHub-internal use only, and may change without notice at any time. <a
href="https://redirect.github.com/github/codeql-action/pull/3892">#3892</a></li>
<li>Added an experimental change which, when running a Code Scanning
analysis for a PR with <a
href="https://redirect.github.com/github/roadmap/issues/1158">improved
incremental analysis</a> enabled, prefers CodeQL CLI versions that have
a cached overlay-base database for the configured languages. This speeds
up analysis for a repository when there is not yet a cached overlay-base
database for the latest CLI version. We expect to roll this change out
to everyone in May. <a
href="https://redirect.github.com/github/codeql-action/pull/3880">#3880</a></li>
</ul>
<h2>4.35.4 - 07 May 2026</h2>
<ul>
<li>Update default CodeQL bundle version to <a
href="https://github.com/github/codeql-action/releases/tag/codeql-bundle-v2.25.4">2.25.4</a>.
<a
href="https://redirect.github.com/github/codeql-action/pull/3881">#3881</a></li>
</ul>
<h2>4.35.3 - 01 May 2026</h2>
<ul>
<li><em>Upcoming breaking change</em>: 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. <a
href="https://redirect.github.com/github/codeql-action/pull/3837">#3837</a></li>
<li>Configurations for private registries that use Cloudsmith or GCP
OIDC are now accepted. <a
href="https://redirect.github.com/github/codeql-action/pull/3850">#3850</a></li>
<li>Best-effort connection tests for private registries now use
<code>GET</code> requests instead of <code>HEAD</code> for better
compatibility with various registry implementations. For NuGet feeds,
the test is now always performed against the service index. <a
href="https://redirect.github.com/github/codeql-action/pull/3853">#3853</a></li>
<li>Fixed a bug where two diagnostics produced within the same
millisecond could overwrite each other on disk, causing one of them to
be lost. <a
href="https://redirect.github.com/github/codeql-action/pull/3852">#3852</a></li>
<li>Update default CodeQL bundle version to <a
href="https://github.com/github/codeql-action/releases/tag/codeql-bundle-v2.25.3">2.25.3</a>.
<a
href="https://redirect.github.com/github/codeql-action/pull/3865">#3865</a></li>
</ul>
<h2>4.35.2 - 15 Apr 2026</h2>
<ul>
<li>The undocumented TRAP cache cleanup feature that could be enabled
using the <code>CODEQL_ACTION_CLEANUP_TRAP_CACHES</code> environment
variable is deprecated and will be removed in May 2026. If you are
affected by this, we recommend disabling TRAP caching by passing the
<code>trap-caching: false</code> input to the <code>init</code> Action.
<a
href="https://redirect.github.com/github/codeql-action/pull/3795">#3795</a></li>
<li>The Git version 2.36.0 requirement for improved incremental analysis
now only applies to repositories that contain submodules. <a
href="https://redirect.github.com/github/codeql-action/pull/3789">#3789</a></li>
<li>Python analysis on GHES no longer extracts the standard library,
relying instead on models of the standard library. This should result in
significantly faster extraction and analysis times, while the effect on
alerts should be minimal. <a
href="https://redirect.github.com/github/codeql-action/pull/3794">#3794</a></li>
<li>Fixed a bug in the validation of OIDC configurations for private
registries that was added in CodeQL Action 4.33.0 / 3.33.0. <a
href="https://redirect.github.com/github/codeql-action/pull/3807">#3807</a></li>
<li>Update default CodeQL bundle version to <a
href="https://github.com/github/codeql-action/releases/tag/codeql-bundle-v2.25.2">2.25.2</a>.
<a
href="https://redirect.github.com/github/codeql-action/pull/3823">#3823</a></li>
</ul>
<h2>4.35.1 - 27 Mar 2026</h2>
<ul>
<li>Fix incorrect minimum required Git version for <a
href="https://redirect.github.com/github/roadmap/issues/1158">improved
incremental analysis</a>: it should have been 2.36.0, not 2.11.0. <a
href="https://redirect.github.com/github/codeql-action/pull/3781">#3781</a></li>
</ul>
<h2>4.35.0 - 27 Mar 2026</h2>
<ul>
<li>Reduced the minimum Git version required for <a
href="https://redirect.github.com/github/roadmap/issues/1158">improved
incremental analysis</a> from 2.38.0 to 2.11.0. <a
href="https://redirect.github.com/github/codeql-action/pull/3767">#3767</a></li>
<li>Update default CodeQL bundle version to <a
href="https://github.com/github/codeql-action/releases/tag/codeql-bundle-v2.25.1">2.25.1</a>.
<a
href="https://redirect.github.com/github/codeql-action/pull/3773">#3773</a></li>
</ul>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="https://github.com/github/codeql-action/commit/7211b7c8077ea37d8641b6271f6a365a22a5fbfa"><code>7211b7c</code></a>
Merge pull request <a
href="https://redirect.github.com/github/codeql-action/issues/3927">#3927</a>
from github/update-v4.36.0-ebc2d9e2b</li>
<li><a
href="https://github.com/github/codeql-action/commit/7740f2fb21add1d46278215acea47540db22f022"><code>7740f2f</code></a>
Update changelog for v4.36.0</li>
<li><a
href="https://github.com/github/codeql-action/commit/ebc2d9e2bc247eec51bee8d4df806c4030eb0761"><code>ebc2d9e</code></a>
Merge pull request <a
href="https://redirect.github.com/github/codeql-action/issues/3926">#3926</a>
from github/update-bundle/codeql-bundle-v2.25.5</li>
<li><a
href="https://github.com/github/codeql-action/commit/d1f74b777c95c777bf4f42ce4b250bc916e745c7"><code>d1f74b7</code></a>
Add changelog note</li>
<li><a
href="https://github.com/github/codeql-action/commit/2dc40cec39bdc63d3561d74fa6100cebb0418ff4"><code>2dc40ce</code></a>
Update default bundle to codeql-bundle-v2.25.5</li>
<li><a
href="https://github.com/github/codeql-action/commit/84498526a009a99c875e83ef4821a8ba52de7c22"><code>8449852</code></a>
Merge pull request <a
href="https://redirect.github.com/github/codeql-action/issues/3910">#3910</a>
from github/henrymercer/repo-size-diff-check</li>
<li><a
href="https://github.com/github/codeql-action/commit/72ac23c6d16b29fbe801e87e3439941558c53094"><code>72ac23c</code></a>
Update excluded required check list</li>
<li><a
href="https://github.com/github/codeql-action/commit/c5297a28a2c3e6a8062041b58858bd7117cebe37"><code>c5297a2</code></a>
Merge pull request <a
href="https://redirect.github.com/github/codeql-action/issues/3919">#3919</a>
from github/henrymercer/workflow-concurrency</li>
<li><a
href="https://github.com/github/codeql-action/commit/8ffeae7d05bc1b914a009d197e64e4f5c9e14503"><code>8ffeae7</code></a>
CI: Automatically cancel non-generated workflows</li>
<li><a
href="https://github.com/github/codeql-action/commit/f3f52bf568dc44a1069faafa538caa6b1fec40c9"><code>f3f52bf</code></a>
Revert <code>getErrorMessage</code> import</li>
<li>Additional commits viewable in <a
href="https://github.com/github/codeql-action/compare/68bde559dea0fdcac2102bfdf6230c5f70eb485e...7211b7c8077ea37d8641b6271f6a365a22a5fbfa">compare
view</a></li>
</ul>
</details>
<br />

Updates `docker/setup-buildx-action` from 4.0.0 to 4.1.0
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/docker/setup-buildx-action/releases">docker/setup-buildx-action's
releases</a>.</em></p>
<blockquote>
<h2>v4.1.0</h2>
<ul>
<li>Bump <code>@​docker/actions-toolkit</code> from 0.79.0 to 0.90.0 in
<a
href="https://redirect.github.com/docker/setup-buildx-action/pull/489">docker/setup-buildx-action#489</a></li>
<li>Bump brace-expansion from 1.1.12 to 5.0.6 in <a
href="https://redirect.github.com/docker/setup-buildx-action/pull/547">docker/setup-buildx-action#547</a>
<a
href="https://redirect.github.com/docker/setup-buildx-action/pull/508">docker/setup-buildx-action#508</a></li>
<li>Bump fast-xml-builder from 1.0.0 to 1.2.0 in <a
href="https://redirect.github.com/docker/setup-buildx-action/pull/540">docker/setup-buildx-action#540</a></li>
<li>Bump fast-xml-parser from 5.4.2 to 5.8.0 in <a
href="https://redirect.github.com/docker/setup-buildx-action/pull/496">docker/setup-buildx-action#496</a></li>
<li>Bump flatted from 3.3.3 to 3.4.2 in <a
href="https://redirect.github.com/docker/setup-buildx-action/pull/499">docker/setup-buildx-action#499</a></li>
<li>Bump glob from 10.3.12 to 13.0.6 in <a
href="https://redirect.github.com/docker/setup-buildx-action/pull/495">docker/setup-buildx-action#495</a></li>
<li>Bump handlebars from 4.7.8 to 4.7.9 in <a
href="https://redirect.github.com/docker/setup-buildx-action/pull/504">docker/setup-buildx-action#504</a></li>
<li>Bump lodash from 4.17.23 to 4.18.1 in <a
href="https://redirect.github.com/docker/setup-buildx-action/pull/523">docker/setup-buildx-action#523</a></li>
<li>Bump picomatch from 4.0.3 to 4.0.4 in <a
href="https://redirect.github.com/docker/setup-buildx-action/pull/503">docker/setup-buildx-action#503</a></li>
<li>Bump postcss from 8.5.6 to 8.5.10 in <a
href="https://redirect.github.com/docker/setup-buildx-action/pull/537">docker/setup-buildx-action#537</a></li>
<li>Bump tar from 6.2.1 to 7.5.15 in <a
href="https://redirect.github.com/docker/setup-buildx-action/pull/545">docker/setup-buildx-action#545</a></li>
<li>Bump undici from 6.23.0 to 6.25.0 in <a
href="https://redirect.github.com/docker/setup-buildx-action/pull/492">docker/setup-buildx-action#492</a></li>
<li>Bump vite from 7.3.1 to 7.3.2 in <a
href="https://redirect.github.com/docker/setup-buildx-action/pull/520">docker/setup-buildx-action#520</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/docker/setup-buildx-action/compare/v4.0.0...v4.1.0">https://github.com/docker/setup-buildx-action/compare/v4.0.0...v4.1.0</a></p>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="https://github.com/docker/setup-buildx-action/commit/d7f5e7f509e45cec5c76c4d5afdd7de93d0b3df5"><code>d7f5e7f</code></a>
Merge pull request <a
href="https://redirect.github.com/docker/setup-buildx-action/issues/489">#489</a>
from docker/dependabot/npm_and_yarn/docker/actions-to...</li>
<li><a
href="https://github.com/docker/setup-buildx-action/commit/92bc5c9777806d0a73d9d668ba2114fa1177f164"><code>92bc5c9</code></a>
chore: update generated content</li>
<li><a
href="https://github.com/docker/setup-buildx-action/commit/da11e35abee0f20cb4f1c1b7c461d37c29be52f5"><code>da11e35</code></a>
build(deps): bump <code>@​docker/actions-toolkit</code> from 0.79.0 to
0.90.0</li>
<li><a
href="https://github.com/docker/setup-buildx-action/commit/f021e162ef95b6fba51af1c6674f537f25bce851"><code>f021e16</code></a>
Merge pull request <a
href="https://redirect.github.com/docker/setup-buildx-action/issues/492">#492</a>
from docker/dependabot/npm_and_yarn/undici-6.24.1</li>
<li><a
href="https://github.com/docker/setup-buildx-action/commit/b5af94fab700aee0c64d6077e0e34ae987815b67"><code>b5af94f</code></a>
chore: update generated content</li>
<li><a
href="https://github.com/docker/setup-buildx-action/commit/16ad9776a801d0c47f0a05f007b88a3789aa8ab6"><code>16ad977</code></a>
build(deps): bump undici from 6.23.0 to 6.25.0</li>
<li><a
href="https://github.com/docker/setup-buildx-action/commit/d7a12d7df895b33bd02a9b4bf62a12f2b9a24458"><code>d7a12d7</code></a>
Merge pull request <a
href="https://redirect.github.com/docker/setup-buildx-action/issues/495">#495</a>
from docker/dependabot/npm_and_yarn/glob-10.5.0</li>
<li><a
href="https://github.com/docker/setup-buildx-action/commit/28ff27de4eed7518d361591f2cd1dfb69c34a7cb"><code>28ff27d</code></a>
build(deps): bump glob from 10.3.12 to 13.0.6</li>
<li><a
href="https://github.com/docker/setup-buildx-action/commit/daf436b50e13d9053b9730cbc16516891878b019"><code>daf436b</code></a>
Merge pull request <a
href="https://redirect.github.com/docker/setup-buildx-action/issues/496">#496</a>
from docker/dependabot/npm_and_yarn/fast-xml-parser-5...</li>
<li><a
href="https://github.com/docker/setup-buildx-action/commit/9725348367859764880f2f2e688a6b0c353e3f35"><code>9725348</code></a>
chore: update generated content</li>
<li>Additional commits viewable in <a
href="https://github.com/docker/setup-buildx-action/compare/4d04d5d9486b7bd6fa91e7baf45bbb4f8b9deedd...d7f5e7f509e45cec5c76c4d5afdd7de93d0b3df5">compare
view</a></li>
</ul>
</details>
<br />

Updates `docker/login-action` from 4.1.0 to 4.2.0
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/docker/login-action/releases">docker/login-action's
releases</a>.</em></p>
<blockquote>
<h2>v4.2.0</h2>
<ul>
<li>Bump <code>@​actions/core</code> from 3.0.0 to 3.0.1 in <a
href="https://redirect.github.com/docker/login-action/pull/976">docker/login-action#976</a></li>
<li>Bump <code>@​aws-sdk/client-ecr</code> and
<code>@​aws-sdk/client-ecr-public</code> to 3.1050.0 in <a
href="https://redirect.github.com/docker/login-action/pull/960">docker/login-action#960</a></li>
<li>Bump <code>@​docker/actions-toolkit</code> from 0.86.0 to 0.90.0 in
<a
href="https://redirect.github.com/docker/login-action/pull/970">docker/login-action#970</a></li>
<li>Bump brace-expansion from 2.0.1 to 5.0.6 in <a
href="https://redirect.github.com/docker/login-action/pull/993">docker/login-action#993</a></li>
<li>Bump fast-xml-builder from 1.1.4 to 1.2.0 in <a
href="https://redirect.github.com/docker/login-action/pull/985">docker/login-action#985</a></li>
<li>Bump fast-xml-parser from 5.3.6 to 5.8.0 in <a
href="https://redirect.github.com/docker/login-action/pull/963">docker/login-action#963</a></li>
<li>Bump http-proxy-agent and https-proxy-agent to 9.0.0 in <a
href="https://redirect.github.com/docker/login-action/pull/961">docker/login-action#961</a></li>
<li>Bump postcss from 8.5.6 to 8.5.10 in <a
href="https://redirect.github.com/docker/login-action/pull/979">docker/login-action#979</a></li>
<li>Bump tar from 6.2.1 to 7.5.15 in <a
href="https://redirect.github.com/docker/login-action/pull/991">docker/login-action#991</a></li>
<li>Bump vite from 7.3.1 to 7.3.3 in <a
href="https://redirect.github.com/docker/login-action/pull/986">docker/login-action#986</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/docker/login-action/compare/v4.1.0...v4.2.0">https://github.com/docker/login-action/compare/v4.1.0...v4.2.0</a></p>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="https://github.com/docker/login-action/commit/650006c6eb7dba73a995cc03b0b2d7f5ca915bee"><code>650006c</code></a>
Merge pull request <a
href="https://redirect.github.com/docker/login-action/issues/960">#960</a>
from docker/dependabot/npm_and_yarn/aws-sdk-dependenc...</li>
<li><a
href="https://github.com/docker/login-action/commit/99df1a3f6d65e48177ea57671a50e2242eae4b63"><code>99df1a3</code></a>
chore: update generated content</li>
<li><a
href="https://github.com/docker/login-action/commit/3ab375f324f46da5f6901efeda4be4e2566ebaa2"><code>3ab375f</code></a>
build(deps): bump the aws-sdk-dependencies group across 1 directory with
2 up...</li>
<li><a
href="https://github.com/docker/login-action/commit/39d85804ae465a1816c68ff58158ec66883981b4"><code>39d8580</code></a>
Merge pull request <a
href="https://redirect.github.com/docker/login-action/issues/970">#970</a>
from docker/dependabot/npm_and_yarn/docker/actions-to...</li>
<li><a
href="https://github.com/docker/login-action/commit/4eefcd33ca7213989697445a78b6730274bfaba6"><code>4eefcd3</code></a>
chore: update generated content</li>
<li><a
href="https://github.com/docker/login-action/commit/56d092c8b3f04006c22f4fc20a2b3d2442caed56"><code>56d092c</code></a>
build(deps): bump <code>@​docker/actions-toolkit</code> from 0.86.0 to
0.90.0</li>
<li><a
href="https://github.com/docker/login-action/commit/e2e31ca87063ae00fd41ad3b9c548dd8ec24c5ff"><code>e2e31ca</code></a>
Merge pull request <a
href="https://redirect.github.com/docker/login-action/issues/976">#976</a>
from docker/dependabot/npm_and_yarn/actions/core-3.0.1</li>
<li><a
href="https://github.com/docker/login-action/commit/0bced941e843afc786fbfd58b1c6c13ca11e09c9"><code>0bced94</code></a>
chore: update generated content</li>
<li><a
href="https://github.com/docker/login-action/commit/3e75a0f266b07e09777a621d0ca5f4432ef9f10c"><code>3e75a0f</code></a>
build(deps): bump <code>@​actions/core</code> from 3.0.0 to 3.0.1</li>
<li><a
href="https://github.com/docker/login-action/commit/365bebd9d646160567ebad47824f026e09ee6970"><code>365bebd</code></a>
Merge pull request <a
href="https://redirect.github.com/docker/login-action/issues/984">#984</a>
from docker/dependabot/github_actions/aws-actions/con...</li>
<li>Additional commits viewable in <a
href="https://github.com/docker/login-action/compare/4907a6ddec9925e35a0a9e82d7399ccc52663121...650006c6eb7dba73a995cc03b0b2d7f5ca915bee">compare
view</a></li>
</ul>
</details>
<br />

Updates `pnpm/action-setup` from 5.0.0 to 6.0.8
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/pnpm/action-setup/releases">pnpm/action-setup's
releases</a>.</em></p>
<blockquote>
<h2>v6.0.8</h2>
<h2>What's Changed</h2>
<ul>
<li>docs(README): fix <code>cache_dependency_path</code> type by <a
href="https://github.com/haines"><code>@​haines</code></a> in <a
href="https://redirect.github.com/pnpm/action-setup/pull/257">pnpm/action-setup#257</a></li>
<li>fix: drop patchPnpmEnv so standalone+self-update works on Windows by
<a href="https://github.com/zkochan"><code>@​zkochan</code></a> in <a
href="https://redirect.github.com/pnpm/action-setup/pull/258">pnpm/action-setup#258</a></li>
<li>fix: update pnpm to 11.1.1 by <a
href="https://github.com/mungodewar"><code>@​mungodewar</code></a> in <a
href="https://redirect.github.com/pnpm/action-setup/pull/248">pnpm/action-setup#248</a></li>
</ul>
<h2>New Contributors</h2>
<ul>
<li><a
href="https://github.com/mungodewar"><code>@​mungodewar</code></a> made
their first contribution in <a
href="https://redirect.github.com/pnpm/action-setup/pull/248">pnpm/action-setup#248</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/pnpm/action-setup/compare/v6.0.7...v6.0.8">https://github.com/pnpm/action-setup/compare/v6.0.7...v6.0.8</a></p>
<h2>v6.0.7</h2>
<h2>What's Changed</h2>
<ul>
<li>fix: honor devEngines.packageManager.onFail=error (<a
href="https://redirect.github.com/pnpm/action-setup/issues/252">#252</a>)
by <a href="https://github.com/zkochan"><code>@​zkochan</code></a> in <a
href="https://redirect.github.com/pnpm/action-setup/pull/254">pnpm/action-setup#254</a></li>
<li>fix: restore inputs from state in post by <a
href="https://github.com/haines"><code>@​haines</code></a> in <a
href="https://redirect.github.com/pnpm/action-setup/pull/255">pnpm/action-setup#255</a></li>
<li>fix: self-update bootstrap to packageManager-pinned version (<a
href="https://redirect.github.com/pnpm/action-setup/issues/233">#233</a>)
by <a href="https://github.com/zkochan"><code>@​zkochan</code></a> in <a
href="https://redirect.github.com/pnpm/action-setup/pull/256">pnpm/action-setup#256</a></li>
</ul>
<h2>New Contributors</h2>
<ul>
<li><a href="https://github.com/haines"><code>@​haines</code></a> made
their first contribution in <a
href="https://redirect.github.com/pnpm/action-setup/pull/255">pnpm/action-setup#255</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/pnpm/action-setup/compare/v6.0.6...v6.0.7">https://github.com/pnpm/action-setup/compare/v6.0.6...v6.0.7</a></p>
<h2>v6.0.6</h2>
<h2>What's Changed</h2>
<ul>
<li>fix: bin_dest output points to self-updated pnpm, not bootstrap by
<a href="https://github.com/zkochan"><code>@​zkochan</code></a> in <a
href="https://redirect.github.com/pnpm/action-setup/pull/249">pnpm/action-setup#249</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/pnpm/action-setup/compare/v6.0.5...v6.0.6">https://github.com/pnpm/action-setup/compare/v6.0.5...v6.0.6</a></p>
<h2>v6.0.5</h2>
<h2>What's Changed</h2>
<ul>
<li>fix: append (not prepend) action node dir to PATH for npm bootstrap
by <a href="https://github.com/zkochan"><code>@​zkochan</code></a> in <a
href="https://redirect.github.com/pnpm/action-setup/pull/241">pnpm/action-setup#241</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/pnpm/action-setup/compare/v6.0.4...v6.0.5">https://github.com/pnpm/action-setup/compare/v6.0.4...v6.0.5</a></p>
<h2>v6.0.4</h2>
<h2>What's Changed</h2>
<ul>
<li>fix: use npm co-located with the action node binary by <a
href="https://github.com/benquarmby"><code>@​benquarmby</code></a> in <a
href="https://redirect.github.com/pnpm/action-setup/pull/239">pnpm/action-setup#239</a></li>
</ul>
<h2>New Contributors</h2>
<ul>
<li><a
href="https://github.com/benquarmby"><code>@​benquarmby</code></a> made
their first contribution in <a
href="https://redirect.github.com/pnpm/action-setup/pull/239">pnpm/action-setup#239</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/pnpm/action-setup/compare/v6.0.3...v6.0.4">https://github.com/pnpm/action-setup/compare/v6.0.3...v6.0.4</a></p>
<h2>v6.0.3</h2>
<p>Updated pnpm to v11.0.0-rc.5</p>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/pnpm/action-setup/compare/v6.0.2...v6.0.3">https://github.com/pnpm/action-setup/compare/v6.0.2...v6.0.3</a></p>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="https://github.com/pnpm/action-setup/commit/0e279bb959325dab635dd2c09392533439d90093"><code>0e279bb</code></a>
fix: update pnpm to 11.1.1 (<a
href="https://redirect.github.com/pnpm/action-setup/issues/248">#248</a>)</li>
<li><a
href="https://github.com/pnpm/action-setup/commit/3e835812ef01165f4f8ae08ade56da44427ed4e0"><code>3e83581</code></a>
fix: drop patchPnpmEnv so standalone+self-update works on Windows (<a
href="https://redirect.github.com/pnpm/action-setup/issues/258">#258</a>)</li>
<li><a
href="https://github.com/pnpm/action-setup/commit/551b42e879e37e74d986effdd2a1647d2b02d464"><code>551b42e</code></a>
docs(README): fix <code>cache_dependency_path</code> type (<a
href="https://redirect.github.com/pnpm/action-setup/issues/257">#257</a>)</li>
<li><a
href="https://github.com/pnpm/action-setup/commit/739bfe42ca9233c5e6aca07c1a25a9d34aca49b0"><code>739bfe4</code></a>
fix: self-update bootstrap to packageManager-pinned version (<a
href="https://redirect.github.com/pnpm/action-setup/issues/233">#233</a>)
(<a
href="https://redirect.github.com/pnpm/action-setup/issues/256">#256</a>)</li>
<li><a
href="https://github.com/pnpm/action-setup/commit/f61705d907761b3b5209e83910fafd1fea50c5a1"><code>f61705d</code></a>
chore: add CODEOWNERS</li>
<li><a
href="https://github.com/pnpm/action-setup/commit/7a5507b117647ab83e96e9db317ba2234056ebf3"><code>7a5507b</code></a>
fix: restore inputs from state in post (<a
href="https://redirect.github.com/pnpm/action-setup/issues/255">#255</a>)</li>
<li><a
href="https://github.com/pnpm/action-setup/commit/1155470f3e5fb872accd4d104b8dfcda41f676ce"><code>1155470</code></a>
fix: honor devEngines.packageManager.onFail=error (<a
href="https://redirect.github.com/pnpm/action-setup/issues/252">#252</a>)
(<a
href="https://redirect.github.com/pnpm/action-setup/issues/254">#254</a>)</li>
<li><a
href="https://github.com/pnpm/action-setup/commit/91ab88e2619ed1f46221f0ba42d1492c02baf788"><code>91ab88e</code></a>
fix: bin_dest output points to self-updated pnpm, not bootstrap (<a
href="https://redirect.github.com/pnpm/action-setup/issues/249">#249</a>)</li>
<li><a
href="https://github.com/pnpm/action-setup/commit/e578e19d19d31b011b841ba2aca34731a5f706a5"><code>e578e19</code></a>
fix: update pnpm to 11.0.4</li>
<li><a
href="https://github.com/pnpm/action-setup/commit/8912a9102ac27614460f54aedde9e1e7f9aec20d"><code>8912a91</code></a>
fix: append (not prepend) action node dir to PATH for npm bootstrap (<a
href="https://redirect.github.com/pnpm/action-setup/issues/241">#241</a>)</li>
<li>Additional commits viewable in <a
href="https://github.com/pnpm/action-setup/compare/fc06bc1257f339d1d5d8b3a19a8cae5388b55320...0e279bb959325dab635dd2c09392533439d90093">compare
view</a></li>
</ul>
</details>
<br />

Updates `actions/setup-node` from 6.3.0 to 6.4.0
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/actions/setup-node/releases">actions/setup-node's
releases</a>.</em></p>
<blockquote>
<h2>v6.4.0</h2>
<h2>What's Changed</h2>
<h3>Dependency updates:</h3>
<ul>
<li>Upgrade <a
href="https://github.com/actions"><code>@​actions</code></a>
dependencies by <a
href="https://github.com/Copilot"><code>@​Copilot</code></a> in <a
href="https://redirect.github.com/actions/setup-node/pull/1525">actions/setup-node#1525</a></li>
<li>Update Node.js versions in versions.yml and bump package to v6.4.0
by <a
href="https://github.com/priya-kinthali"><code>@​priya-kinthali</code></a>
in <a
href="https://redirect.github.com/actions/setup-node/pull/1533">actions/setup-node#1533</a></li>
</ul>
<h2>New Contributors</h2>
<ul>
<li><a href="https://github.com/Copilot"><code>@​Copilot</code></a> made
their first contribution in <a
href="https://redirect.github.com/actions/setup-node/pull/1525">actions/setup-node#1525</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/actions/setup-node/compare/v6...v6.4.0">https://github.com/actions/setup-node/compare/v6...v6.4.0</a></p>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="https://github.com/actions/setup-node/commit/48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e"><code>48b55a0</code></a>
Update Node.js versions in versions.yml and bump package to v6.4.0 (<a
href="https://redirect.github.com/actions/setup-node/issues/1533">#1533</a>)</li>
<li><a
href="https://github.com/actions/setup-node/commit/ab72c7e7eba0eaa11f8cab0f5679243900c2cac9"><code>ab72c7e</code></a>
Upgrade <a href="https://github.com/actions"><code>@​actions</code></a>
dependencies (<a
href="https://redirect.github.com/actions/setup-node/issues/1525">#1525</a>)</li>
<li>See full diff in <a
href="https://github.com/actions/setup-node/compare/53b83947a5a98c8d113130e565377fae1a50d02f...48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e">compare
view</a></li>
</ul>
</details>
<br />

Updates `peaceiris/actions-gh-pages` from 4.0.0 to 4.1.0
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/peaceiris/actions-gh-pages/releases">peaceiris/actions-gh-pages's
releases</a>.</em></p>
<blockquote>
<h2>actions-github-pages v4.1.0</h2>
<p>See <a
href="https://github.com/peaceiris/actions-gh-pages/blob/v4.1.0/CHANGELOG.md">CHANGELOG.md</a>
for more details.</p>
<h2>What's Changed</h2>
<ul>
<li>Actions examples: update to modern versions of actions by <a
href="https://github.com/clintonsteiner"><code>@​clintonsteiner</code></a>
in <a
href="https://redirect.github.com/peaceiris/actions-gh-pages/pull/1117">peaceiris/actions-gh-pages#1117</a></li>
<li>chore: update Node runtime and dependencies by <a
href="https://github.com/peaceiris"><code>@​peaceiris</code></a> in <a
href="https://redirect.github.com/peaceiris/actions-gh-pages/pull/1147">peaceiris/actions-gh-pages#1147</a></li>
<li>ci: harden GitHub Actions workflows by <a
href="https://github.com/peaceiris"><code>@​peaceiris</code></a> in <a
href="https://redirect.github.com/peaceiris/actions-gh-pages/pull/1156">peaceiris/actions-gh-pages#1156</a></li>
</ul>
<h2>New Contributors</h2>
<ul>
<li><a
href="https://github.com/clintonsteiner"><code>@​clintonsteiner</code></a>
made their first contribution in <a
href="https://redirect.github.com/peaceiris/actions-gh-pages/pull/1117">peaceiris/actions-gh-pages#1117</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/peaceiris/actions-gh-pages/compare/v4.0.0...v4.1.0">https://github.com/peaceiris/actions-gh-pages/compare/v4.0.0...v4.1.0</a></p>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/peaceiris/actions-gh-pages/blob/main/CHANGELOG.md">peaceiris/actions-gh-pages's
changelog</a>.</em></p>
<blockquote>
<h1>Changelog</h1>
<p>All notable changes to this project will be documented in this file.
See <a
href="https://github.com/conventional-changelog/standard-version">standard-version</a>
for commit guidelines.</p>
<h1><a
href="https://github.com/peaceiris/actions-gh-pages/compare/v4.0.0...v4.1.0">4.1.0</a>
(2026-05-12)</h1>
<h3>chore</h3>
<ul>
<li>add .codex/ (<a
href="https://github.com/peaceiris/actions-gh-pages/commit/94ae2d2c73d9417ae30f61ddead523dc54d56dab">94ae2d2</a>)</li>
<li>add hasInstallScript true (<a
href="https://github.com/peaceiris/actions-gh-pages/commit/494ec9b2cc029a46119b4e13ff65f91eacbe1cf3">494ec9b</a>)</li>
<li>update Node runtime and dependencies (<a
href="https://redirect.github.com/peaceiris/actions-gh-pages/issues/1147">#1147</a>)
(<a
href="https://github.com/peaceiris/actions-gh-pages/commit/954f6bf8259a6185f366f5cf13baee63745e0f79">954f6bf</a>),
closes <a
href="https://redirect.github.com/peaceiris/actions-gh-pages/issues/1147">#1147</a></li>
</ul>
<h3>ci</h3>
<ul>
<li>change automerge to false (<a
href="https://github.com/peaceiris/actions-gh-pages/commit/4b09552702d0b65573696410d4707c765da2630b">4b09552</a>)</li>
<li>harden GitHub Actions workflows (<a
href="https://redirect.github.com/peaceiris/actions-gh-pages/issues/1156">#1156</a>)
(<a
href="https://github.com/peaceiris/actions-gh-pages/commit/aa0466c1792bb558ed327a96629c4dd4ec390e48">aa0466c</a>),
closes <a
href="https://redirect.github.com/peaceiris/actions-gh-pages/issues/1156">#1156</a></li>
</ul>
<h3>docs</h3>
<ul>
<li>add repository guidelines (<a
href="https://github.com/peaceiris/actions-gh-pages/commit/a1f94b504729eaee11b94d0f21ef5630241e8a52">a1f94b5</a>)</li>
<li>bump to v4 from v3 (<a
href="https://github.com/peaceiris/actions-gh-pages/commit/a16b61f0780be556cf97931905d261429ee79342">a16b61f</a>)</li>
<li>fix note style (<a
href="https://github.com/peaceiris/actions-gh-pages/commit/0b7567fde6f7517edcc13d8ffa2d89cd8734d47c">0b7567f</a>)</li>
<li>update versions of actions (<a
href="https://redirect.github.com/peaceiris/actions-gh-pages/issues/1117">#1117</a>)
(<a
href="https://github.com/peaceiris/actions-gh-pages/commit/aa83d0c2cfc3d813560e13068d3152aa21490171">aa83d0c</a>),
closes <a
href="https://redirect.github.com/peaceiris/actions-gh-pages/issues/1117">#1117</a></li>
</ul>
<h1><a
href="https://github.com/peaceiris/actions-gh-pages/compare/v3.9.3...v4.0.0">4.0.0</a>
(2024-04-08)</h1>
<h3>build</h3>
<ul>
<li>node 20.11.1 (<a
href="https://github.com/peaceiris/actions-gh-pages/commit/5049354438ced05ab8a5da89ef20fd8efff107c7">5049354</a>)</li>
</ul>
<h3>chore</h3>
<ul>
<li>bump node16 to node20 (<a
href="https://redirect.github.com/peaceiris/actions-gh-pages/issues/1067">#1067</a>)
(<a
href="https://github.com/peaceiris/actions-gh-pages/commit/4eb285e828117bca26638192c3ed309c622e7bad">4eb285e</a>),
closes <a
href="https://redirect.github.com/peaceiris/actions-gh-pages/issues/1067">#1067</a></li>
<li>downgrade engines.npm to 8.0.0 (<a
href="https://github.com/peaceiris/actions-gh-pages/commit/87231bc03a428df52f90a00b3b9e6bef82f7daf9">87231bc</a>)</li>
</ul>
<h3>ci</h3>
<ul>
<li>pin node-version to 18 (<a
href="https://redirect.github.com/peaceiris/actions-gh-pages/issues/981">#981</a>)
(<a
href="https://github.com/peaceiris/actions-gh-pages/commit/65ebf11929c082120c54719c87069f0827d2084c">65ebf11</a>),
closes <a
href="https://redirect.github.com/peaceiris/actions-gh-pages/issues/981">#981</a></li>
</ul>
<h3>docs</h3>
<ul>
<li>add Release Strategy (<a
href="https://github.com/peaceiris/actions-gh-pages/commit/67f80d94a1668353e4733223685dcb84340c44b5">67f80d9</a>)</li>
<li>fix link to Nuxt github-pages (<a
href="https://redirect.github.com/peaceiris/actions-gh-pages/issues/980">#980</a>)
(<a
href="https://github.com/peaceiris/actions-gh-pages/commit/88b4d2aa927893f8976712406df9928468be3c88">88b4d2a</a>),
closes <a
href="https://redirect.github.com/peaceiris/actions-gh-pages/issues/980">#980</a></li>
<li>remove braces in if conditions (<a
href="https://redirect.github.com/peaceiris/actions-gh-pages/issues/920">#920</a>)
(<a
href="https://github.com/peaceiris/actions-gh-pages/commit/0fbd12244217a1fa04396b8a52d911a436893771">0fbd122</a>),
closes <a
href="https://redirect.github.com/peaceiris/actions-gh-pages/issues/920">#920</a></li>
</ul>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="https://github.com/peaceiris/actions-gh-pages/commit/84c30a85c19949d7eee79c4ff27748b70285e453"><code>84c30a8</code></a>
chore(release): 4.1.0</li>
<li><a
href="https://github.com/peaceiris/actions-gh-pages/commit/6fa0f50907221d627dfc1f22925e09fc46a95139"><code>6fa0f50</code></a>
chore(release): Add build assets</li>
<li><a
href="https://github.com/peaceiris/actions-gh-pages/commit/3b7506a0311b775872374907835d53bcfbbb7464"><code>3b7506a</code></a>
chore(deps): update dependency trim-newlines to v5 (<a
href="https://redirect.github.com/peaceiris/actions-gh-pages/issues/1158">#1158</a>)</li>
<li><a
href="https://github.com/peaceiris/actions-gh-pages/commit/aa0466c1792bb558ed327a96629c4dd4ec390e48"><code>aa0466c</code></a>
ci: harden GitHub Actions workflows (<a
href="https://redirect.github.com/peaceiris/actions-gh-pages/issues/1156">#1156</a>)</li>
<li><a
href="https://github.com/peaceiris/actions-gh-pages/commit/31835fbbe39cd0ffade1ab81fac14a532b529633"><code>31835fb</code></a>
chore(deps): update actions/labeler action to v6 (<a
href="https://redirect.github.com/peaceiris/actions-gh-pages/issues/1153">#1153</a>)</li>
<li><a
href="https://github.com/peaceiris/actions-gh-pages/commit/f4f1bc416d16988941232658cea5c06368f3373b"><code>f4f1bc4</code></a>
chore(deps): update peaceiris/actions-mdbook action to v2 (<a
href="https://redirect.github.com/peaceiris/actions-gh-pages/issues/1161">#1161</a>)</li>
<li><a
href="https://github.com/peaceiris/actions-gh-pages/commit/a5e49793f6bdcb5cae6355701f7370ac849c8f20"><code>a5e4979</code></a>
chore(deps): update dependency ubuntu to v24 (<a
href="https://redirect.github.com/peaceiris/actions-gh-pages/issues/1159">#1159</a>)</li>
<li><a
href="https://github.com/peaceiris/actions-gh-pages/commit/6cc3bac1ca327126c11b95063230514c80197c9c"><code>6cc3bac</code></a>
chore(deps): update github/codeql-action action to v4 (<a
href="https://redirect.github.com/peaceiris/actions-gh-pages/issues/1160">#1160</a>)</li>
<li><a
href="https://github.com/peaceiris/actions-gh-pages/commit/0d6e9f4a6f26532ada0e15a7e783b34f9faad71a"><code>0d6e9f4</code></a>
chore(deps): update actions/setup-node action to v6 (<a
href="https://redirect.github.com/peaceiris/actions-gh-pages/issues/1154">#1154</a>)</li>
<li><a
href="https://github.com/peaceiris/actions-gh-pages/commit/d70c101088107fa90acab16aa67e6db280eda929"><code>d70c101</code></a>
chore(deps): update actions/upload-artifact action to v7 (<a
href="https://redirect.github.com/peaceiris/actions-gh-pages/issues/1155">#1155</a>)</li>
<li>Additional commits viewable in <a
href="https://github.com/peaceiris/actions-gh-pages/compare/4f9cc6602d3f66b9c108549d475ec49e8ef4d45e...84c30a85c19949d7eee79c4ff27748b70285e453">compare
view</a></li>
</ul>
</details>
<br />

Updates `codecov/codecov-action` from 6.0.0 to 6.0.1
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/codecov/codecov-action/releases">codecov/codecov-action's
releases</a>.</em></p>
<blockquote>
<h2>v6.0.1</h2>
<h2>What's Changed</h2>
<ul>
<li>fix: prevent template injection in run: steps (VULN-1652) by <a
href="https://github.com/thomasrockhu-codecov"><code>@​thomasrockhu-codecov</code></a>
in <a
href="https://redirect.github.com/codecov/codecov-action/pull/1947">codecov/codecov-action#1947</a></li>
<li>chore(release): 6.0.1 by <a
href="https://github.com/thomasrockhu-codecov"><code>@​thomasrockhu-codecov</code></a>
in <a
href="https://redirect.github.com/codecov/codecov-action/pull/1949">codecov/codecov-action#1949</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/codecov/codecov-action/compare/v6.0.0...v6.0.1">https://github.com/codecov/codecov-action/compare/v6.0.0...v6.0.1</a></p>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/codecov/codecov-action/blob/main/CHANGELOG.md">codecov/codecov-action's
changelog</a>.</em></p>
<blockquote>
<h2>v5.5.2</h2>
<h3>What's Changed</h3>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/codecov/codecov-action/compare/v5.5.1..v5.5.2">https://github.com/codecov/codecov-action/compare/v5.5.1..v5.5.2</a></p>
<h2>v5.5.1</h2>
<h3>What's Changed</h3>
<ul>
<li>fix: overwrite pr number on fork by <a
href="https://github.com/thomasrockhu-codecov"><code>@​thomasrockhu-codecov</code></a>
in <a
href="https://redirect.github.com/codecov/codecov-action/pull/1871">codecov/codecov-action#1871</a></li>
<li>build(deps): bump actions/checkout from 4.2.2 to 5.0.0 by
<code>@​app/dependabot</code> in <a
href="https://redirect.github.com/codecov/codecov-action/pull/1868">codecov/codecov-action#1868</a></li>
<li>build(deps): bump github/codeql-action from 3.29.9 to 3.29.11 by
<code>@​app/dependabot</code> in <a
href="https://redirect.github.com/codecov/codecov-action/pull/1867">codecov/codecov-action#1867</a></li>
<li>fix: update to use local app/ dir by <a
href="https://github.com/thomasrockhu-codecov"><code>@​thomasrockhu-codecov</code></a>
in <a
href="https://redirect.github.com/codecov/codecov-action/pull/1872">codecov/codecov-action#1872</a></li>
<li>docs: fix typo in README by <a
href="https://github.com/datalater"><code>@​datalater</code></a> in <a
href="https://redirect.github.com/codecov/codecov-action/pull/1866">codecov/codecov-action#1866</a></li>
<li>Document a <code>codecov-cli</code> version reference example by <a
href="https://github.com/webknjaz"><code>@​webknjaz</code></a> in <a
href="https://redirect.github.com/codecov/codecov-action/pull/1774">codecov/codecov-action#1774</a></li>
<li>build(deps): bump github/codeql-action from 3.28.18 to 3.29.9 by
<code>@​app/dependabot</code> in <a
href="https://redirect.github.com/codecov/codecov-action/pull/1861">codecov/codecov-action#1861</a></li>
<li>build(deps): bump ossf/scorecard-action from 2.4.1 to 2.4.2 by
<code>@​app/dependabot</code> in <a
href="https://redirect.github.com/codecov/codecov-action/pull/1833">codecov/codecov-action#1833</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/codecov/codecov-action/compare/v5.5.0..v5.5.1">https://github.com/codecov/codecov-action/compare/v5.5.0..v5.5.1</a></p>
<h2>v5.5.0</h2>
<h3>What's Changed</h3>
<ul>
<li>feat: upgrade wrapper to 0.2.4 by <a
href="https://github.com/jviall"><code>@​jviall</code></a> in <a
href="https://redirect.github.com/codecov/codecov-action/pull/1864">codecov/codecov-action#1864</a></li>
<li>Pin actions/github-script by Git SHA by <a
href="https://github.com/martincostello"><code>@​martincostello</code></a>
in <a
href="https://redirect.github.com/codecov/codecov-action/pull/1859">codecov/codecov-action#1859</a></li>
<li>fix: check reqs exist by <a
href="https://github.com/joseph-sentry"><code>@​joseph-sentry</code></a>
in <a
href="https://redirect.github.com/codecov/codecov-action/pull/1835">codecov/codecov-action#1835</a></li>
<li>fix: Typo in README by <a
href="https://github.com/spalmurray"><code>@​spalmurray</code></a> in <a
href="https://redirect.github.com/codecov/codecov-action/pull/1838">codecov/codecov-action#1838</a></li>
<li>docs: Refine OIDC docs by <a
href="https://github.com/spalmurray"><code>@​spalmurray</code></a> in <a
href="https://redirect.github.com/codecov/codecov-action/pull/1837">codecov/codecov-action#1837</a></li>
<li>build(deps): bump github/codeql-action from 3.28.17 to 3.28.18 by
<code>@​app/dependabot</code> in <a
href="https://redirect.github.com/codecov/codecov-action/pull/1829">codecov/codecov-action#1829</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/codecov/codecov-action/compare/v5.4.3..v5.5.0">https://github.com/codecov/codecov-action/compare/v5.4.3..v5.5.0</a></p>
<h2>v5.4.3</h2>
<h3>What's Changed</h3>
<ul>
<li>build(deps): bump github/codeql-action from 3.28.13 to 3.28.17 by
<code>@​app/dependabot</code> in <a
href="https://redirect.github.com/codecov/codecov-action/pull/1822">codecov/codecov-action#1822</a></li>
<li>fix: OIDC on forks by <a
href="https://github.com/joseph-sentry"><code>@​joseph-sentry</code></a>
in <a
href="https://redirect.github.com/codecov/codecov-action/pull/1823">codecov/codecov-action#1823</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/codecov/codecov-action/compare/v5.4.2..v5.4.3">https://github.com/codecov/codecov-action/compare/v5.4.2..v5.4.3</a></p>
<h2>v5.4.2</h2>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="https://github.com/codecov/codecov-action/commit/e79a6962e0d4c0c17b229090214935d2e33f8354"><code>e79a696</code></a>
chore(release): 6.0.1 (<a
href="https://redirect.github.com/codecov/codecov-action/issues/1949">#1949</a>)</li>
<li><a
href="https://github.com/codecov/codecov-action/commit/51e64229ac331acb0d7f7b17c67423995f991c79"><code>51e6422</code></a>
fix: prevent template injection in run: steps (VULN-1652) (<a
href="https://redirect.github.com/codecov/codecov-action/issues/1947">#1947</a>)</li>
<li>See full diff in <a
href="https://github.com/codecov/codecov-action/compare/57e3a136b779b570ffcdbf80b3bdc90e7fab3de2...e79a6962e0d4c0c17b229090214935d2e33f8354">compare
view</a></li>
</ul>
</details>
<br />


Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore <dependency name> major version` will close this
group update PR and stop Dependabot creating any more for the specific
dependency's major version (unless you unignore this specific
dependency's major version or upgrade to it yourself)
- `@dependabot ignore <dependency name> minor version` will close this
group update PR and stop Dependabot creating any more for the specific
dependency's minor version (unless you unignore this specific
dependency's minor version or upgrade to it yourself)
- `@dependabot ignore <dependency name>` will close this group update PR
and stop Dependabot creating any more for the specific dependency
(unless you unignore this specific dependency or upgrade to it yourself)
- `@dependabot unignore <dependency name>` will remove all of the ignore
conditions of the specified dependency
- `@dependabot unignore <dependency name> <ignore condition>` will
remove the ignore condition of the specified dependency and ignore
conditions


</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Nico Flaig <nflaig@protonmail.com>
…9425)

**Motivation**

adhere to spec `notify_ptc_messages`
```python
# PTC votes can only change the vote for their assigned beacon block, return early otherwise
 if data.slot != state.slot:
    return
```

see
#9415 (comment),
this caused issues on `glamsterdam-devnet-4`

**Description**

Ignore PTC votes whose slot does not match the referenced block
## Motivation

Align the private field name in `ProtoArray` with the gloas fork-choice
spec, which calls this store entry
[`payload_timeliness_vote`](https://github.com/ethereum/consensus-specs/blob/dev/specs/gloas/fork-choice.md#modified-store).
The companion field for blob-data availability is already tracked via
the existing `daVotes` map.

This was the last unmerged piece of lodekeeper#8 — the
data-availability tracking landed independently in #9416 and force-reorg
in #9387, so only the rename is left.

## Changes

- `packages/fork-choice/src/protoArray/protoArray.ts`: rename `private
ptcVotes` → `private payloadTimelinessVotes` and all 6 in-class
references.
- `packages/fork-choice/test/unit/protoArray/gloas.test.ts`: update 2
comments that reference the old field name.

Pure rename — no behavior change. Public `getPTCVotes()` API,
`isPayloadTimely`/`isPayloadNotTimely`, and surrounding spec comments
are unchanged.

## Verification

- `pnpm check-types` clean in `packages/fork-choice`.
- `pnpm biome check` clean on the two touched files.
- `vitest run test/unit/protoArray/gloas.test.ts` → 80/80 pass.

🤖 Generated with AI assistance

---------

Co-authored-by: lodekeeper <lodekeeper@users.noreply.github.com>
…9406)

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Co-authored-by: Nico Flaig <nflaig@protonmail.com>
no idea what broke it but this works again
markolazic01 and others added 15 commits June 5, 2026 09:57
)

**Motivation**

The consensus-specs repo added new fork choice test vectors for
on_payload_attestation_message (ethereum/consensus-specs#5206).
Lodestar's spec test runner needs a handler for this step type so the
nightly spec tests can run these vectors instead of failing on an
unrecognized step.

**Description**

Adds test infrastructure to handle `on_payload_attestation_message`
steps in fork choice spec tests:

- OnPayloadAttestationMessage step type and
`isPayloadAttestationMessage` type guard
- SSZ fixture loader for `payload_attestation_message_*.ssz_snappy`
files
- Step handler that deserializes the message and calls
`notifyPtcMessages`

Closes #9364
…t_available_slot (#9454)

**Motivation**

- lodestar silently return 0-block response if requested range is before
the earliest_available_slot

**Description**

- throw resource_unavailable error in that case

found when reviewing #9417

---------

Co-authored-by: twoeths <twoeths@users.noreply.github.com>
## Summary

Mirror the getBlobsV2 path in `getDataColumnSidecarsFromExecution` and
align with Lighthouse/Prysm by publishing only the sampled (custody +
sampling) columns after matrix recovery, instead of cross-seeding every
recovered column to non-subscribed subnets.

Per consensus-specs [PR
#4657](ethereum/consensus-specs#4657) ("Only
require nodes to publish custody columns from reconstruction"), eager
fanout for non-custody columns floods the network with duplicates
because the sender lacks visibility into which peers already saw the
message via the topic mesh.

> Lighthouse (and probably Prysm too) currently just publishes its own
sampling/custody columns for that reason. — [@jimmygchen on the spec
PR](ethereum/consensus-specs#4657 (comment))

A node custodying 65 columns ends up publishing at least 64 (63
non-custody + 1 missing custody) columns every reconstruction, which is
more outbound bandwidth than a supernode. This change brings Lodestar in
line with the other clients.

## Change

`packages/beacon-node/src/util/dataColumns.ts` —
`recoverDataColumnSidecars`:

- Capture `input.getMissingSampledColumnMeta().missing` before adding
reconstructed columns (otherwise the indices are no longer "missing"
after `addColumn`).
- Still add every recovered sidecar to the input so DA accounting is
unchanged.
- Only push to `sidecarsToPublish` when the index is in the captured
missing-sampled set.
- Split metric reporting: `peerDas.reconstructedColumns` and
`dataColumns.bySource{source=recovery}` now correctly count
reconstructed columns (`sidecarsReconstructed.length`) instead of
accidentally tracking only published ones — they happened to be equal
under the old behavior, but diverge now.

The existing getBlobsV2 path in `util/execution.ts:198-203` already
follows this "publish iff subscribed" pattern using the same
`getMissingSampledColumnMeta()` API; matrix recovery now matches.

## Spec note

Spec PR #4657 also tightens the reconstruction trigger ("custodies more
than 50%") and softens the cross-seed clause (SHOULD → MAY). This PR
only implements the publish-side change, which is what Lighthouse/Prysm
already do in practice. The trigger-side wording change does not require
a Lodestar code change (we already only attempt reconstruction when we
have ≥50%, gated by sampling).

## Test plan

- [ ] tsgo / biome clean on touched file (verified locally)
- [ ] Sim / devnet observation: confirm reduced outbound column traffic
from non-supernodes after reconstruction
- [ ] No existing unit tests for `recoverDataColumnSidecars` or the
equivalent execution.ts publish path; covered by integration/sim. Happy
to add a dedicated unit test if reviewers want it — it would need real
KZG + a mocked `BlockInputColumns`.

🤖 Generated with AI assistance

Co-authored-by: lodekeeper <lodekeeper@users.noreply.github.com>
Co-authored-by: matthewkeil <me@matthewkeil.com>
## Motivation

Fixes #9228.

In multi-node setups (e.g. DVT clusters or fallback configurations), the
same block is often submitted to multiple beacon nodes. When one node
receives the block via gossip slightly before the `POST
eth/v2/beacon/blocks` REST call, the gossip validation raises
`BLOCK_ERROR_REPEAT_PROPOSAL` from the `seenBlockProposers` check, which
currently propagates as an unhandled exception and returns HTTP 500 to
the caller. Nothing is actually wrong with the submitted block.

## Description

Extend the existing `ALREADY_KNOWN` handler in `publishBlock` to also
swallow `REPEAT_PROPOSAL`. Both are thrown as `BlockGossipError` with
`GossipAction.IGNORE`, so they share the same remediation — log at debug
and return silently so the API caller sees a successful response.

This mirrors the handler added in #6457 for `ALREADY_KNOWN`.

Only the `gossip` broadcast-validation path is affected; `consensus` /
`consensusAndEquivocation` paths use `verifyBlocksInEpoch` and do not go
through `validateGossipBlock`, so they cannot hit `REPEAT_PROPOSAL`.

No new tests added — the existing handler for `ALREADY_KNOWN` was
introduced without tests (#6457), and the underlying validation error is
already tested at the gossip layer in
`test/unit/chain/validation/block.test.ts`.
**Motivation**

Three Gloas `on_attestation` spec test vectors added in
ethereum/consensus-specs#5275 were skipped in #9422 with a TODO pending
investigation. This PR resolves that investigation and re-enables the
tests.

**Description**

The validation logic in `validateAttestationData` was already correct —
all three payload-status checks were implemented and firing as expected.
The root cause was that the attestation step handler in
`fork_choice.test.ts` had no `valid` flag handling: it called
`onAttestation` unconditionally and let any thrown `ForkChoiceError`
propagate as a test failure, even when the spec vector marks the
attestation as `valid: false`.

Fix: wrap `onAttestation` in the same `try/catch` + `isValid` pattern
already used by the `execution_payload` step handler, then unskip the
three tests.

Closes #9447
## Summary

- `codecov-action@v6.0.1` started failing on `unstable` because Codecov
lost write access to the `codecovsecurity` keybase account, bricked it,
and migrated to `codecovsecops`. v6.0.1 hardcodes the old URL, so the
wrapper's GPG key import 404s, signature verify fails, and the `Upload
coverage data` step exits 1 (example: [Unit Tests (24) on
79c77e2](https://github.com/ChainSafe/lodestar/actions/runs/27069917312/job/79898204341)).
- Codecov shipped `v6.0.2` as a literal copy of `v7.0.0` (same commit)
so v6 consumers can adopt the fix without crossing a major. See
codecov/codecov-action#1955 / codecov/codecov-action#1956.
- The only runtime change vs `v6.0.1` is the keybase URL swap
(`codecovsecurity` → `codecovsecops`); GPG integrity verification of the
uploader binary is preserved — no `use_pypi` / `skip_validation`
workaround needed.

## Test plan

- [ ] Tests workflow runs to completion on this PR
- [ ] `Upload coverage data` step in Unit Tests (24) succeeds (no `gpg:
no valid OpenPGP data found` / `Could not verify signature`)

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

Co-authored-by: lodekeeper <nflaig@protonmail.com>
**Motivation**

Introduce assumption based fast confirmation rule. 

**Description**

Specs: ethereum/consensus-specs#4747
…ers (#9170)

## Motivation

`unknownBlockGossipsubMessagesCount` and
`unknownPayloadGossipsubMessagesCount` getters iterate over all sets in
the awaiting maps to calculate the total count. This is O(N) where N =
number of unique unknown roots. These getters are called on **every
gossip message** in `onPendingGossipsubMessage` (hot path).

While map sizes are typically small (1–3 roots in normal operation), the
linear scan is unnecessary when a simple counter can be maintained at
O(1).

Flagged by gemini-code-assist on #9169, assigned by @nflaig.

## Changes

- Add private `awaitingBlockMessageCount` and
`awaitingPayloadMessageCount` counters
- Increment on `.add()` (2 sites: AwaitBlock + AwaitEnvelope cases)
- Decrement by `.size` before `.delete()` (4 sites: onBlockProcessed,
onPayloadEnvelopeProcessed, 2× onClockSlot expiry)
- Replace O(N) iteration in getters with direct counter return

1 file changed, 10 insertions, 10 deletions.

---------

Co-authored-by: lodekeeper <lodekeeper@users.noreply.github.com>
Co-authored-by: Nico Flaig <nflaig@protonmail.com>
We are queuing payload envelopes in the network processor already, this
**TODO** has been resolved
**Motivation**

- track payload timing on Networking dashboard

**Description**

- also tweak `elapsedTimeTillReceived` bucket

<img width="1368" height="393" alt="Screenshot 2026-06-09 at 11 02 57"
src="https://github.com/user-attachments/assets/c796e8fe-d32d-4919-8925-4196e906ffff"
/>

---------

Co-authored-by: twoeths <twoeths@users.noreply.github.com>
**Motivation**

- we throw `TOO_MANY_SKIPPED_SLOT` block error but still let the gossip
block run through the sync

**Description**

- it's best to just remove it, lighthouse remove a long time ago
- record in metrics + logs

Closes #9483

**AI Assistance Disclosure**

- created with the help of Claude

Co-authored-by: twoeths <twoeths@users.noreply.github.com>
**Motivation**

- UnknownBlockSync failed `validateGossipExecutionPayloadEnvelope()`
because block was not in forkchoce
- there was a gap where PayloadEnvelopeInput existed but block was not
imported to forkchoice yet

**Description**

- check block was in forkchoice instead

Closes #9478

**AI Assistance Disclosure**

- created with the help of Claude

Co-authored-by: twoeths <twoeths@users.noreply.github.com>
- Wires the new `fast_confirmation` Server-Sent Event from beacon-APIs
PR [#598](ethereum/beacon-APIs#598). The event
fires once per slot whenever the Fast Confirmation Rule executes and
carries `{block, slot}`, where `slot` is the slot of the confirmed
beacon block.
- Crosses the fork-choice ↔ beacon-node boundary via a new optional
`onFastConfirmation` callback on `ForkChoiceStore`, mirroring the
existing `onJustified` / `onFinalized` plumbing. The emit is invoked
from `ForkChoice.runFastConfirmation()` after the rule succeeds.
- Removes the now-redundant Lodestar-namespace endpoint `GET
/eth/v1/lodestar/fast_confirmation_info` (and its `getConfirmedBlock`
helper) — the standard SSE event supersedes it, and the head/checkpoint
fields it bundled are already available via standard beacon-API
endpoints.

This PR is aligned with the changes proposed in
ethereum/beacon-APIs#616

### Architecture

```
Chain.onClockSlot → forkChoice.updateTime
  └── (per tick) runFastConfirmation
       └── fcStore.notifyFastConfirmation({block, slot})
            └── ChainEventEmitter.emit(EventType.fastConfirmation, {block, slot})
                 └── SSE subscribers via /eth/v1/events?topics=fast_confirmation
```

`ApiEvents` in `ChainEventEmitter` is derived from
`routes.events.EventType`, so adding the new variant flows through
automatically — no per-event boilerplate in the chain or events API
layers.


### Edge cases

| Scenario | Behavior |
|---|---|
| `--chain.fastConfirmation` disabled (default) | No emit (FCR doesn't
run) |
| FCR rule throws | No emit; existing warn-and-continue catch is
unchanged |
| Confirmed root not in `protoArray` (defensive) | Warn log with
`slot`+`confirmedRoot`, skip emit |
| `updateTime` advances multiple slots | One emit per tick |
**Motivation**

- alternative to #9394 

**Description**

- update gossipsub to latest version (15->16 is just a 'breaking' bugfix
to apply the rpc decoding limits to control messages)
@matthewkeil matthewkeil requested a review from a team as a code owner June 9, 2026 17:05

@gemini-code-assist gemini-code-assist Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request bumps the version of the project and all of its packages from 1.43.0 to 1.44.0. I have no feedback to provide as there are no review comments and the changes are straightforward version updates.

Important

The consumer version of Gemini Code Assist on GitHub is being sunset. Starting June 18, 2026, new organization installations will be blocked, and all code review activity will officially cease on July 17, 2026.
For more details on the timeline and next steps, please review the Help Documentation.

@matthewkeil matthewkeil changed the base branch from unstable to stable June 9, 2026 17:06
@nflaig nflaig marked this pull request as draft June 9, 2026 17:06
@github-actions

github-actions Bot commented Jun 9, 2026

Copy link
Copy Markdown
Contributor

Performance Report

✔️ no performance regression detected

Full benchmark results
Benchmark suite Current: 5947b85 Previous: null Ratio
getPubkeys - index2pubkey - req 1000 vs - 250000 vc 1.2652 ms/op
getPubkeys - validatorsArr - req 1000 vs - 250000 vc 38.322 us/op
BLS verify - blst 743.25 us/op
BLS verifyMultipleSignatures 3 - blst 1.3285 ms/op
BLS verifyMultipleSignatures 8 - blst 2.1285 ms/op
BLS verifyMultipleSignatures 32 - blst 6.6643 ms/op
BLS verifyMultipleSignatures 64 - blst 12.838 ms/op
BLS verifyMultipleSignatures 128 - blst 25.222 ms/op
BLS deserializing 10000 signatures 631.83 ms/op
BLS deserializing 100000 signatures 6.3581 s/op
BLS verifyMultipleSignatures - same message - 3 - blst 748.43 us/op
BLS verifyMultipleSignatures - same message - 8 - blst 883.11 us/op
BLS verifyMultipleSignatures - same message - 32 - blst 1.5192 ms/op
BLS verifyMultipleSignatures - same message - 64 - blst 2.3355 ms/op
BLS verifyMultipleSignatures - same message - 128 - blst 3.9303 ms/op
BLS aggregatePubkeys 32 - blst 17.277 us/op
BLS aggregatePubkeys 128 - blst 61.333 us/op
getSlashingsAndExits - default max 53.123 us/op
getSlashingsAndExits - 2k 377.59 us/op
proposeBlockBody type=full, size=empty 735.25 us/op
isKnown best case - 1 super set check 172.00 ns/op
isKnown normal case - 2 super set checks 171.00 ns/op
isKnown worse case - 16 super set checks 172.00 ns/op
validate api signedAggregateAndProof - struct 1.6841 ms/op
validate gossip signedAggregateAndProof - struct 1.6514 ms/op
batch validate gossip attestation - vc 640000 - chunk 32 111.82 us/op
batch validate gossip attestation - vc 640000 - chunk 64 96.590 us/op
batch validate gossip attestation - vc 640000 - chunk 128 90.712 us/op
batch validate gossip attestation - vc 640000 - chunk 256 87.928 us/op
bytes32 toHexString 286.00 ns/op
bytes32 Buffer.toString(hex) 171.00 ns/op
bytes32 Buffer.toString(hex) from Uint8Array 234.00 ns/op
bytes32 Buffer.toString(hex) + 0x 171.00 ns/op
Return object 10000 times 0.21840 ns/op
Throw Error 10000 times 3.3713 us/op
toHex 89.284 ns/op
Buffer.from 80.799 ns/op
shared Buffer 54.561 ns/op
fastMsgIdFn sha256 / 200 bytes 1.5360 us/op
fastMsgIdFn h32 xxhash / 200 bytes 156.00 ns/op
fastMsgIdFn h64 xxhash / 200 bytes 217.00 ns/op
fastMsgIdFn sha256 / 1000 bytes 4.9410 us/op
fastMsgIdFn h32 xxhash / 1000 bytes 245.00 ns/op
fastMsgIdFn h64 xxhash / 1000 bytes 265.00 ns/op
fastMsgIdFn sha256 / 10000 bytes 42.732 us/op
fastMsgIdFn h32 xxhash / 10000 bytes 1.2920 us/op
fastMsgIdFn h64 xxhash / 10000 bytes 838.00 ns/op
enrSubnets - fastDeserialize 64 bits 757.00 ns/op
enrSubnets - ssz BitVector 64 bits 278.00 ns/op
enrSubnets - fastDeserialize 4 bits 117.00 ns/op
enrSubnets - ssz BitVector 4 bits 274.00 ns/op
prioritizePeers score -10:0 att 32-0.1 sync 2-0 211.52 us/op
prioritizePeers score 0:0 att 32-0.25 sync 2-0.25 241.52 us/op
prioritizePeers score 0:0 att 32-0.5 sync 2-0.5 347.24 us/op
prioritizePeers score 0:0 att 64-0.75 sync 4-0.75 615.86 us/op
prioritizePeers score 0:0 att 64-1 sync 4-1 693.39 us/op
array of 16000 items push then shift 1.2288 us/op
LinkedList of 16000 items push then shift 7.3340 ns/op
array of 16000 items push then pop 64.241 ns/op
LinkedList of 16000 items push then pop 5.9210 ns/op
array of 24000 items push then shift 1.8686 us/op
LinkedList of 24000 items push then shift 7.3730 ns/op
array of 24000 items push then pop 92.233 ns/op
LinkedList of 24000 items push then pop 6.1230 ns/op
intersect bitArray bitLen 8 4.7590 ns/op
intersect array and set length 8 29.499 ns/op
intersect bitArray bitLen 128 24.806 ns/op
intersect array and set length 128 511.83 ns/op
bitArray.getTrueBitIndexes() bitLen 128 1.0440 us/op
bitArray.getTrueBitIndexes() bitLen 248 1.8130 us/op
bitArray.getTrueBitIndexes() bitLen 512 3.6700 us/op
Full columns - reconstruct all 6 blobs 176.69 us/op
Full columns - reconstruct half of the blobs out of 6 81.141 us/op
Full columns - reconstruct single blob out of 6 44.727 us/op
Half columns - reconstruct all 6 blobs 377.01 ms/op
Half columns - reconstruct half of the blobs out of 6 190.06 ms/op
Half columns - reconstruct single blob out of 6 68.432 ms/op
Full columns - reconstruct all 10 blobs 445.35 us/op
Full columns - reconstruct half of the blobs out of 10 198.91 us/op
Full columns - reconstruct single blob out of 10 41.153 us/op
Half columns - reconstruct all 10 blobs 637.08 ms/op
Half columns - reconstruct half of the blobs out of 10 316.65 ms/op
Half columns - reconstruct single blob out of 10 68.568 ms/op
Full columns - reconstruct all 20 blobs 1.7042 ms/op
Full columns - reconstruct half of the blobs out of 20 391.61 us/op
Full columns - reconstruct single blob out of 20 43.473 us/op
Half columns - reconstruct all 20 blobs 1.3027 s/op
Half columns - reconstruct half of the blobs out of 20 659.61 ms/op
Half columns - reconstruct single blob out of 20 74.100 ms/op
Set add up to 64 items then delete first 2.5610 us/op
OrderedSet add up to 64 items then delete first 3.3496 us/op
Set add up to 64 items then delete last 2.3327 us/op
OrderedSet add up to 64 items then delete last 3.2731 us/op
Set add up to 64 items then delete middle 2.1581 us/op
OrderedSet add up to 64 items then delete middle 4.8018 us/op
Set add up to 128 items then delete first 4.2778 us/op
OrderedSet add up to 128 items then delete first 6.6538 us/op
Set add up to 128 items then delete last 3.9302 us/op
OrderedSet add up to 128 items then delete last 5.9899 us/op
Set add up to 128 items then delete middle 3.9571 us/op
OrderedSet add up to 128 items then delete middle 12.283 us/op
Set add up to 256 items then delete first 8.9566 us/op
OrderedSet add up to 256 items then delete first 13.733 us/op
Set add up to 256 items then delete last 8.3692 us/op
OrderedSet add up to 256 items then delete last 12.645 us/op
Set add up to 256 items then delete middle 8.0205 us/op
OrderedSet add up to 256 items then delete middle 38.529 us/op
runFastConfirmationRules vc:100000 bc:96 eq:0 2.4770 us/op
runFastConfirmationRules vc:600000 bc:96 eq:0 2.3860 us/op
runFastConfirmationRules vc:1000000 bc:96 eq:0 2.3900 us/op
runFastConfirmationRules vc:600000 bc:320 eq:0 5.2860 us/op
runFastConfirmationRules vc:600000 bc:1200 eq:0 16.784 us/op
runFastConfirmationRules vc:600000 bc:96 eq:1000 2.1570 us/op
runFastConfirmationRules vc:600000 bc:96 eq:10000 2.1370 us/op
runFastConfirmationRules vc:600000 bc:96 eq:300000 2.1660 us/op
pass gossip attestations to forkchoice per slot 2.5460 ms/op
forkChoice updateHead vc 100000 bc 64 eq 0 502.24 us/op
forkChoice updateHead vc 600000 bc 64 eq 0 2.4185 ms/op
forkChoice updateHead vc 1000000 bc 64 eq 0 4.1200 ms/op
forkChoice updateHead vc 600000 bc 320 eq 0 2.4464 ms/op
forkChoice updateHead vc 600000 bc 1200 eq 0 2.5560 ms/op
forkChoice updateHead vc 600000 bc 7200 eq 0 3.1818 ms/op
forkChoice updateHead vc 600000 bc 64 eq 1000 2.5654 ms/op
forkChoice updateHead vc 600000 bc 64 eq 10000 2.5980 ms/op
forkChoice updateHead vc 600000 bc 64 eq 300000 7.4025 ms/op
computeDeltas 1400000 validators 0% inactive 12.951 ms/op
computeDeltas 1400000 validators 10% inactive 12.337 ms/op
computeDeltas 1400000 validators 20% inactive 11.305 ms/op
computeDeltas 1400000 validators 50% inactive 8.5851 ms/op
computeDeltas 2100000 validators 0% inactive 19.559 ms/op
computeDeltas 2100000 validators 10% inactive 18.176 ms/op
computeDeltas 2100000 validators 20% inactive 16.267 ms/op
computeDeltas 2100000 validators 50% inactive 9.5821 ms/op
altair processAttestation - 250000 vs - 7PWei normalcase 2.1822 ms/op
altair processAttestation - 250000 vs - 7PWei worstcase 3.2793 ms/op
altair processAttestation - setStatus - 1/6 committees join 107.95 us/op
altair processAttestation - setStatus - 1/3 committees join 206.01 us/op
altair processAttestation - setStatus - 1/2 committees join 281.36 us/op
altair processAttestation - setStatus - 2/3 committees join 387.11 us/op
altair processAttestation - setStatus - 4/5 committees join 531.86 us/op
altair processAttestation - setStatus - 100% committees join 604.67 us/op
altair processBlock - 250000 vs - 7PWei normalcase 4.4413 ms/op
altair processBlock - 250000 vs - 7PWei normalcase hashState 15.722 ms/op
altair processBlock - 250000 vs - 7PWei worstcase 22.146 ms/op
altair processBlock - 250000 vs - 7PWei worstcase hashState 43.842 ms/op
phase0 processBlock - 250000 vs - 7PWei normalcase 1.3067 ms/op
phase0 processBlock - 250000 vs - 7PWei worstcase 16.541 ms/op
altair processEth1Data - 250000 vs - 7PWei normalcase 292.10 us/op
getExpectedWithdrawals 250000 eb:1,eth1:1,we:0,wn:0,smpl:16 4.2780 us/op
getExpectedWithdrawals 250000 eb:0.95,eth1:0.1,we:0.05,wn:0,smpl:220 22.046 us/op
getExpectedWithdrawals 250000 eb:0.95,eth1:0.3,we:0.05,wn:0,smpl:43 7.0830 us/op
getExpectedWithdrawals 250000 eb:0.95,eth1:0.7,we:0.05,wn:0,smpl:19 5.1570 us/op
getExpectedWithdrawals 250000 eb:0.1,eth1:0.1,we:0,wn:0,smpl:1021 94.714 us/op
getExpectedWithdrawals 250000 eb:0.03,eth1:0.03,we:0,wn:0,smpl:11778 1.3963 ms/op
getExpectedWithdrawals 250000 eb:0.01,eth1:0.01,we:0,wn:0,smpl:16384 1.9170 ms/op
getExpectedWithdrawals 250000 eb:0,eth1:0,we:0,wn:0,smpl:16384 1.8112 ms/op
getExpectedWithdrawals 250000 eb:0,eth1:0,we:0,wn:0,nocache,smpl:16384 3.8804 ms/op
getExpectedWithdrawals 250000 eb:0,eth1:1,we:0,wn:0,smpl:16384 2.0635 ms/op
getExpectedWithdrawals 250000 eb:0,eth1:1,we:0,wn:0,nocache,smpl:16384 4.2962 ms/op
Tree 40 250000 create 333.65 ms/op
Tree 40 250000 get(125000) 93.255 ns/op
Tree 40 250000 set(125000) 1.0254 us/op
Tree 40 250000 toArray() 15.906 ms/op
Tree 40 250000 iterate all - toArray() + loop 15.583 ms/op
Tree 40 250000 iterate all - get(i) 39.703 ms/op
Array 250000 create 2.1731 ms/op
Array 250000 clone - spread 686.26 us/op
Array 250000 get(125000) 0.29100 ns/op
Array 250000 set(125000) 0.30000 ns/op
Array 250000 iterate all - loop 57.246 us/op
phase0 afterProcessEpoch - 250000 vs - 7PWei 41.998 ms/op
Array.fill - length 1000000 2.5263 ms/op
Array push - length 1000000 9.6094 ms/op
Array.get 0.21180 ns/op
Uint8Array.get 0.24579 ns/op
phase0 beforeProcessEpoch - 250000 vs - 7PWei 16.559 ms/op
altair processEpoch - mainnet_e81889 308.26 ms/op
mainnet_e81889 - altair beforeProcessEpoch 18.033 ms/op
mainnet_e81889 - altair processJustificationAndFinalization 6.8560 us/op
mainnet_e81889 - altair processInactivityUpdates 6.1321 ms/op
mainnet_e81889 - altair processRewardsAndPenalties 20.376 ms/op
mainnet_e81889 - altair processRegistryUpdates 573.00 ns/op
mainnet_e81889 - altair processSlashings 136.00 ns/op
mainnet_e81889 - altair processEth1DataReset 133.00 ns/op
mainnet_e81889 - altair processEffectiveBalanceUpdates 4.8878 ms/op
mainnet_e81889 - altair processSlashingsReset 718.00 ns/op
mainnet_e81889 - altair processRandaoMixesReset 1.4050 us/op
mainnet_e81889 - altair processHistoricalRootsUpdate 131.00 ns/op
mainnet_e81889 - altair processParticipationFlagUpdates 468.00 ns/op
mainnet_e81889 - altair processSyncCommitteeUpdates 107.00 ns/op
mainnet_e81889 - altair afterProcessEpoch 43.109 ms/op
capella processEpoch - mainnet_e217614 892.07 ms/op
mainnet_e217614 - capella beforeProcessEpoch 67.391 ms/op
mainnet_e217614 - capella processJustificationAndFinalization 7.1270 us/op
mainnet_e217614 - capella processInactivityUpdates 18.838 ms/op
mainnet_e217614 - capella processRewardsAndPenalties 99.078 ms/op
mainnet_e217614 - capella processRegistryUpdates 4.6440 us/op
mainnet_e217614 - capella processSlashings 135.00 ns/op
mainnet_e217614 - capella processEth1DataReset 134.00 ns/op
mainnet_e217614 - capella processEffectiveBalanceUpdates 19.485 ms/op
mainnet_e217614 - capella processSlashingsReset 724.00 ns/op
mainnet_e217614 - capella processRandaoMixesReset 1.4820 us/op
mainnet_e217614 - capella processHistoricalRootsUpdate 139.00 ns/op
mainnet_e217614 - capella processParticipationFlagUpdates 481.00 ns/op
mainnet_e217614 - capella afterProcessEpoch 112.01 ms/op
phase0 processEpoch - mainnet_e58758 352.91 ms/op
mainnet_e58758 - phase0 beforeProcessEpoch 78.423 ms/op
mainnet_e58758 - phase0 processJustificationAndFinalization 6.9680 us/op
mainnet_e58758 - phase0 processRewardsAndPenalties 17.445 ms/op
mainnet_e58758 - phase0 processRegistryUpdates 2.3370 us/op
mainnet_e58758 - phase0 processSlashings 135.00 ns/op
mainnet_e58758 - phase0 processEth1DataReset 217.00 ns/op
mainnet_e58758 - phase0 processEffectiveBalanceUpdates 1.0510 ms/op
mainnet_e58758 - phase0 processSlashingsReset 998.00 ns/op
mainnet_e58758 - phase0 processRandaoMixesReset 1.4320 us/op
mainnet_e58758 - phase0 processHistoricalRootsUpdate 136.00 ns/op
mainnet_e58758 - phase0 processParticipationRecordUpdates 1.2480 us/op
mainnet_e58758 - phase0 afterProcessEpoch 33.300 ms/op
phase0 processEffectiveBalanceUpdates - 250000 normalcase 1.3646 ms/op
phase0 processEffectiveBalanceUpdates - 250000 worstcase 0.5 6.0124 ms/op
altair processInactivityUpdates - 250000 normalcase 12.286 ms/op
altair processInactivityUpdates - 250000 worstcase 13.017 ms/op
phase0 processRegistryUpdates - 250000 normalcase 2.3700 us/op
phase0 processRegistryUpdates - 250000 badcase_full_deposits 142.54 us/op
phase0 processRegistryUpdates - 250000 worstcase 0.5 62.328 ms/op
altair processRewardsAndPenalties - 250000 normalcase 16.346 ms/op
altair processRewardsAndPenalties - 250000 worstcase 16.356 ms/op
phase0 getAttestationDeltas - 250000 normalcase 5.4770 ms/op
phase0 getAttestationDeltas - 250000 worstcase 5.4427 ms/op
phase0 processSlashings - 250000 worstcase 62.456 us/op
altair processSyncCommitteeUpdates - 250000 11.857 ms/op
BeaconState.hashTreeRoot - No change 175.00 ns/op
BeaconState.hashTreeRoot - 1 full validator 72.556 us/op
BeaconState.hashTreeRoot - 32 full validator 888.79 us/op
BeaconState.hashTreeRoot - 512 full validator 9.6901 ms/op
BeaconState.hashTreeRoot - 1 validator.effectiveBalance 106.60 us/op
BeaconState.hashTreeRoot - 32 validator.effectiveBalance 1.5467 ms/op
BeaconState.hashTreeRoot - 512 validator.effectiveBalance 20.886 ms/op
BeaconState.hashTreeRoot - 1 balances 78.534 us/op
BeaconState.hashTreeRoot - 32 balances 748.75 us/op
BeaconState.hashTreeRoot - 512 balances 6.9179 ms/op
BeaconState.hashTreeRoot - 250000 balances 121.45 ms/op
aggregationBits - 2048 els - zipIndexesInBitList 23.730 us/op
regular array get 100000 times 23.136 us/op
wrappedArray get 100000 times 23.136 us/op
arrayWithProxy get 100000 times 9.5962 ms/op
ssz.Root.equals 21.728 ns/op
byteArrayEquals 21.476 ns/op
Buffer.compare 8.8790 ns/op
processSlot - 1 slots 10.200 us/op
processSlot - 32 slots 2.0840 ms/op
getEffectiveBalanceIncrementsZeroInactive - 250000 vs - 7PWei 5.8975 ms/op
getCommitteeAssignments - req 1 vs - 250000 vc 1.6736 ms/op
getCommitteeAssignments - req 100 vs - 250000 vc 3.4657 ms/op
getCommitteeAssignments - req 1000 vs - 250000 vc 3.7292 ms/op
findModifiedValidators - 10000 modified validators 825.90 ms/op
findModifiedValidators - 1000 modified validators 498.72 ms/op
findModifiedValidators - 100 modified validators 321.10 ms/op
findModifiedValidators - 10 modified validators 273.87 ms/op
findModifiedValidators - 1 modified validators 194.13 ms/op
findModifiedValidators - no difference 186.52 ms/op
migrate state 1500000 validators, 3400 modified, 2000 new 3.3514 s/op
RootCache.getBlockRootAtSlot - 250000 vs - 7PWei 3.7400 ns/op
state getBlockRootAtSlot - 250000 vs - 7PWei 420.35 ns/op
computeProposerIndex 100000 validators 1.3719 ms/op
getNextSyncCommitteeIndices 1000 validators 2.9262 ms/op
getNextSyncCommitteeIndices 10000 validators 26.088 ms/op
getNextSyncCommitteeIndices 100000 validators 94.795 ms/op
computeProposers - vc 250000 686.76 us/op
computeEpochShuffling - vc 250000 41.244 ms/op
getNextSyncCommittee - vc 250000 10.371 ms/op
nodejs block root to RootHex using toHex 89.686 ns/op
nodejs block root to RootHex using toRootHex 51.755 ns/op
nodejs fromHex(blob) 918.22 us/op
nodejs fromHexInto(blob) 629.14 us/op
nodejs block root to RootHex using the deprecated toHexString 484.42 ns/op
nodejs byteArrayEquals 32 bytes (block root) 25.828 ns/op
nodejs byteArrayEquals 48 bytes (pubkey) 37.611 ns/op
nodejs byteArrayEquals 96 bytes (signature) 33.547 ns/op
nodejs byteArrayEquals 1024 bytes 41.507 ns/op
nodejs byteArrayEquals 131072 bytes (blob) 1.8657 us/op
browser block root to RootHex using toHex 145.27 ns/op
browser block root to RootHex using toRootHex 132.57 ns/op
browser fromHex(blob) 1.5947 ms/op
browser fromHexInto(blob) 629.91 us/op
browser block root to RootHex using the deprecated toHexString 335.62 ns/op
browser byteArrayEquals 32 bytes (block root) 28.099 ns/op
browser byteArrayEquals 48 bytes (pubkey) 40.285 ns/op
browser byteArrayEquals 96 bytes (signature) 76.049 ns/op
browser byteArrayEquals 1024 bytes 770.89 ns/op
browser byteArrayEquals 131072 bytes (blob) 96.014 us/op

by benchmarkbot/action

twoeths and others added 9 commits June 9, 2026 19:00
**Motivation**

- better logs + metrics for `BlockInputSync`, this is very useful to
debug unstable networks

**Description**

- dedup unknown block vs unknown payload metrics
- add `delaySec` whenever we have a slot, more logs
- add slot to `ChainEvent.unknownEnvelopeBlockRoot` event
## Motivation
`fastConfirmation.test.ts` perf bench was flaky on CI.

## Summary
The per-iteration `everyoneVotes(...)` (100K–1M validator loop) and
`updateHead()` in `beforeEach` created GC pressure inside the µs-scale
measurement window. The "flip votes" logic was also a silent no-op —
`addLatestMessage` rejects same-epoch votes. Since
`runFastConfirmationRules` doesn't mutate `store`, `beforeEach` is now a
pass-through.

Locally: ~80K–160K samples/config (was 25–424), ~0.3–5s wall time/config
(was 2–17s).

## Follow-ups (separate PR)
- Rename to `runFastConfirmationRules.test.ts` to match the bench `id`.
- Add a state-backed bench that exercises
`findLatestConfirmedDescendant` end-to-end using
`generatePerfTestCachedStateElectra` from
`@lodestar/state-transition/test-utils`.

## Test plan
- [x] `pnpm benchmark:files
'packages/fork-choice/test/perf/forkChoice/fastConfirmation.test.ts'` —
stable across 3 consecutive runs.
- [x] `check-types` + `lint` clean.
- [ ] CI bench job.

🤖 AI-assisted with Claude Code (Opus 4.7).

---------

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Co-authored-by: Lodekeeper <258435968+lodekeeper@users.noreply.github.com>
Co-authored-by: lodekeeper <lodekeeper@users.noreply.github.com>
## Motivation

`bench` runs on `unstable` have been failing with `1 benchmark(s)
failed: unknown error` ([example
run](https://github.com/ChainSafe/lodestar/actions/runs/27218604384/job/80367013945)).
All 8 `send data - 1000 NB messages` cases throw on every iteration:

```
StreamResetError: The stream has been reset
    at EncryptedMessageStream.onRemoteReset (.../abstract-message-stream.js:260:21)
    at MockMuxedStream.noiseOnClose (.../@chainsafe/libp2p-noise@17.0.0/dist/src/utils.js:83:26)
    at MockMuxer.onMessage (.../@libp2p/utils@7.2.2/.../mock-muxer.js:155:20)
```

Reproduces locally and on multiple recent unstable runs (`27225662417`
b00d95d, `27203232811` 8d5a6a4).

## Root cause

When `connA.close()` lands after sending all 1000 messages, `MockMuxer`
routes the close as a **reset frame** to the inbound side
(`mock-muxer.js:155` → `stream.onRemoteReset()`). That dispatches a
`close` event the noise layer is subscribed to
(`libp2p-noise/utils.js:77-89`), which calls
`EncryptedMessageStream.onRemoteReset()` and puts the encrypted stream
into `reset` status while the inbound `for await (const _chunk of
connB)` is still draining. The async iterator then throws
`StreamResetError` on its next pull. The throw propagates through
`Promise.all` and `fn`'s `await`, the bench harness reports the
iteration as failed, and the whole file is reported as `unknown error`.

The existing `process.on("uncaughtException", ...)` only suppresses
`StreamStateError` from the **drain** race — it can't catch this one
because the error is a normal async throw inside `fn`, not an uncaught
exception.

## Fix

Wrap the inbound `for await` in a `try/catch` that swallows
`StreamResetError` only. Rethrow anything else.

## Test plan
- [x] Reproduced the failure locally on `unstable@b00d95d` — all 8
cases fail with the same stack.
- [x] After the fix, all 8 cases pass locally:
  ```
  ✔ send data - 1000 256B messages    250.06 ops/s  3.999 ms/op  28 runs
  ✔ send data - 1000 512B messages    236.67 ops/s  4.225 ms/op  18 runs
  ✔ send data - 1000 1024B messages   212.73 ops/s  4.701 ms/op  17 runs
  ✔ send data - 1000 1200B messages   212.85 ops/s  4.698 ms/op  17 runs
  ✔ send data - 1000 2048B messages   190.46 ops/s  5.251 ms/op  23 runs
  ✔ send data - 1000 4096B messages   172.39 ops/s  5.801 ms/op  22 runs
  ✔ send data - 1000 16384B messages   87.81 ops/s 11.389 ms/op  12 runs
  ✔ send data - 1000 65536B messages   29.22 ops/s 34.222 ms/op  10 runs
    8 passing, 0 failed
  ```
- [x] `lint` clean.
- [ ] CI bench job.

🤖 AI-assisted with Claude Code (Opus 4.7).

---------

Co-authored-by: lodekeeper <lodekeeper@users.noreply.github.com>
CHURN_LIMIT_QUOTIENT_GLOAS, CONSOLIDATION_CHURN_LIMIT_QUOTIENT and
MAX_PER_EPOCH_ACTIVATION_CHURN_LIMIT_GLOAS are now present in local
chainConfig and match the spec, so drop them from
ignoredRemoteConfigFields.
**Motivation**

- got this error from vero
```
consensus-1  | Jun-09 21:45:56.328[rest]            error: Req req-qi getProposerDuties error - Can only get block root in the past currentSlot=14518127 slot=14518143
consensus-1  | Error: Can only get block root in the past currentSlot=14518127 slot=14518143
consensus-1  |     at getBlockRootAtSlot (file:///usr/app/packages/state-transition/src/util/blockRoot.ts:21:11)
consensus-1  |     at BeaconStateView.getBlockRootAtSlot (file:///usr/app/packages/state-transition/src/stateView/beaconStateView.ts:157:12)
consensus-1  |     at proposerShufflingDecisionRoot (file:///usr/app/packages/state-transition/src/util/shuffling.ts:36:16)
consensus-1  |     at Object.getProposerDuties (file:///usr/app/packages/beacon-node/src/api/impl/validator/index.ts:1298:9)
consensus-1  |     at processTicksAndRejections (node:internal/process/task_queues:104:5)
consensus-1  |     at Object.<anonymous> (file:///usr/app/packages/api/src/utils/server/handler.ts:105:22)
```

- #9380 was too strict, vero still querying `get_proposer_duties()` v1

**Description**

- this is how it was broken for unstable and how it worked for v1.43
```
###
lodestar unstable

vero requested for v1 at epoch 453692, lodestar detected it's not v2 
  => fork is phase0 => decision epoch = 453692 => decision slot = 14 518 143 => throw error

###
lodestar v1.43 did not care about requested epoch

  => based on state slot 14518127, decisionSlot is 14.518.111, which is luckily correct for requested epoch 453692 (previous slot of epoch 453691)

```

=> fallback to`get_proposer_duties()` v1, which is how it worked for
v1.43


**AI Assistance Disclosure**
- created with the help of Claude

Co-authored-by: twoeths <twoeths@users.noreply.github.com>
per
#9380 (comment),
we cannot use getProposerDutiesV2 before gloas as clients might not have
it implemented yet
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.

10 participants