Skip to content

[Stack 3/3] Composed components and contract baseline#39

Merged
Kravalg merged 52 commits into
mainfrom
review-3-contract-baseline
Jun 12, 2026
Merged

[Stack 3/3] Composed components and contract baseline#39
Kravalg merged 52 commits into
mainfrom
review-3-contract-baseline

Conversation

@RudoiDmytro

Copy link
Copy Markdown
Contributor

Summary

This is stack PR 3 of 3 replacing the oversized draft PR #9 for CodeRabbit review.

This PR contains the remaining feature layer:

  • composed components (cards, footer, hover-card)
  • memory-leak and composed-component test coverage
  • Story 1.1 implementation artifacts

Stack

Notes

@coderabbitai

coderabbitai Bot commented Apr 8, 2026

Copy link
Copy Markdown

Review Change Stack

Important

Review skipped

Auto incremental reviews are disabled on this repository.

Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 8beb0d04-768e-491f-8057-82a100d7ace5

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
📝 Walkthrough

Walkthrough

This PR implements Story 1.1 (Core Contract and Export Baseline) by introducing UiCardItem/UiCardList (with grid and swiper layouts), UiFooter (default and mobile), Layout (document sync), comprehensive type updates for asset resolution, and full test coverage across all new components.

Changes

Story and Specification

Layer / File(s) Summary
Story 1.1 spec artifact
specs/implementation-artifacts/1-1-core-contract-and-export-baseline.md, specs/implementation-artifacts/sprint-status.yaml
Defines contract acceptance criteria, dev notes, dev agent record, and verifies core control exports; sprint-status metadata regenerated.

Type System and Contracts

Layer / File(s) Summary
Shared asset resolution
src/types/assets.ts, src/react-app-env.d.ts, src/types/assets.d.ts
StaticImageSrc = string | { src: string } and resolveImageSrc() normalize divergent bundler/test asset imports; ambient modules updated.
Card and layout types
src/components/UiCardItem/types.ts, src/components/UiCardList/types.ts
CardType ('smallCard' | 'largeCard'), HeadingLevel, CardItem, NonEmptyCardList; UiCardItemProps and CardContentProps extend with optional headingComponent override.
Footer contract
src/components/UiFooter/types.ts
SocialMedia interface with icon: StaticImageSrc, alt, linkHref, ariaLabel.

Card Item and Services

Layer / File(s) Summary
Card constants and styles
src/components/UiCardItem/constants.ts, src/components/UiCardItem/styles.ts
Exports SMALL_CARD_ITEM, LARGE_CARD_ITEM, imageList (8 platform integrations); responsive styles for small/large wrapper, title, text, image with breakpoint tweaks (sm, md, lg, xl).
UiCardItem and CardContent
src/components/UiCardItem/index.tsx, src/components/UiCardItem/CardContent.tsx, src/components/UiCardItem/CardItem.stories.tsx
UiCardItem computes isSmallCard from item type and renders image + CardContent; CardContent renders title (heading override) and body with small-card services tooltip wrapping ServicesHoverCard.
ServicesHoverCard and ImageItem
src/components/UiCardItem/ServicesHoverCard/ServicesHoverCard.tsx, src/components/UiCardItem/ServicesHoverCard/ImageItem/ImageItem.tsx, src/components/UiCardItem/ServicesHoverCard/styles.ts
ServicesHoverCard renders translated title/text and maps imageList to ImageItem components (45x45 fixed size); styled grid layout with responsive gap override at sm.

Card List and Responsive Layout

Layer / File(s) Summary
Card list constants and types
src/components/UiCardList/constants.ts, src/components/UiCardList/types.ts
Exports LARGE_CARDLIST_ARRAY (6 items) and SMALL_CARDLIST_ARRAY (4 items); CardList interface adds optional headingComponent.
CardGrid and CardSwiper
src/components/UiCardList/CardGrid.tsx, src/components/UiCardList/CardSwiper.tsx
CardGrid renders large-screen grid (smallGrid/largeGrid styles by card type); CardSwiper renders Swiper carousel with MutationObserver tracking tooltip DOM changes to sync pointer-events: none/auto.
UiCardList responsive switcher
src/components/UiCardList/index.tsx, src/components/UiCardList/styles.ts, src/components/UiCardList/CardList.stories.tsx
UiCardList mounts CardGrid or CardSwiper based on useMediaQuery(max-width: sm - 0.02px); styles define smallGrid, gridSmallMobile, largeGrid, gridLargeMobile with Swiper pagination overrides.

Footer System

Layer / File(s) Summary
Footer constants and subcomponents
src/components/UiFooter/constants.ts, src/components/UiFooter/PrivacyPolicy/PrivacyPolicy.tsx, src/components/UiFooter/SocialMediaItem/SocialMediaItem.tsx, src/components/UiFooter/VilnaCRMEmail/VilnaCRMEmail.tsx
socialLinks constant (4 social icons); PrivacyPolicy renders two external links with env-var fallback URLs; SocialMediaItem renders icon link with localized aria-label; VilnaCRMEmail reads REACT_APP_VILNACRM_GMAIL (fallback info@vilnacrm.com).
Footer variants
src/components/UiFooter/DefaultFooter/DefaultFooter.tsx, src/components/UiFooter/Mobile/Mobile.tsx, src/components/UiFooter/UiFooter.tsx, src/components/UiFooter/styles.ts, src/components/UiFooter/Footer.stories.tsx
DefaultFooter (desktop grid layout) and Mobile (container/stack) both render logo, copyright, email, privacy links, and social icons; UiFooter uses default/adaptive styles to toggle display at md breakpoint; Storybook meta exported.

Layout and Document Sync

Layer / File(s) Summary
Layout component
src/components/Layout/index.tsx
Manages document.title and meta[name="description"] via useEffect: snapshots prior values, applies pageTitle/metaDescription when provided, restores/removes on unmount or cleanup.

Exports and Configuration

Layer / File(s) Summary
Public exports and imports
src/components/index.ts, src/components/UiCheckbox/styles.ts
Barrel exports UiCardList, UiFooter, Layout; UiCheckbox uses resolveImageSrc(Check) for icon normalization.
Jest and environment setup
jest.config.ts, src/react-app-env.d.ts, .env, .env.example
Adds swiper mock mappings (^swiper/css.*$ → style mock, ^swiper/(react|modules)$ → swiperMock.tsx); declares swiper/css and swiper/css/pagination modules; adds REACT_APP_VILNACRM_PRIVACY_POLICY_URL and REACT_APP_VILNACRM_USAGE_POLICY_URL env vars (empty defaults).
Code quality tooling
.qlty/qlty.toml
Auto-generated Qlty config with exclude patterns, test patterns, smells mode, and enabled plugins (actionlint, editorconfig-checker, eslint, prettier, ripgrep, trufflehog, zizmor).

Test Coverage

Layer / File(s) Summary
Test fixtures and mocks
tests/unit/constants.ts, tests/unit/mocks/swiperMock.tsx
Exports typed card and social-link fixtures (cardItem, smallCard, largeCard, cardList, smallCardList, largeCardList, mockedSocialLinks); swiper mock renders deterministic <div> wrappers for Swiper/SwiperSlide components.
Layout tests
tests/unit/Layout.test.tsx
Validates render order, title/meta setup, meta reuse vs. duplication, unmount restoration, and prop update re-application across mount/unmount cycles.
Card feature tests
tests/unit/ServicesHoverCard.test.tsx, tests/unit/UiCardItem.test.tsx, tests/unit/UiCardGrid.test.tsx, tests/unit/UiCardList.test.tsx, tests/unit/UiCardSwiper.test.tsx
ServicesHoverCard: title, text, image count; CardContent: large/small variants, nesting validation, heading override; CardGrid: per-item rendering, style selection; UiCardList: responsive branching; CardSwiper: slide/card counts, tooltip pointer-events sync, observer cleanup.
Footer feature tests
tests/unit/PrivacyPolicy.test.tsx, tests/unit/UiDefaultFooter.test.tsx, tests/unit/UiFooter.test.tsx, tests/unit/UiFooterEmail.test.tsx, tests/unit/UiMobile.test.tsx
PrivacyPolicy: default/override URLs; DefaultFooter: logo, copyright, year; UiFooter: footer + wrapper elements; VilnaCRMEmail: default/env email and mailto link; Mobile: container, logo, copyright, year.
Core contract and export tests
tests/unit/UiCoreContract.test.tsx, tests/unit/componentsIndex.test.ts
UiCoreContract: validates sx prop type assignability for UiButton/UiCheckbox/UiInput/UiLink, verifies MUI class selectors; componentsIndex: updated expected exports include Layout, UiCardList, UiFooter.

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

Possibly related issues

Suggested reviewers

  • cubic-dev-ai
  • Kravalg

RudoiDmytro and others added 26 commits April 8, 2026 20:17
(cherry picked from commit f8c3ff5)
- Add type annotations in storybookConfig.test.ts to satisfy
  @typescript-eslint/typedef (fixes failing static CI check).
- Move semver to devDependencies; it is only used by the dev-time
  checkNodeVersion.js script.
- Use the top-level semver import path so the eslint
  import/no-unresolved rule is satisfied.
- Replace console.error usage in build.config.mjs with
  process.stderr.write for consistency with the rest of the codebase.
- Stop swallowing localization parse failures in
  scripts/localizationGenerator.js — re-throw with file context so a
  bad locale file fails the build instead of producing partial output.
- Normalize feature_request.md headings to ## to match bug_report.md.
- Align docker-compose.yml with the VilnaCRM CRM template: add source
  bind-mount and a named node_modules volume (omit host port mappings
  to avoid collisions across local projects).
The frozen-lockfile install in Docker failed because bun.lock still
recorded semver under dependencies; refresh it so the prod/dev split
in package.json matches the lockfile.
The bind mount caused `make copy-coverage` to fail in CI with
"mkdir: permission denied" because the container writes /app/coverage
as root through the bind mount, leaving the host coverage dir
root-owned. Restore the minimal compose layout (source baked into the
image, extracted via `docker compose cp`) that the existing
Makefile/CI flow relies on.
- Wrap the SECURITY.md known-vulnerabilities paragraph so it satisfies
  the markdownlint MD013 100-char line limit.
- Switch stryker.config.mjs packageManager from "bun" to "npm" — Stryker
  only accepts npm/yarn/pnpm, and "bun" makes it abort at validation.
- Apply Prettier to scripts/localizationGenerator.js so qlty fmt passes.
- Fix boxShadow typo in UiButton disabled style
- Add rel="noopener noreferrer" default for UiLink target="_blank"
- Restore variant-to-element mapping in UiTypography
- Improve UiTooltip keyboard accessibility (role, tabIndex, key handlers)
- Fix UiToolbar 425px breakpoint overlap
- Fix UiTextFieldForm orphaned absolute positioning
- Replace unstable CSSProperties import with React's type
- Use SxProps<Theme> on UiImage/UiTooltip and stronger onClick type on UiButton
- Re-export public API from src/index.ts
- Use Playwright baseURL instead of hardcoded localhost in e2e tests
- Replace faker calls in test constants with deterministic literals
- Remove dead test fixtures referencing non-existent UiCardList/UiFooter
- Strengthen tooltip/typography test assertions; drop duplicate/no-op tests
Kills mutants in the new effect cleanup (restore-on-unmount branches and the
[metaDescription, pageTitle] dependency array). Layout mutation score 56.76 -> 91.89,
restoring the global score above the 80% break threshold.
coderabbitai[bot]
coderabbitai Bot previously approved these changes Jun 10, 2026
@RudoiDmytro

Copy link
Copy Markdown
Contributor Author

@cubic-dev-ai review

@cubic-dev-ai

cubic-dev-ai Bot commented Jun 10, 2026

Copy link
Copy Markdown

@cubic-dev-ai review

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

cubic-dev-ai[bot]
cubic-dev-ai Bot previously approved these changes Jun 10, 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.

0 issues found across 1 file (changes from recent commits).

Re-trigger cubic

Accessibility:
- CardContent: remove the nested <a> inside the tooltip role="button" trigger
  and the invalid <p>-in-<p>; "services" is now a plain inline span disclosure
  (WCAG 4.1.2), which also drops the placeholder href="/"
- UiCardItem/UiCardList: add optional headingComponent to decouple the card
  title's semantic level from its visual size (WCAG 1.3.1)
- SocialMediaItem: decorative icon now uses alt="" since the link's aria-label
  is the accessible name (WCAG 1.1.1)

Correctness / types:
- Type asset imports as `string | { src: string }` behind a shared
  resolveImageSrc helper instead of an implicit any; apply across footer,
  checkbox and card image usage
- UiCardList: gate CardGrid on !isSmallScreen so the card tree no longer
  renders twice on mobile
- CardGrid/CardSwiper: render Box instead of Grid, removing the unsafe ref cast

Config / hygiene:
- Read REACT_APP_ env vars (matching .env) instead of NEXT_PUBLIC_; document
  the policy-URL vars in .env(.example)
- Remove empty pages/_app.tsx (accidental .codex rename), drop the dead qlty
  memory-leak triage block, and clear the executable bit on source + LICENSE
- Rename VilnaCRMGmail.tsx -> VilnaCRMEmail.tsx; refresh the stale story doc
  to the actual React 19 / MUI 9 / TS 6 / Storybook 10 stack

Tests:
- Replace the tautological CardGrid style assertions with real branch checks
- Add a UiCardSwiper suite covering the MutationObserver pointer-events logic
  and observer disconnect (previously 0% function coverage)
- Guard against nested-interactive/<p> regressions and cover the heading
  override; assert CardGrid presence/absence per breakpoint in UiCardList
Comment thread src/components/UiCardList/index.tsx
Comment thread src/components/UiCardList/index.tsx Outdated
Comment thread tests/unit/UiCardItem.test.tsx
Comment thread tests/unit/UiCardItem.test.tsx Outdated
Comment thread tests/unit/UiCardItem.test.tsx Outdated
Comment thread tests/unit/UiCardSwiper.test.tsx Outdated
Resolves the unresolved qlty review comments and the failing static /
qlty fmt CI checks:
- prettier-wrap JSX ternary in UiCardList and the spyOn chain in
  UiCardItem test
- shorten two it() titles under the 100-col editorconfig limit
@RudoiDmytro

Copy link
Copy Markdown
Contributor Author

@cubic-dev-ai review

@cubic-dev-ai

cubic-dev-ai Bot commented Jun 11, 2026

Copy link
Copy Markdown

@cubic-dev-ai review

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

@RudoiDmytro

Copy link
Copy Markdown
Contributor Author

@coderabbitai review

@coderabbitai

coderabbitai Bot commented Jun 11, 2026

Copy link
Copy Markdown
✅ Action performed

Review finished.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@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: 3

🤖 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 `@src/components/Layout/index.tsx`:
- Around line 37-43: The conditional guards in the Layout component use truthy
checks for pageTitle and metaDescription which wrongly treat empty strings as
absent; change the checks to explicit undefined/null comparisons (e.g.,
pageTitle !== undefined and metaDescription !== undefined or use != null) before
assigning document.title or calling upsertMetaDescription, and apply the same
fix to the other head-related checks in this file (the block that sets/clears
meta tags and title).

In `@src/components/UiFooter/VilnaCRMEmail/VilnaCRMEmail.tsx`:
- Line 11: The component now reads the email from
process.env.REACT_APP_VILNACRM_GMAIL (assigned to the email constant), so update
your deployment/CI environment to provide REACT_APP_VILNACRM_GMAIL with the
desired address (so the fallback defaultEmailAddress isn't used), and also
replace or document the remaining NEXT_PUBLIC_VILNACRM_GMAIL reference in
docs/specs to avoid confusion; no code change required in VilnaCRMEmail.tsx
other than ensuring the env var is present at build time.

In `@tests/unit/PrivacyPolicy.test.tsx`:
- Around line 13-15: Tests are still referencing the old NEXT_PUBLIC env names;
update the test to set/restore the new REACT_APP_VILNACRM_PRIVACY_POLICY_URL and
REACT_APP_VILNACRM_USAGE_POLICY_URL env vars used by PrivacyPolicy component: in
tests/unit/PrivacyPolicy.test.tsx ensure you read/process and restore
process.env.REACT_APP_VILNACRM_PRIVACY_POLICY_URL and
process.env.REACT_APP_VILNACRM_USAGE_POLICY_URL (matching the variables used in
src/components/UiFooter/PrivacyPolicy/PrivacyPolicy.tsx) so the test lifecycle
saves originals, assigns test values, and restores them after each test.
🪄 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: 8b2abb29-fde4-4df1-bbb2-6e625462d700

📥 Commits

Reviewing files that changed from the base of the PR and between cddd03e and 4b18c48.

📒 Files selected for processing (55)
  • .env
  • .env.example
  • .qlty/qlty.toml
  • specs/implementation-artifacts/1-1-core-contract-and-export-baseline.md
  • src/components/Layout/index.tsx
  • src/components/UiCardItem/CardContent.tsx
  • src/components/UiCardItem/CardItem.stories.tsx
  • src/components/UiCardItem/ServicesHoverCard/ImageItem/ImageItem.tsx
  • src/components/UiCardItem/ServicesHoverCard/ImageItem/index.ts
  • src/components/UiCardItem/ServicesHoverCard/ServicesHoverCard.tsx
  • src/components/UiCardItem/ServicesHoverCard/index.ts
  • src/components/UiCardItem/ServicesHoverCard/styles.ts
  • src/components/UiCardItem/constants.ts
  • src/components/UiCardItem/index.tsx
  • src/components/UiCardItem/styles.ts
  • src/components/UiCardItem/types.ts
  • src/components/UiCardList/CardGrid.tsx
  • src/components/UiCardList/CardList.stories.tsx
  • src/components/UiCardList/CardSwiper.tsx
  • src/components/UiCardList/constants.ts
  • src/components/UiCardList/index.tsx
  • src/components/UiCardList/styles.ts
  • src/components/UiCardList/types.ts
  • src/components/UiCheckbox/styles.ts
  • src/components/UiFooter/DefaultFooter/DefaultFooter.tsx
  • src/components/UiFooter/DefaultFooter/index.ts
  • src/components/UiFooter/DefaultFooter/styles.ts
  • src/components/UiFooter/Footer.stories.tsx
  • src/components/UiFooter/Mobile/Mobile.tsx
  • src/components/UiFooter/Mobile/index.ts
  • src/components/UiFooter/Mobile/styles.ts
  • src/components/UiFooter/PrivacyPolicy/PrivacyPolicy.tsx
  • src/components/UiFooter/PrivacyPolicy/index.ts
  • src/components/UiFooter/PrivacyPolicy/styles.ts
  • src/components/UiFooter/SocialMediaItem/SocialMediaItem.tsx
  • src/components/UiFooter/SocialMediaItem/styles.ts
  • src/components/UiFooter/UiFooter.tsx
  • src/components/UiFooter/VilnaCRMEmail/VilnaCRMEmail.tsx
  • src/components/UiFooter/VilnaCRMEmail/index.ts
  • src/components/UiFooter/VilnaCRMEmail/styles.ts
  • src/components/UiFooter/constants.ts
  • src/components/UiFooter/index.ts
  • src/components/UiFooter/styles.ts
  • src/components/UiFooter/types.ts
  • src/components/index.ts
  • src/react-app-env.d.ts
  • src/types/assets.ts
  • tests/unit/Layout.test.tsx
  • tests/unit/PrivacyPolicy.test.tsx
  • tests/unit/UiCardGrid.test.tsx
  • tests/unit/UiCardItem.test.tsx
  • tests/unit/UiCardList.test.tsx
  • tests/unit/UiCardSwiper.test.tsx
  • tests/unit/UiFooterEmail.test.tsx
  • tests/unit/UiMobile.test.tsx
💤 Files with no reviewable changes (23)
  • src/components/UiFooter/Footer.stories.tsx
  • src/components/UiCardItem/ServicesHoverCard/ImageItem/index.ts
  • src/components/UiCardItem/ServicesHoverCard/ServicesHoverCard.tsx
  • src/components/UiCardItem/ServicesHoverCard/index.ts
  • src/components/UiFooter/PrivacyPolicy/styles.ts
  • src/components/UiFooter/styles.ts
  • src/components/UiFooter/PrivacyPolicy/index.ts
  • src/components/UiFooter/SocialMediaItem/styles.ts
  • src/components/UiFooter/Mobile/index.ts
  • src/components/UiCardItem/ServicesHoverCard/styles.ts
  • src/components/UiCardList/constants.ts
  • src/components/UiFooter/index.ts
  • src/components/index.ts
  • src/components/UiFooter/constants.ts
  • src/components/UiFooter/DefaultFooter/index.ts
  • src/components/UiFooter/UiFooter.tsx
  • .qlty/qlty.toml
  • src/components/UiCardList/CardList.stories.tsx
  • src/components/UiFooter/VilnaCRMEmail/styles.ts
  • src/components/UiCardItem/CardItem.stories.tsx
  • src/components/UiFooter/Mobile/styles.ts
  • src/components/UiCardList/styles.ts
  • src/components/UiFooter/DefaultFooter/styles.ts
✅ Files skipped from review due to trivial changes (1)
  • src/types/assets.ts
🚧 Files skipped from review as they are similar to previous changes (14)
  • tests/unit/UiMobile.test.tsx
  • src/components/UiCardList/CardGrid.tsx
  • src/components/UiCardList/index.tsx
  • tests/unit/UiCardGrid.test.tsx
  • src/components/UiFooter/VilnaCRMEmail/index.ts
  • src/components/UiCardItem/ServicesHoverCard/ImageItem/ImageItem.tsx
  • src/components/UiFooter/DefaultFooter/DefaultFooter.tsx
  • src/components/UiFooter/PrivacyPolicy/PrivacyPolicy.tsx
  • src/components/UiCardItem/index.tsx
  • src/components/UiFooter/Mobile/Mobile.tsx
  • src/components/UiFooter/types.ts
  • src/components/UiCardList/CardSwiper.tsx
  • src/components/UiCardItem/constants.ts
  • tests/unit/UiCardList.test.tsx

Comment thread src/components/Layout/index.tsx
Comment thread src/components/UiFooter/VilnaCRMEmail/VilnaCRMEmail.tsx
Comment thread tests/unit/PrivacyPolicy.test.tsx
cubic-dev-ai[bot]
cubic-dev-ai Bot previously approved these changes Jun 11, 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.

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

Re-trigger cubic

…ar in spec

Clarify that empty/blank pageTitle and metaDescription are intentionally
treated as absent (avoids blanking document.title — WCAG 2.4.2) rather than a
truthy-check oversight. Correct the lingering NEXT_PUBLIC_VILNACRM_GMAIL
reference in the story spec to the shipped REACT_APP_VILNACRM_GMAIL name.
@sonarqubecloud

Copy link
Copy Markdown

@RudoiDmytro

Copy link
Copy Markdown
Contributor Author

@cubic-dev-ai review

@cubic-dev-ai

cubic-dev-ai Bot commented Jun 12, 2026

Copy link
Copy Markdown

@cubic-dev-ai review

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

@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).

You've manually re-run cubic several times on this PR. Each manual re-review checks the full PR again and counts toward your usage quota. To preserve your usage limits, we recommend letting cubic automatically review new commits.

Re-trigger cubic

@RudoiDmytro RudoiDmytro marked this pull request as ready for review June 12, 2026 18:37
@RudoiDmytro RudoiDmytro requested a review from Kravalg as a code owner June 12, 2026 18:37
@qodo-code-review

Copy link
Copy Markdown

Qodo reviews are paused for this user.

Troubleshooting steps vary by plan Learn more →

On a Teams plan?
Reviews resume once this user has a paid seat and their Git account is linked in Qodo.
Link Git account →

Using GitHub Enterprise Server, GitLab Self-Managed, or Bitbucket Data Center?
These require an Enterprise plan - Contact us
Contact us →

@Kravalg Kravalg merged commit 7eea76a into main Jun 12, 2026
19 checks passed
@Kravalg Kravalg deleted the review-3-contract-baseline branch June 12, 2026 21:48
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.

2 participants