Skip to content

Use latest stable validator version in CI#1544

Merged
mcintyre94 merged 4 commits into
mainfrom
validator-version
Apr 16, 2026
Merged

Use latest stable validator version in CI#1544
mcintyre94 merged 4 commits into
mainfrom
validator-version

Conversation

@mcintyre94
Copy link
Copy Markdown
Member

@mcintyre94 mcintyre94 commented Apr 15, 2026

Problem

CI is broken: https://github.com/anza-xyz/kit/actions/runs/24452992515/job/71487609515?pr=1542

This is because the anza releases page that we use to find the validator version no longer has any 2.3.x versions on the first page of results

Summary of Changes

This PR changes the approach so that we use the latest stable (not prerelease, no alpha/beta/rc in tag name) version. Currently this is 3.1.13, as all 4.x releases are betas.

This might turn out to be a bad approach, but I think it's probably better for our CI to be running against the validator the network is currently using. See https://www.validators.app/ - currently around 73% of the network are on 3.1.13

We also update the types (at least those covered by tests), to match what the 3.1.13 validator is returning. This is purely additive, which justifies a minor changeset. Our tests do validate precise values (to catch fields missing from our types) and so needed to be updated. Adding new fields to types is not a breaking change in Kit though.

There is one exception: The RPC now returns replacementBlockhash: null when replaceRecentBlockhash is false in simulateTransaction. Previously it excluded the field. This would be a breaking change to Kit types, so we don't include it in this PR to unblock CI. #1546

Going forward we can decide at each breaking version whether to pin to eg 3.1.x, or immediately update to keep up with the current stable version. But I think staying permanently pinned to an old version (2.3.x) is the worst of all options. Consumers are going to be receiving responses from a network on 3.1.x currently.

CI run with --force to ensure all tests pass: https://github.com/anza-xyz/kit/actions/runs/24504824860/job/71620554038

@changeset-bot
Copy link
Copy Markdown

changeset-bot Bot commented Apr 15, 2026

🦋 Changeset detected

Latest commit: 8501822

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 46 packages
Name Type
@solana/rpc-api Minor
@solana/rpc-parsed-types Minor
@solana/errors Minor
@solana/kit Minor
@solana/program-client-core Minor
@solana/rpc Minor
@solana/sysvars Minor
@solana/accounts Minor
@solana/addresses Minor
@solana/assertions Minor
@solana/codecs-core Minor
@solana/codecs-data-structures Minor
@solana/codecs-numbers Minor
@solana/codecs-strings Minor
@solana/compat Minor
@solana/instruction-plans Minor
@solana/instructions Minor
@solana/keys Minor
@solana/offchain-messages Minor
@solana/options Minor
@solana/programs Minor
@solana/react Minor
@solana/rpc-spec Minor
@solana/rpc-subscriptions-channel-websocket Minor
@solana/rpc-subscriptions-spec Minor
@solana/rpc-subscriptions Minor
@solana/rpc-transformers Minor
@solana/rpc-transport-http Minor
@solana/rpc-types Minor
@solana/signers Minor
@solana/subscribable Minor
@solana/transaction-confirmation Minor
@solana/transaction-messages Minor
@solana/transactions Minor
@solana/wallet-account-signer Minor
@solana/rpc-graphql Minor
@solana/plugin-interfaces Minor
@solana/rpc-subscriptions-api Minor
@solana/codecs Minor
@solana/fast-stable-stringify Minor
@solana/functional Minor
@solana/nominal-types Minor
@solana/plugin-core Minor
@solana/promises Minor
@solana/rpc-spec-types Minor
@solana/webcrypto-ed25519-polyfill Minor

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

@bundlemon
Copy link
Copy Markdown

bundlemon Bot commented Apr 15, 2026

BundleMon

Unchanged files (144)
Status Path Size Limits
@solana/kit production bundle
kit/dist/index.production.min.js
47.43KB -
errors/dist/index.node.mjs
19.61KB -
errors/dist/index.browser.mjs
19.59KB -
errors/dist/index.native.mjs
19.59KB -
rpc-graphql/dist/index.browser.mjs
18.82KB -
rpc-graphql/dist/index.native.mjs
18.81KB -
rpc-graphql/dist/index.node.mjs
18.81KB -
wallet-account-signer/dist/index.node.mjs
16.62KB -
wallet-account-signer/dist/index.browser.mjs
16.6KB -
wallet-account-signer/dist/index.native.mjs
16.6KB -
transaction-messages/dist/index.browser.mjs
11.32KB -
transaction-messages/dist/index.native.mjs
11.32KB -
transaction-messages/dist/index.node.mjs
11.32KB -
instruction-plans/dist/index.browser.mjs
6.58KB -
instruction-plans/dist/index.native.mjs
6.58KB -
instruction-plans/dist/index.node.mjs
6.58KB -
codecs-data-structures/dist/index.browser.mjs
5.04KB -
codecs-data-structures/dist/index.native.mjs
5.03KB -
codecs-data-structures/dist/index.node.mjs
5.03KB -
offchain-messages/dist/index.browser.mjs
4.89KB -
offchain-messages/dist/index.native.mjs
4.89KB -
offchain-messages/dist/index.node.mjs
4.89KB -
transactions/dist/index.browser.mjs
4.07KB -
transactions/dist/index.native.mjs
4.07KB -
transactions/dist/index.node.mjs
4.07KB -
kit/dist/index.browser.mjs
3.72KB -
kit/dist/index.native.mjs
3.72KB -
kit/dist/index.node.mjs
3.72KB -
codecs-core/dist/index.browser.mjs
3.62KB -
codecs-core/dist/index.native.mjs
3.62KB -
codecs-core/dist/index.node.mjs
3.62KB -
webcrypto-ed25519-polyfill/dist/index.node.mj
s
3.61KB -
webcrypto-ed25519-polyfill/dist/index.browser
.mjs
3.59KB -
webcrypto-ed25519-polyfill/dist/index.native.
mjs
3.57KB -
rpc-subscriptions/dist/index.browser.mjs
3.37KB -
rpc-subscriptions/dist/index.node.mjs
3.34KB -
rpc-subscriptions/dist/index.native.mjs
3.31KB -
signers/dist/index.browser.mjs
3.26KB -
signers/dist/index.native.mjs
3.26KB -
signers/dist/index.node.mjs
3.26KB -
rpc-transformers/dist/index.browser.mjs
3.16KB -
rpc-transformers/dist/index.native.mjs
3.16KB -
rpc-transformers/dist/index.node.mjs
3.16KB -
react/dist/index.browser.mjs
3.09KB -
react/dist/index.native.mjs
3.09KB -
react/dist/index.node.mjs
3.09KB -
keys/dist/index.node.mjs
3.06KB -
addresses/dist/index.browser.mjs
2.93KB -
addresses/dist/index.native.mjs
2.92KB -
addresses/dist/index.node.mjs
2.92KB -
keys/dist/index.browser.mjs
2.85KB -
keys/dist/index.native.mjs
2.85KB -
codecs-strings/dist/index.browser.mjs
2.55KB -
codecs-strings/dist/index.node.mjs
2.51KB -
codecs-strings/dist/index.native.mjs
2.47KB -
transaction-confirmation/dist/index.node.mjs
2.41KB -
sysvars/dist/index.browser.mjs
2.37KB -
sysvars/dist/index.native.mjs
2.37KB -
sysvars/dist/index.node.mjs
2.37KB -
transaction-confirmation/dist/index.native.mj
s
2.36KB -
transaction-confirmation/dist/index.browser.m
js
2.35KB -
rpc-subscriptions-spec/dist/index.node.mjs
2.21KB -
rpc-subscriptions-spec/dist/index.native.mjs
2.17KB -
rpc-subscriptions-spec/dist/index.browser.mjs
2.16KB -
subscribable/dist/index.node.mjs
1.97KB -
rpc/dist/index.node.mjs
1.95KB -
codecs-numbers/dist/index.browser.mjs
1.95KB -
codecs-numbers/dist/index.native.mjs
1.95KB -
codecs-numbers/dist/index.node.mjs
1.94KB -
subscribable/dist/index.native.mjs
1.92KB -
subscribable/dist/index.browser.mjs
1.91KB -
rpc-transport-http/dist/index.browser.mjs
1.91KB -
rpc-transport-http/dist/index.native.mjs
1.9KB -
rpc/dist/index.native.mjs
1.81KB -
rpc/dist/index.browser.mjs
1.8KB -
rpc-transport-http/dist/index.node.mjs
1.72KB -
rpc-types/dist/index.browser.mjs
1.53KB -
rpc-types/dist/index.native.mjs
1.53KB -
rpc-types/dist/index.node.mjs
1.53KB -
rpc-subscriptions-channel-websocket/dist/inde
x.node.mjs
1.33KB -
rpc-subscriptions-channel-websocket/dist/inde
x.native.mjs
1.27KB -
rpc-subscriptions-channel-websocket/dist/inde
x.browser.mjs
1.26KB -
program-client-core/dist/index.browser.mjs
1.21KB -
program-client-core/dist/index.native.mjs
1.21KB -
program-client-core/dist/index.node.mjs
1.21KB -
options/dist/index.browser.mjs
1.18KB -
options/dist/index.native.mjs
1.18KB -
options/dist/index.node.mjs
1.17KB -
accounts/dist/index.browser.mjs
1.17KB -
accounts/dist/index.native.mjs
1.17KB -
accounts/dist/index.node.mjs
1.16KB -
rpc-api/dist/index.browser.mjs
976B -
rpc-api/dist/index.native.mjs
975B -
rpc-api/dist/index.node.mjs
973B -
compat/dist/index.browser.mjs
969B -
compat/dist/index.native.mjs
968B -
compat/dist/index.node.mjs
966B -
rpc-spec-types/dist/index.browser.mjs
962B -
rpc-spec-types/dist/index.native.mjs
961B -
rpc-spec-types/dist/index.node.mjs
959B -
rpc-subscriptions-api/dist/index.native.mjs
870B -
rpc-subscriptions-api/dist/index.node.mjs
869B -
rpc-subscriptions-api/dist/index.browser.mjs
868B -
rpc-spec/dist/index.browser.mjs
852B -
rpc-spec/dist/index.native.mjs
851B -
rpc-spec/dist/index.node.mjs
850B -
promises/dist/index.browser.mjs
799B -
promises/dist/index.native.mjs
798B -
promises/dist/index.node.mjs
797B -
assertions/dist/index.browser.mjs
783B -
instructions/dist/index.browser.mjs
771B -
instructions/dist/index.native.mjs
770B -
instructions/dist/index.node.mjs
768B -
plugin-core/dist/index.browser.mjs
749B -
plugin-core/dist/index.native.mjs
749B -
plugin-core/dist/index.node.mjs
747B -
fast-stable-stringify/dist/index.browser.mjs
726B -
fast-stable-stringify/dist/index.native.mjs
725B -
assertions/dist/index.native.mjs
724B -
fast-stable-stringify/dist/index.node.mjs
724B -
assertions/dist/index.node.mjs
723B -
programs/dist/index.browser.mjs
329B -
programs/dist/index.native.mjs
327B -
programs/dist/index.node.mjs
325B -
fs-impl/dist/index.browser.mjs
245B -
event-target-impl/dist/index.node.mjs
230B -
functional/dist/index.browser.mjs
154B -
functional/dist/index.native.mjs
152B -
text-encoding-impl/dist/index.native.mjs
152B -
functional/dist/index.node.mjs
151B -
codecs/dist/index.browser.mjs
137B -
codecs/dist/index.native.mjs
136B -
codecs/dist/index.node.mjs
134B -
event-target-impl/dist/index.browser.mjs
133B -
ws-impl/dist/index.node.mjs
131B -
text-encoding-impl/dist/index.browser.mjs
122B -
fs-impl/dist/index.node.mjs
120B -
text-encoding-impl/dist/index.node.mjs
119B -
ws-impl/dist/index.browser.mjs
113B -
crypto-impl/dist/index.node.mjs
111B -
crypto-impl/dist/index.browser.mjs
109B -
rpc-parsed-types/dist/index.browser.mjs
66B -
rpc-parsed-types/dist/index.native.mjs
65B -
rpc-parsed-types/dist/index.node.mjs
63B -

No change in files bundle size

Final result: ✅

View report in BundleMon website ➡️


Current branch size history | Target branch size history

@mcintyre94
Copy link
Copy Markdown
Member Author

@trevor-cortex

Copy link
Copy Markdown

@trevor-cortex trevor-cortex left a comment

Choose a reason for hiding this comment

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

Summary

CI was broken because the GitHub releases API pagination no longer returns any 2.3.x versions on the first page. This PR fixes it by switching from filtering for v2.3.* to finding the latest stable (non-prerelease, no alpha/beta/rc in tag name) release instead.

Notes

This looks good to me! A couple of small things to be aware of:

  • The regex /alpha|beta|rc/ doesn't filter out test versions, which was mentioned in the PR description. Not sure if that's intentional or if it just doesn't exist in practice. Might be worth adding it for safety.
  • This still only looks at the first page of results (30 items by default from the GitHub API). If all 30 happen to be prereleases at some point, the script will fall through to the cache-busting path. Unlikely in practice, but worth noting.
  • The find approach (first match) works well here since GitHub returns releases in reverse chronological order.

set -e
version=$(node -e \
'fetch("https://api.github.com/repos/anza-xyz/agave/releases").then(res => res.json().then(rs => rs.filter(r => !r.prerelease && r.tag_name.startsWith("v2.3."))).then(x => console.log(x[0].tag_name)));'
'fetch("https://api.github.com/repos/anza-xyz/agave/releases").then(res => res.json()).then(rs => { const r = rs.find(r => !r.prerelease && !/alpha|beta|rc/.test(r.tag_name)); if (r) console.log(r.tag_name); });'
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Nit: the PR description mentions filtering out test versions too, but the regex only covers alpha|beta|rc. Worth adding test to the pattern?

Suggested change
'fetch("https://api.github.com/repos/anza-xyz/agave/releases").then(res => res.json()).then(rs => { const r = rs.find(r => !r.prerelease && !/alpha|beta|rc/.test(r.tag_name)); if (r) console.log(r.tag_name); });'
'fetch("https://api.github.com/repos/anza-xyz/agave/releases").then(res => res.json()).then(rs => { const r = rs.find(r => !r.prerelease && !/alpha|beta|rc|test/.test(r.tag_name)); if (r) console.log(r.tag_name); });'

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

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

oops misread the regex while writing the PR description, but we don't use -test in tag names so not needed. Last 100 releases have only used alpha/beta.

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Apr 15, 2026

Documentation Preview: https://kit-docs-cp9mjq6ef-anza-tech.vercel.app

(
if flock -nx 200; then
$TEST_VALIDATOR --ledger $TEST_VALIDATOR_LEDGER --reset --quiet --account-dir $FIXTURE_ACCOUNTS_DIR --rpc-pubsub-enable-vote-subscription --rpc-pubsub-enable-block-subscription >/dev/null &
$TEST_VALIDATOR --ledger $TEST_VALIDATOR_LEDGER --reset --quiet --account-dir $FIXTURE_ACCOUNTS_DIR --rpc-pubsub-enable-vote-subscription >/dev/null &
Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

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

Seems like this flag has been removed, caused an error on startup

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.

I ran into the exact same issue yesterday (wallet-ui repo is a fork of this base repo)

wallet-ui/wallet-ui#477

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

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

Thanks @beeman! I'm hoping this PR pinning to the latest stable release is going to be the right longer term fix here

@mcintyre94 mcintyre94 marked this pull request as draft April 16, 2026 08:38
Copy link
Copy Markdown

@trevor-cortex trevor-cortex left a comment

Choose a reason for hiding this comment

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

Summary

This PR fixes broken CI by switching from the pinned v2.3.* validator version to the latest stable release (currently 3.1.13). It also updates all affected types and tests to match the 3.1.13 validator's responses, including:

  • New fields on SimulateTransactionApiResponseBase: fee, loadedAddresses, preBalances, postBalances, preTokenBalances, postTokenBalances, and replacementBlockhash (now always present, nullable).
  • New fields on JsonParsedVoteAccount: blockRevenueCollector, blockRevenueCommissionBps, blsPubkeyCompressed, inflationRewardsCollector, inflationRewardsCommissionBps, pendingDelegatorRewards, and latency on votes.
  • New fields on RpcSimulateTransactionResult (errors package) to stay in sync with the RPC API types.
  • Test assertions relaxed to use expect.objectContaining() / expect.arrayContaining() to accommodate new fields from the validator without brittle exact matching.
  • Behavioral change: invalid signature with sigVerify: true now returns a result with err: 'SignatureFailure' instead of throwing SERVER_ERROR_TRANSACTION_SIGNATURE_VERIFICATION_FAILURE.
  • Removed --rpc-pubsub-enable-block-subscription flag from the test validator start script (presumably dropped in 3.x).

Key things to watch

  • The replacementBlockhash type change is a breaking change for consumers: it was previously conditional on replaceRecentBlockhash config, but is now always present as T | null in the base response. The typetest update reflects this. Downstream users who relied on replacementBlockhash not existing in the response type when replaceRecentBlockhash is false will need to handle the null case.
  • The SimulateTransactionApiResponseWithReplacementBlockhash type still narrows replacementBlockhash to non-null TransactionBlockhashLifetime for the replaceRecentBlockhash: true overloads — this is correct since & will intersect to the non-null version.
  • The signature verification behavior change (returning SignatureFailure in the result rather than throwing) seems like a validator-level change. Worth documenting if this affects any public error handling guidance.

Notes for subsequent reviewers

  • Verify that all new JsonParsedVoteAccount fields match the actual Agave 3.1.13 vote account schema. The fields look reasonable (BLS key support, revenue collectors, delegator rewards) but worth cross-referencing with Agave source.
  • The postTokenBalances and preTokenBalances are typed as unknown[] in RpcSimulateTransactionResult (errors package) but as readonly TokenBalance[] in simulateTransaction.ts — this is fine since the errors package is looser by design, but worth noting the asymmetry.
  • The loadedAccountsDataSize field is now optional (?:) in SimulateTransactionApiResponseBase — check if 3.1.13 still returns it or if it's been removed.

LGTM 👍

set -e
version=$(node -e \
'fetch("https://api.github.com/repos/anza-xyz/agave/releases").then(res => res.json().then(rs => rs.filter(r => !r.prerelease && r.tag_name.startsWith("v2.3."))).then(x => console.log(x[0].tag_name)));'
'fetch("https://api.github.com/repos/anza-xyz/agave/releases").then(res => res.json()).then(rs => { const r = rs.find(r => !r.prerelease && !/alpha|beta|rc/.test(r.tag_name)); if (r) console.log(r.tag_name); });'
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Previous review noted this: the regex filters alpha|beta|rc but not test (which was mentioned in the original PR description). Looks like the description was updated to drop test — just confirming that's intentional and not an oversight.

replacementBlockhash: TransactionBlockhashLifetime | null;
/** The most-recent return data generated by an instruction in the transaction */
returnData: Readonly<{
/** The return data itself, as base-64 encoded binary data */
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Nit: replacementBlockhash is now in the base response type as T | null, but SimulateTransactionApiResponseWithReplacementBlockhash still exists and narrows it to non-null. This works correctly via intersection (&), but it does mean replacementBlockhash appears in two places. Might be worth a comment on the base field noting that it gets narrowed by the intersection type for replaceRecentBlockhash: true overloads.

await expect(resultPromise).rejects.toThrow(
new SolanaError(SOLANA_ERROR__JSON_RPC__SERVER_ERROR_TRANSACTION_SIGNATURE_VERIFICATION_FAILURE),
);
await expect(resultPromise).resolves.toStrictEqual({
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Good catch on this behavioral change. The validator now returns SignatureFailure as a result error rather than throwing a JSON-RPC error. Worth noting in a changelog or migration guide if this repo publishes one — consumers catching SERVER_ERROR_TRANSACTION_SIGNATURE_VERIFICATION_FAILURE will need to update their error handling.

@mcintyre94
Copy link
Copy Markdown
Member Author

@trevor-cortex Is "The replacementBlockhash type change" the only breaking change?

@trevor-cortex
Copy link
Copy Markdown

No, there are several breaking changes in this PR beyond replacementBlockhash. Here's the full list:

1. New fields added to SimulateTransactionApiResponseBase (and RpcSimulateTransactionResult)

  • fee: Lamports | null
  • loadedAddresses: { readonly: Address[], writable: Address[] } | null
  • postBalances: readonly Lamports[] | null
  • postTokenBalances: readonly TokenBalance[] | null
  • preBalances: readonly Lamports[] | null
  • preTokenBalances: readonly TokenBalance[] | null

These are added to the base type, so any code doing exhaustive checks on the response shape will see new properties.

2. replacementBlockhash moved to the base type
Previously it was only present when replaceRecentBlockhash: true (via the SimulateTransactionApiResponseWithReplacementBlockhash intersection type). Now it's TransactionBlockhashLifetime | null in the base response, always present. The narrowing type still exists and intersects to TransactionBlockhashLifetime (non-null) when replaceRecentBlockhash: true. This is a type-level breaking change — code that previously relied on replacementBlockhash not existing on the response when replaceRecentBlockhash is false will now see it as | null.

3. Signature verification behavior change
With the 2.3.x validator, sending a transaction with an invalid signature + sigVerify: true threw SOLANA_ERROR__JSON_RPC__SERVER_ERROR_TRANSACTION_SIGNATURE_VERIFICATION_FAILURE. With 3.1.x, it now returns a successful response with err: 'SignatureFailure'. This is a runtime behavior change that could break error handling code expecting the old throw pattern.

4. New fields on JsonParsedVoteAccount

  • blockRevenueCollector: Address
  • blockRevenueCommissionBps: bigint
  • blsPubkeyCompressed: string | null
  • inflationRewardsCollector: Address
  • inflationRewardsCommissionBps: bigint
  • pendingDelegatorRewards: StringifiedBigInt
  • latency: bigint added to vote entries

5. Rent sysvar values changed

  • exemptionThreshold: 2 → 1
  • lamportsPerByteYear: '3480' → '6960'

These are runtime data changes rather than type changes, but they'll break any snapshot/exact-match tests.

6. --rpc-pubsub-enable-block-subscription flag removed
The test validator startup script drops this flag — presumably it was removed or made default in 3.1.x.

So TL;DR: the replacementBlockhash type change is one of several. The signature verification behavior change (#3) is probably the most impactful one for downstream consumers.

@mcintyre94
Copy link
Copy Markdown
Member Author

I disagree that these are major breaking changes. Importantly, this PR is not upgrading the validator version for consumers, that's already happened and is independent of Kit. We pick up the breaking changes from the validator intentionally in our tests to inform our types.

  1. adding fields to types to match validator is not breaking IMO
  2. agreed, reverted. Breaking change: simulateTransaction always returns replacementBlockhash #1546 for this breaking change later
  3. outside of kit's API. This is a breaking change for consumers caused by 3.x, not Kit
  4. same as 1
  5. same as 3
  6. not our change

@mcintyre94 mcintyre94 requested a review from lorisleiva April 16, 2026 12:40
@mcintyre94 mcintyre94 marked this pull request as ready for review April 16, 2026 12:40
Copy link
Copy Markdown
Member

@lorisleiva lorisleiva left a comment

Choose a reason for hiding this comment

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

Amazing! Tysm for keeping up with these changes. 🫶

@mcintyre94 mcintyre94 added this pull request to the merge queue Apr 16, 2026
Merged via the queue into main with commit e82e03e Apr 16, 2026
13 checks passed
@mcintyre94 mcintyre94 deleted the validator-version branch April 16, 2026 13:23
@github-actions
Copy link
Copy Markdown
Contributor

🔎💬 Inkeep AI search and chat service is syncing content for source 'Solana Kit Docs'

@github-actions github-actions Bot mentioned this pull request Apr 16, 2026
@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented May 1, 2026

Because there has been no activity on this PR for 14 days since it was merged, it has been automatically locked. Please open a new issue if it requires a follow up.

@github-actions github-actions Bot locked as resolved and limited conversation to collaborators May 1, 2026
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants