Skip to content

chore(lint): non-null assertion cleanup batch — bot music/spotify/handlers (#1378) - #1391

Merged
LucasSantana-Dev merged 2 commits into
mainfrom
chore/1378-nonnull-music-batch
Jun 13, 2026
Merged

LucasSantana-Dev merged 2 commits into
mainfrom
chore/1378-nonnull-music-batch

Conversation

@LucasSantana-Dev

@LucasSantana-Dev LucasSantana-Dev commented Jun 13, 2026 •

Copy link
Copy Markdown
Owner

Incremental #1378 warning reduction (follow-up to #1389).

Change

Replaced @typescript-eslint/no-non-null-assertion sites (foo!) with assertDefined(value, 'reason') (from @lucky/shared/utils/guards) or safe narrowing, across:

  • stop.ts, volume.ts, voteskip.ts, play/handlers/playHandler.ts (music commands — after require* preconditions)
  • spotify/spotifyApi.ts (filter-guaranteed id/name)
  • utils/music/queueEditOps.ts, handlers/player/streamBridge.ts, handlers/message/autoModHandler.ts

Results

  • bot no-non-null-assertion: 38 → 18 (20 removed)
  • 0 lint errors (73 warnings remain, down the ladder)
  • Imports use the submodule path @lucky/shared/utils/guards (matches merged convention; avoids the ts-jest shared-barrel resolution quirk). No shared-package changes.

Verification

  • npm run build:shared + npm run build --workspace=packages/bot — OK
  • npm run lint --workspace=packages/bot — 0 errors
  • Full bot jest suite: 187 passed, 1 skipped, 0 failed (2536 tests)

Incremental — does not close #1378. Refs #1378.


Summary by cubic

Replaced non-null assertions with assertDefined and safe narrowing across music commands, Spotify API, and message/player handlers. Also fixes the stop command to call requireGuild before requireDJRole to avoid misleading guard errors; cuts 20 lint warnings (38 → 18) toward #1378.

  • Refactors

    • Replaced foo! with assertDefined(value, 'reason') where guards guarantee presence (voice channel, guildId, queue, stdout/stderr, Spotify IDs/names, track indices).
    • Switched imports to @lucky/shared/utils/guards across music (playHandler, stop, volume, voteskip), Spotify (spotifyApi), handlers (autoModHandler, streamBridge), and utils (queueEditOps).
  • Bug Fixes

    • In stop, run requireGuild before requireDJRole so guildId is truly guaranteed; adds a test that returns early when the guild check fails.

Written for commit e4249ce. Summary will update on new commits.

Review in cubic

Summary by CodeRabbit

  • Refactor
    • Enhanced runtime error handling across music commands and utility modules by replacing compile-time assumptions with explicit runtime validation guards, improving overall code robustness and fail-fast behavior for missing critical values.

@vercel

vercel Bot commented Jun 13, 2026 •

Copy link
Copy Markdown
Contributor

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
lucky Ready Ready Preview, Comment Jun 13, 2026 8:23pm

Request Review

@greptile-apps greptile-apps Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Your free trial has ended. If you'd like to continue receiving code reviews, you can add a payment method here.

@github-actions github-actions Bot added the bot label Jun 13, 2026
@LucasSantana-Dev

Copy link
Copy Markdown
Owner Author

@cubic-dev-ai please review — incremental non-null-assertion cleanup (38→18), bot-only, full suite green.

@coderabbitai

coderabbitai Bot commented Jun 13, 2026 •

Copy link
Copy Markdown

Review Change Stack

Warning

Review limit reached

@LucasSantana-Dev, we couldn't start this review because you've reached your PR review rate limit.

More reviews will be available in 14 minutes and 48 seconds. Learn how PR review limits work.

Your organization has used up its prepaid credits, and credit purchases are no longer available. Enable the review add-on in the billing tab to keep reviews running — you're only billed for reviews past your plan's rate limits ($0.25/file).

⌛ How to resolve this issue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

We recommend that you space out your commits to avoid hitting the rate limit.

🚦 How do rate limits work?

CodeRabbit enforces hourly rate limits for each developer per organization.

Our paid plans include higher PR review limits than trial, open-source, and free plans. In all cases, reviews become available again over time. During sustained high-volume PR review activity, CodeRabbit may temporarily slow when the next review becomes available.

Please see our Fair Usage Limits Policy for further information.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 55a58386-d1de-4991-bad6-188f30ab8874

📥 Commits

Reviewing files that changed from the base of the PR and between c37f021 and e4249ce.

📒 Files selected for processing (9)
  • packages/bot/src/functions/music/commands/play/handlers/playHandler.ts
  • packages/bot/src/functions/music/commands/stop.spec.ts
  • packages/bot/src/functions/music/commands/stop.ts
  • packages/bot/src/functions/music/commands/volume.ts
  • packages/bot/src/functions/music/commands/voteskip.ts
  • packages/bot/src/handlers/message/autoModHandler.ts
  • packages/bot/src/handlers/player/streamBridge.ts
  • packages/bot/src/spotify/spotifyApi.ts
  • packages/bot/src/utils/music/queueEditOps.ts
📝 Walkthrough

Walkthrough

Seven modules across music commands, event handlers, stream processing, Spotify API mapping, and queue utilities replace TypeScript non-null assertions (!) with explicit assertDefined runtime guards from a shared utility to improve runtime safety and reduce ESLint warnings.

Changes

Non-null assertion refactoring

Layer / File(s) Summary
Music command guildId and voice channel guards
packages/bot/src/functions/music/commands/play/handlers/playHandler.ts, packages/bot/src/functions/music/commands/stop.ts, packages/bot/src/functions/music/commands/volume.ts, packages/bot/src/functions/music/commands/voteskip.ts
Music command handlers replace non-null assertions on interaction.guildId with assertDefined guards when passing to DJ-role validation and background operations. The play handler additionally guards member.voice.channel, and voteskip guards the queue object before calling node.skip().
Event handler client user assertion
packages/bot/src/handlers/message/autoModHandler.ts
The autoModHandler guards message.client.user with assertDefined before extracting user id and tag for moderator metadata in case input.
Stream and API response field assertions
packages/bot/src/handlers/player/streamBridge.ts, packages/bot/src/spotify/spotifyApi.ts
streamBridge guards stdout and stderr from yt-dlp child process with assertDefined during stream setup. spotifyApi guards id and name fields from Spotify API responses (recommendations and user top tracks/artists) with assertDefined after filtering ensures presence.
Queue array element assertions
packages/bot/src/utils/music/queueEditOps.ts
queueEditOps guards array accesses in moveUserTrackToPriority with assertDefined: tracks[i] based on loop bounds, and tracks[trackIndex] based on prior validation check.

Possibly related PRs

  • LucasSantana-Dev/Lucky#807: Modifies queueEditOps.ts for queue priority manipulation, directly related to queue element assertions in this PR.
  • LucasSantana-Dev/Lucky#520: Introduces yt-dlp subprocess streaming in streamBridge, related to the stdout/stderr assertion guards added here.
  • LucasSantana-Dev/Lucky#597: Modifies play command now-playing registration flow, related to guildId assertions in playHandler.

Suggested labels

bot, size/m

Estimated code review effort

🎯 2 (Simple) | ⏱️ ~12 minutes

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly and specifically describes the main change: a batch cleanup replacing non-null assertions with assertDefined guards across multiple music/Spotify/handler files.
Linked Issues check ✅ Passed The PR successfully addresses the linked issue #1378 by reducing no-non-null-assertion warnings from 75 to 55 (20 removed across 8 files), directly supporting the goal of driving warning counts down toward stricter CI gating.
Out of Scope Changes check ✅ Passed All changes are narrowly scoped to replacing non-null assertions with assertDefined guards across specified music commands and handlers; no unrelated modifications detected.
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch chore/1378-nonnull-music-batch

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@cubic-dev-ai

cubic-dev-ai Bot commented Jun 13, 2026

Copy link
Copy Markdown

@cubic-dev-ai please review — incremental non-null-assertion cleanup (38→18), bot-only, full suite green.

@LucasSantana-Dev I have started the AI code review. It will take a few minutes to complete.

@github-actions

Copy link
Copy Markdown

Failed to generate code suggestions for PR

cubic-dev-ai[bot]
cubic-dev-ai Bot previously approved these changes Jun 13, 2026

@cubic-dev-ai cubic-dev-ai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

No issues found across 8 files

Auto-approved: Replaces non-null assertions with runtime checks across music commands, Spotify API, and handlers. No logic changes, reduces lint warnings, tests pass.

Re-trigger cubic

coderabbitai[bot]
coderabbitai Bot previously requested changes Jun 13, 2026

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@packages/bot/src/functions/music/commands/stop.ts`:
- Line 25: Add an explicit await requireGuild(interaction) call before calling
requireDJRole in the stop command so the guildId is guaranteed like other music
commands (e.g., volume.ts, voteskip.ts); then keep the
assertDefined(interaction.guildId, ...) usage consistent by updating its error
message to reference "requireGuild" (e.g., "Guild ID required after requireGuild
check") or remove the misleading resolveGuildQueue mention—this ensures
requireGuild runs before requireDJRole and the assertDefined message accurately
reflects the guarantee.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 451206af-2897-438a-a4f4-e5ed5b6c52f2

📥 Commits

Reviewing files that changed from the base of the PR and between c37f021 and de2fc5c.

📒 Files selected for processing (8)
  • packages/bot/src/functions/music/commands/play/handlers/playHandler.ts
  • packages/bot/src/functions/music/commands/stop.ts
  • packages/bot/src/functions/music/commands/volume.ts
  • packages/bot/src/functions/music/commands/voteskip.ts
  • packages/bot/src/handlers/message/autoModHandler.ts
  • packages/bot/src/handlers/player/streamBridge.ts
  • packages/bot/src/spotify/spotifyApi.ts
  • packages/bot/src/utils/music/queueEditOps.ts
📜 Review details
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (9)
  • GitHub Check: Test — backend
  • GitHub Check: Checks
  • GitHub Check: Test — shared
  • GitHub Check: Test — bot
  • GitHub Check: Test — frontend
  • GitHub Check: cubic · AI code reviewer
  • GitHub Check: quality / SAST (CodeQL) (javascript-typescript)
  • GitHub Check: Build — bot
  • GitHub Check: Build — backend
🔇 Additional comments (8)
packages/bot/src/handlers/message/autoModHandler.ts (1)

4-4: LGTM!

Also applies to: 116-116, 121-122

packages/bot/src/functions/music/commands/volume.ts (1)

82-82: LGTM!

packages/bot/src/functions/music/commands/voteskip.ts (1)

39-39: LGTM!

Also applies to: 115-115

packages/bot/src/handlers/player/streamBridge.ts (1)

72-72: LGTM!

Also applies to: 76-84

packages/bot/src/spotify/spotifyApi.ts (2)

220-228: LGTM!


592-606: LGTM!

packages/bot/src/utils/music/queueEditOps.ts (1)

178-178: LGTM!

Also applies to: 206-206

packages/bot/src/functions/music/commands/play/handlers/playHandler.ts (1)

48-48: /play already validates voice channel before playHandler
packages/bot/src/functions/music/commands/play/index.ts calls await requireVoiceChannel(params.interaction) and returns early before await executePlayHandler(params); requireVoiceChannel replies with Join a voice channel first. when member.voice.channel is missing, so the assertDefined(member.voice.channel, 'Voice channel guaranteed by requireVoiceChannel check') in playHandler.ts is consistent with the command validation contract.

Comment thread packages/bot/src/functions/music/commands/stop.ts Outdated
… truly guaranteed (#1378)

Addresses CodeRabbit: stop had no requireGuild precondition, so assertDefined(guildId) could throw and its message was misleading. Now matches volume/voteskip pattern; adds guard-rejection test.
@LucasSantana-Dev

Copy link
Copy Markdown
Owner Author

Addressed CodeRabbit's finding on stop.ts: added requireGuild(interaction) before requireDJRole (stop previously had no guild precondition, so the assertDefined(guildId, …) could throw and its message was misleading). Now consistent with volume.ts/voteskip.ts, message corrected to "after requireGuild check", and added a guard-rejection test. Full bot suite green (187 suites). cc @coderabbitai @cubic-dev-ai

@greptile-apps greptile-apps Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Your free trial has ended. If you'd like to continue receiving code reviews, you can add a payment method here.

@cubic-dev-ai

cubic-dev-ai Bot commented Jun 13, 2026

Copy link
Copy Markdown

Addressed CodeRabbit's finding on stop.ts: added requireGuild(interaction) before requireDJRole (stop previously had no guild precondition, so the assertDefined(guildId, …) could throw and its message was misleading). Now consistent with volume.ts/voteskip.ts, message corrected to "after requireGuild check", and added a guard-rejection test. Full bot suite green (187 suites). cc @coderabbitai @cubic-dev-ai

@LucasSantana-Dev The fix on stop.ts looks good. Your reasoning is exactly right — before this change stop had no requireGuild guard, so interaction.guildId! (now assertDefined(guildId, ...)) was only protected by an implicit assumption that stop wouldn't be invoked in a DM context. Adding requireGuild(interaction) at the top makes the precondition explicit and aligns stop with volume and voteskip.

A couple of things I noticed that are worth a quick look:

resolveGuildQueue call sits before the guild check. The current order is:

if (!(await requireGuild(interaction))) return

const { queue } = resolveGuildQueue(client, interaction.guildId ?? '')

The ?? '' fallback in resolveGuildQueue won't cause a crash, but it's dead code now — requireGuild already guarantees guildId is present. You could tighten that to interaction.guildId (no fallback) since the guard ran first, but it's minor and the existing approach is harmless.

The test covers the early-return path well. Mocking requireGuild to return false and asserting that neither requireQueue nor clearSessionMoodCache fire is the right way to validate the guard. One thing that's missing from the test though: there's no assertion that the function returns early (not just skips those calls). Since the function returns void, that's hard to check directly without a spy on the return — but the existing assertions are enough to prove the guard short-circuits the meaningful work.

Overall this is a clean incremental improvement. The warning count drop (38 → 18) and green suite speak for themselves.

Tip: get faster answers by chatting with cubic’s review copilot in the review UI

@github-actions github-actions Bot removed the size/s label Jun 13, 2026
@coderabbitai

coderabbitai Bot commented Jun 13, 2026

Copy link
Copy Markdown

Tip

For best results, initiate chat on the files or code changes.

@LucasSantana-Dev — thanks for the thorough follow-up! Adding requireGuild(interaction) as a precondition before requireDJRole / assertDefined(guildId, …) is exactly the right call: it keeps the guard semantically accurate ("guildId is guaranteed by this point") and gives callers a clear, consistent error. The added rejection test rounds it out nicely. All green on 187 suites is great — nice work on this batch!

(ᵔᴥᵔ)🐇


✏️ Learnings added
Learnt from: LucasSantana-Dev
URL: https://github.com/LucasSantana-Dev/Lucky/pull/1391

Timestamp: 2026-06-13T20:22:50.536Z
Learning: In the Lucky bot (packages/bot), music slash commands that call `requireDJRole` must first call `requireGuild(interaction)` as a precondition before using `assertDefined(interaction.guildId, …)`. This ensures the guild existence is validated before the DJ-role check and before asserting guildId is non-null, keeping error messages semantically accurate and consistent across commands (stop.ts, volume.ts, voteskip.ts). Pattern established in PR `#1391`.

Note: Learnings are effective only in the context of similar code segments. To apply general coding guidelines, please configure review instructions. You can manage existing learnings in the app.

@cubic-dev-ai cubic-dev-ai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

0 issues found across 2 files (changes from recent commits).

Auto-approved: Replaces non-null assertions with runtime guards across isolated music commands, Spotify API, and handlers. All changes are mechanical; tests pass and lint count is reduced.

Re-trigger cubic

@sonarqubecloud

Copy link
Copy Markdown

@LucasSantana-Dev

Copy link
Copy Markdown
Owner Author

@coderabbitai review — the requireGuild precondition + corrected assertDefined message and the new rejection test have been pushed (head e4249ce). Please re-review; the prior thread is resolved/outdated.

@coderabbitai

coderabbitai Bot commented Jun 13, 2026 •

Copy link
Copy Markdown

@LucasSantana-Dev — on it! Triggering a fresh review of the updated head (e4249ce) covering the requireGuild precondition, the corrected assertDefined message, and the new rejection test. Prior resolved threads won't be re-raised.

✅ Action performed

Full review finished.

@LucasSantana-Dev
LucasSantana-Dev dismissed coderabbitai[bot]’s stale review June 13, 2026 20:46

Dismissing stale review: this CHANGES_REQUESTED is on the superseded commit de2fc5c. The requested fix (add requireGuild precondition before requireDJRole in stop.ts, plus the corrected assertDefined message + new rejection test) has been applied and pushed in e4249ce; the review thread is resolved+outdated and cubic-dev-ai re-approved the current head with all CI green. Requested a re-review (@coderabbitai review) ~20min ago with no new review delivered.

@LucasSantana-Dev
LucasSantana-Dev merged commit 71057f9 into main Jun 13, 2026
41 checks passed
@LucasSantana-Dev
LucasSantana-Dev deleted the chore/1378-nonnull-music-batch branch June 13, 2026 21:05
LucasSantana-Dev added a commit that referenced this pull request Jun 13, 2026
…ublisher (#1378)

- skipto.ts: add requireGuild precondition before requireDJRole (was an
  unguarded interaction.guildId! — same latent crash-in-DM class as the
  stop.ts fix in #1391), then assertDefined.
- musicButtonHandler.ts: interaction.guildId! -> interaction.guildId ?? ''
  (voice-channel check guarantees guild; matches resolveGuildQueue call
  convention, graceful no-queue path).
- MusicControlService.ts:85: this.publisher! -> assertDefined (guaranteed
  by the isHealthy() guard at sendCommand entry).

Completes the #1378 no-non-null-assertion sweep: 0 remaining in bot + shared.
LucasSantana-Dev added a commit that referenced this pull request Jun 13, 2026
…ublisher (#1378)

- skipto.ts: add requireGuild precondition before requireDJRole (was an
  unguarded interaction.guildId! — same latent crash-in-DM class as the
  stop.ts fix in #1391), then assertDefined.
- musicButtonHandler.ts: interaction.guildId! -> interaction.guildId ?? ''
  (voice-channel check guarantees guild; matches resolveGuildQueue call
  convention, graceful no-queue path).
- MusicControlService.ts:85: this.publisher! -> assertDefined (guaranteed
  by the isHealthy() guard at sendCommand entry).

Completes the #1378 no-non-null-assertion sweep: 0 remaining in bot + shared.
LucasSantana-Dev added a commit that referenced this pull request Jun 13, 2026
… services (#1378) (#1393)

Part of #1378 (follow-up to #1391). Clears the remaining **29**
`@typescript-eslint/no-non-null-assertion` sites across bot + shared →
**0 repo-wide**.

## Changes
Each `expr!` replaced with `assertDefined(expr, '<reason> — guaranteed
by <guard>')` from `@lucky/shared/utils/guards` (submodule path; barrel
untouched), where a preceding guard already guarantees non-nullness:
- **Music commands:** album, artist, effects, leavecleanup, play/index,
play/queryUtils, shuffle, skip, songinfo (behind `requireQueue` /
`requireVoiceChannel` / `requireCurrentTrack` / explicit guards).
- **Bot utils/services:** candidateFallback, voteSkipStore,
feedbackService (Map `.get()` after `.has()`).
- **Shared:** `AutoMessageService` (×6), `environment.ts` Infisical
block (×4, behind the `isInfisicalConfigured()` early-return that
verifies all 4 vars), `MusicControlService` publisher (behind
`isHealthy()`).

### 2 latent-bug guard hardenings (same class CodeRabbit flagged on
stop.ts in #1391)
- **`skipto.ts`** — was an **unguarded** `interaction.guildId!` (would
throw in a non-guild context). Added `requireGuild` precondition before
`requireDJRole`, then `assertDefined` — matches the merged
skip.ts/stop.ts pattern.
- **`musicButtonHandler.ts`** — `interaction.guildId!` →
`interaction.guildId ?? ''` (voice-channel check guarantees guild;
matches the `resolveGuildQueue` call convention with its graceful
no-queue path).

## Verification (local, post-rebase onto #1392)
- eslint `no-non-null-assertion`: **0** across `packages/bot/src` +
`packages/shared/src`
- `build:shared`: clean
- **shared 818/818**, **bot 2537 passed** (6 skipped) — no failures, no
import.meta/barrel regressions

Follow-up (separate PR): promote `no-unsafe-* warn → error` now that
#1392 gives CI lint type info and these warnings are cleared.

@cubic-dev-ai @coderabbitai

<!-- This is an auto-generated description by cubic. -->
---
## Summary by cubic
Replaced all remaining non‑null assertions with `assertDefined` to
satisfy `@typescript-eslint/no-non-null-assertion` and improve
guard-based safety. Also tightened guild checks to prevent edge-case
crashes; completes the cleanup tracked in #1378.

- **Refactors**
- Replaced `x!` with `assertDefined(x, 'reason')` from
`@lucky/shared/utils/guards` where prior guards ensure non-null (queues,
voice channels, tracks, Map/Set entries).
- Touched music commands (`album`, `artist`, `play`, `effects`,
`shuffle`, `skip`, `songinfo`, `leavecleanup`), utils/services
(`candidateFallback`, `voteSkipStore`, `feedbackService`), and shared
(`environment` Infisical block, `AutoMessageService`,
`MusicControlService` publisher).

- **Bug Fixes**
- `skipto`: add `requireGuild` before `requireDJRole`; assert
`interaction.guildId`.
- `musicButtonHandler`: use `interaction.guildId ?? ''` when calling
`resolveGuildQueue` for a graceful no-queue path.

<sup>Written for commit f7dd0ea.
Summary will update on new commits.</sup>

<a
href="https://cubic.dev/pr/LucasSantana-Dev/Lucky/pull/1393?utm_source=github"
target="_blank" rel="noopener noreferrer"
data-no-image-dialog="true"><picture><source
media="(prefers-color-scheme: dark)"
srcset="https://www.cubic.dev/buttons/review-in-cubic-dark.svg"><source
media="(prefers-color-scheme: light)"
srcset="https://www.cubic.dev/buttons/review-in-cubic-light.svg"><img
alt="Review in cubic"
src="https://www.cubic.dev/buttons/review-in-cubic-dark.svg"></picture></a>

<!-- End of auto-generated description by cubic. -->

This branch was successfully deployed

1 active deployment
Preview — e4249ce4 Deployed Jun 13, 2026 by vercel[bot]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

tech-debt(lint): triage bot/shared ESLint warning inventory (428 warnings) toward a blocking gate

1 participant