Skip to content

docs: add API audit checklist for token/class classification - #647

Merged
jackgranatowski merged 7 commits into
mainfrom
claude/framework-api-review-classify-3f1a2r
Jul 21, 2026
Merged

docs: add API audit checklist for token/class classification#647
jackgranatowski merged 7 commits into
mainfrom
claude/framework-api-review-classify-3f1a2r

Conversation

@jackgranatowski

@jackgranatowski jackgranatowski commented Jul 21, 2026

Copy link
Copy Markdown
Contributor

https://claude.ai/code/session_01CAsUv13o2SAi7Tnsx93EtV

Summary by CodeRabbit

  • New Features

    • Added .sf-invisible and .sf-visible utilities for visibility control without changing layout.
    • Added the --sf-color-text--subtle text token.
  • Changes

    • Replaced the old secondary text token with --sf-color-text--subtle across themes, previews, and examples.
    • Streamlined the state-class API by removing several interaction/visibility/pending-related options; updated the remaining curated state set.
    • Updated configurator panels (removed pending/flag controls, added field marker controls).
  • Documentation

    • Refreshed API/catalog counts, demos, and migration guidance for the renamed token and state-class reductions.

claude added 4 commits July 20, 2026 08:35
Add a manual-review checklist grouping the full public API surface
(747 tokens + 323 classes) into three tiers: foundation, useful-optional,
and niche. Large uniform families are grouped; per-element decisions
(classes, component variants, state hooks) are listed individually.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CAsUv13o2SAi7Tnsx93EtV
…xt--subtle

The name '--secondary' collided conceptually with the brand palette role
(--sf-color-secondary) and with its own --sf-color-text--on-secondary,
making it read as 'text in the secondary brand colour' when it actually
means de-emphasised, lower-emphasis text. Rename to --subtle, which pairs
cleanly with the existing --muted tier and carries no brand-role ambiguity.

BREAKING CHANGE: the PUBLIC token --sf-color-text--secondary is renamed to
--sf-color-text--subtle. Its value, derivation and role are unchanged.
Stable-id ledger retires id 314 (removed) and assigns id 801 to the new name.

Covers source (core/tokens.css, core/themes.css, core/macros.css), the
regenerated docs/registry/configurator artifacts, hand-written docs, the
user manual, the demo + landing page, configurator preview sources, and the
test baselines/snapshots.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CAsUv13o2SAi7Tnsx93EtV
…e-first guidance

Full audit of .sf-is-* against internal consumers, configurator exposure,
tier classification, and comparable frameworks (Open Props, Pico.css, Bulma,
Automatic.css). Three classes had no design defense and a clear native
replacement, so they're gone:

- .sf-is-hidden duplicated [hidden], which core/reset.css already hardens
  to the same `display: none !important`.
- .sf-is-readonly duplicated :read-only and incorrectly blocked text
  selection a real read-only field should allow.
- .sf-is-busy was a single cursor:progress declaration with no distinct
  visual; [aria-busy="true"] alone covers the same ground.

Everything else in the file stays: active/open/collapsed/expanded/pressed/
current are documented BEM consumer-API flags (configurator-exposed in
MiscPanel.svelte, tiered in token-tiers.js, tested), and danger/pending are
explicitly disambiguated from error/loading in docs/states.md's own
"Disambiguating the overlaps" section — none of these are the accidental
duplicates they first looked like.

Added docs/states.md § "Prefer native state": a table of native pseudo-
classes/attributes/ARIA states to reach for before adding a .sf-is-* class,
plus the removed three as the worked precedent.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CAsUv13o2SAi7Tnsx93EtV
…te visibility helpers

Second pass on .sf-is-* after holding the six previously-defended survivors
(active, open, collapsed, expanded, pressed, current, danger, pending) to a
stricter bar: "documented and intentional" is a different question from
"needed at this stage of a pre-1.0, lean framework." None of them clear
"most consumers need this today":

- .sf-is-active/.sf-is-open/.sf-is-collapsed/.sf-is-pressed/.sf-is-current
  only ever set an inheritable --sf-is-* custom property for a hypothetical
  consumer's own calc() to branch on, with zero consumers anywhere in this
  codebase or in any of the four comparable frameworks surveyed (Open Props,
  Pico.css, Bulma, Automatic.css ship nothing like it).
- .sf-is-expanded was pure vocabulary duplication of .sf-is-open (identical
  rule, no distinct behaviour).
- .sf-is-danger had a live correctness bug (only ever worked on form fields
  via --sf-field-*, never the "destructive-action button" case its own docs
  described) and duplicated .sf-is-invalid/.sf-is-error's implementation.
- .sf-is-pending was two lines cheap to hand-roll, with .sf-is-loading
  already covering the common "mask with a spinner" case.

All eight removed, along with the now-orphaned --sf-is-active/-current/
-pressed/-open @Property registrations and the --sf-current-font-weight /
--sf-state-pending-opacity tokens that lost their only consumer.

.sf-is-invisible/.sf-is-visible were relocated, not cut: single-property
helpers with no runtime condition of their own (unlike .sf-is-selected,
which paints something), moved to optional/utilities.css as .sf-invisible/
.sf-visible — matching Bulma's precedent of treating visibility as a
helper, not a state.

demo/index.html's own mobile-nav drawer used .sf-is-open as a plain
JS-toggled hook (its own #nav-overlay/#demo-nav rules, independent of
states.css's flag mechanism) — renamed to a demo-local .is-open class,
which doubles as a worked example of "write your own toggle class"
guidance. user-manual/system-kolorow.md's stepper example updated the
same way.

Added docs/states.md § "Prefer native state" with a table of native
pseudo-classes/attributes/ARIA states to reach for before adding a
.sf-is-* class, and a documented history of both removal rounds.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CAsUv13o2SAi7Tnsx93EtV
@coderabbitai

coderabbitai Bot commented Jul 21, 2026

Copy link
Copy Markdown

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 1ad51ded-fc91-4dc8-b99e-80419891e542

📥 Commits

Reviewing files that changed from the base of the PR and between 655755f and f82bb9b.

⛔ Files ignored due to path filters (1)
  • package-lock.json is excluded by !**/package-lock.json
📒 Files selected for processing (6)
  • core/macros.css
  • core/themes.css
  • docs/llm-guide.md
  • docs/macros.md
  • docs/migration.md
  • docs/roadmap.md
🚧 Files skipped from review as they are similar to previous changes (5)
  • core/macros.css
  • core/themes.css
  • docs/macros.md
  • docs/roadmap.md
  • docs/llm-guide.md

📝 Walkthrough

Walkthrough

The PR renames the secondary text token to subtle, removes deprecated state tokens and classes, adds visibility utilities, and updates core CSS, configurator, demos, generated catalogs, documentation, registries, and tests.

Changes

API consolidation

Layer / File(s) Summary
Core tokens, states, and utilities
core/*.css, optional/utilities.css, scripts/*
Text token definitions are renamed, deprecated state tokens and classes are removed, and .sf-invisible/.sf-visible utilities are added.
Configurator, demos, and examples
configurator/src/..., demo/index.html, index.html, user-manual/*
Preview controls, WCAG mappings, examples, mobile navigation, and gallery coverage use the revised tokens and state classes.
API catalogs and documentation
docs/*, README.md, badges/*, token-registry.json
Generated inventories, counts, tier metadata, audit notes, migration guidance, and registry history reflect the updated API.
Tests and baselines
tests/*
State coverage, accessibility fixtures, visual checks, token snapshots, and browser baselines are updated for the revised contracts.

Estimated code review effort: 4 (Complex) | ~45 minutes

Possibly related PRs

Suggested labels: codex

Suggested reviewers: claude

🚥 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
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title accurately summarizes the main change: adding an API audit checklist for token and class classification.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch claude/framework-api-review-classify-3f1a2r

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.

@greptile-apps

greptile-apps Bot commented Jul 21, 2026

Copy link
Copy Markdown

Greptile Summary

This PR audits and reduces the framework's public token and state-class API. The main changes are:

  • Renames the secondary text token to --sf-color-text--subtle.
  • Removes several state classes and related custom properties.
  • Moves renamed visibility helpers into optional utilities.
  • Updates generated indexes, docs, demos, configurator data, and tests.

Confidence Score: 4/5

Published CSS APIs can silently stop styling existing consumer interfaces after an upgrade.

  • The renamed text token has no compatibility alias.
  • The optimal bundle loses both the old and replacement visibility helpers.
  • Removed state classes become no-ops in existing markup and JavaScript.

core/tokens.css, core/states.css, and optional/utilities.css

Important Files Changed

Filename Overview
core/tokens.css Renames a public text token and removes public state-related tokens.
core/states.css Removes published state behavior and relocates visibility helpers outside the optimal bundle.
optional/utilities.css Adds the renamed visibility helpers to the optional utility layer.
scripts/check-macro-catalog.js Updates the macro catalog exclusion consistently with the removed class.
scripts/token-tiers.js Removes deleted state tokens from the advanced-tier list.
demo/index.html Updates demo selectors, JavaScript toggles, token examples, and API coverage data.
configurator/src/components/panels/MiscPanel.svelte Removes controls for deleted state tokens and keeps the field marker control.

Reviews (1): Last reviewed commit: "refactor(states)!: remove speculative in..." | Re-trigger Greptile

Comment thread core/tokens.css
Comment on lines +444 to 447
--sf-color-text--subtle: light-dark(
oklch(from var(--sf-color-neutral-source-light) clamp(0.15, calc(l - 0.25 - var(--sf-contrast-bias)), 0.45) c h),
oklch(from var(--sf-color-neutral) clamp(0.55, calc(l + 0.1 + var(--sf-contrast-bias)), 0.90) c h)
);

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P1 Public Text Token Stops Resolving

Existing consumer rules using var(--sf-color-text--secondary) become invalid after this rename because the old public token is no longer defined. Those elements fall back to an inherited or initial color instead of the secondary text color.

Suggested change
--sf-color-text--subtle: light-dark(
oklch(from var(--sf-color-neutral-source-light) clamp(0.15, calc(l - 0.25 - var(--sf-contrast-bias)), 0.45) c h),
oklch(from var(--sf-color-neutral) clamp(0.55, calc(l + 0.1 + var(--sf-contrast-bias)), 0.90) c h)
);
--sf-color-text--subtle: light-dark(
oklch(from var(--sf-color-neutral-source-light) clamp(0.15, calc(l - 0.25 - var(--sf-contrast-bias)), 0.45) c h),
oklch(from var(--sf-color-neutral) clamp(0.55, calc(l + 0.1 + var(--sf-contrast-bias)), 0.90) c h)
);
--sf-color-text--secondary: var(--sf-color-text--subtle);

Context Used: CLAUDE.md (source)

Comment thread core/states.css
Comment on lines +18 to +23
/* No visibility classes here: .sf-is-hidden duplicated [hidden] (removed —
core/reset.css hardens that attribute identically). .sf-invisible /
.sf-visible moved to optional/utilities.css as single-property helpers
(same call as Bulma's is-hidden/is-invisible living under "helpers",
not component/state docs) — still the hook docs/roadmap.md's
reveal-on-scroll pattern targets, just renamed and relocated. */

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P1 Optimal Bundle Loses Visibility Helpers

The old visibility classes were available through core/states.css, but their renamed replacements now exist only in optional/utilities.css, which the supported slashed/optimal entry point does not include. After upgrading, optimal-bundle consumers get no hiding behavior from either their existing .sf-is-invisible class or the new .sf-invisible class unless they add another stylesheet.

Context Used: CLAUDE.md (source)

Comment thread core/states.css
Comment on lines 94 to +101

/* -- ACTIVE / SELECTED / CURRENT -- */

.sf-is-active {

--sf-is-active: 1;
}
/* -- SELECTED / HIGHLIGHTED --
No .sf-is-active / .sf-is-open / .sf-is-collapsed / .sf-is-expanded /
.sf-is-current / .sf-is-pressed here: these only ever set an
inheritable --sf-is-* custom property for a hypothetical consumer
calc() to branch on, with zero consumer anywhere in this codebase or
its demo. Speculative "might be useful one day" surface, removed —
see docs/states.md § "Prefer native state". Reach for [aria-current],

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P1 State Hooks Silently Stop Updating

Existing components that toggle .sf-is-active, .sf-is-current, .sf-is-open, .sf-is-pressed, .sf-is-collapsed, or .sf-is-expanded still change their DOM classes, but this removal no longer updates the corresponding inherited state property or visual state. Navigation, toggle, and disclosure UI built against these published classes can therefore stop reflecting its current state after an upgrade.

Context Used: CLAUDE.md (source)

Comment thread core/states.css
Comment on lines +69 to +73
/* No .sf-is-busy / .sf-is-pending here: both were a couple of
property-value declarations (cursor:progress, plus opacity for
pending's "optimistic UI" dimming) with no consumer and no native gap
they filled — [aria-busy="true"] covers the semantic, and the visual
is two lines to hand-roll in your own component CSS if you want it. */

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P1 Async Feedback Classes Become No-Ops

Consumers that apply the published .sf-is-busy or .sf-is-pending classes during an in-flight request now get neither the progress cursor nor pending opacity. The request still runs, but the user loses the only framework-provided visual indication that the action is being processed.

Context Used: CLAUDE.md (source)

Comment thread core/states.css
Comment on lines 112 to +119
}

.sf-is-pressed {

--sf-is-pressed: 1;
background-color: var(--sf-color-bg--selected);
}

/* -- OPEN / CLOSED -- */

.sf-is-open {
--sf-is-open: 1;
}

.sf-is-collapsed {
--sf-is-open: 0;
}

.sf-is-expanded {
--sf-is-open: 1;
}

/* -- VALIDATION / FEEDBACK -- */
/* -- VALIDATION / FEEDBACK --
No .sf-is-danger here: identical implementation to .sf-is-invalid/
.sf-is-error (both only ever wrote --sf-field-*, so it never worked as
the "destructive-action context" its own docs described outside a form
field) and, per docs/migration.md, visual variants belong in your own
component CSS anyway. Use .sf-is-invalid/.sf-is-error, or your own

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P1 Danger State Loses Field Styling

Existing validation or destructive UI using .sf-is-danger no longer sets --sf-field-border-color and --sf-field-text-color. Those elements silently revert to their normal colors, so an error or destructive state can appear neutral after an upgrade.

Context Used: CLAUDE.md (source)

Comment thread core/states.css
Comment on lines +25 to 31
/* -- INTERACTIVITY --
No .sf-is-readonly here: it duplicated :read-only for real form controls,
and its pointer-events:none blocked text selection that a genuinely
read-only field should still allow — reach for :read-only, or
[aria-readonly] on a non-native widget, instead. */

/* cursor: not-allowed inherits to children with pointer-events: auto —

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P1 Legacy Hidden State Becomes Visible

An existing element using .sf-is-hidden is no longer removed from layout because this PR deletes the class without a compatibility rule. On upgrade, content previously hidden by the framework can become visible until each consumer migrates its markup to the native hidden attribute.

Context Used: CLAUDE.md (source)

@coderabbitai coderabbitai Bot added the codex label Jul 21, 2026
…review-classify-3f1a2r

# Conflicts:
#	docs/llm-guide.md

Copy link
Copy Markdown
Contributor Author

Re: the Greptile P1 findings on core/states.css/core/tokens.css (state hooks becoming no-ops, .sf-is-hidden/.sf-is-danger/.sf-is-busy/.sf-is-pending losing their effect, the visibility helpers moving out of the optimal bundle, and --sf-color-text--secondary losing its resolution) — these are all correctly identified, and all intentional. This PR is a deliberate reduction of the pre-1.0 .sf-is-* API and one token rename, not a regression:

  • State flags removed (active/open/collapsed/expanded/pressed/current): each only ever set an inheritable custom property with zero consumers in this codebase or in any comparable framework surveyed (Open Props, Pico.css, Bulma, Automatic.css) — see the commit message and docs/states.md § "Prefer native state" for the full rationale per class.
  • .sf-is-hidden/.sf-is-busy/.sf-is-danger/.sf-is-pending removed: each duplicated a native mechanism ([hidden], [aria-busy], :read-only) or had no distinct behavior worth the maintenance cost — also covered in docs/states.md.
  • .sf-invisible/.sf-visible relocated (not dropped) to optional/utilities.css, matching Bulma's precedent that visibility is a helper, not a runtime state.
  • --sf-color-text--secondary--sf-color-text--subtle: a deliberate rename, not aliased on purpose — an alias would have perpetuated the exact naming collision (with the brand-palette secondary role) that motivated the rename.

No compatibility shims were omitted by oversight — for a pre-1.0 framework we're trading a clean break now against carrying speculative/duplicate surface area indefinitely. Happy to discuss further if there's a case for keeping any specific one, but no code changes planned from these six comments.


Generated by Claude Code

…(deps): bump js-yaml 4.2.0 → 4.3.0

Migration guide entries for this branch's two breaking changes: the
--sf-color-text--secondary → --sf-color-text--subtle rename, and the
.sf-is-* state-class reduction (11 removed, 2 relocated to
optional/utilities.css, 6 now-orphaned tokens removed alongside).
Satisfies the "Check migration docs for breaking changes" CI gate.

js-yaml bump resolves GHSA-52cp-r559-cp3m (quadratic CPU via YAML
merge-key chains), a transitive dependency of stylelint -> cosmiconfig
already present on main — unrelated to this branch's changes, fixed via
plain `npm audit fix` (no --force, same major, lockfile-only).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CAsUv13o2SAi7Tnsx93EtV

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

🧹 Nitpick comments (2)
docs/macros.md (1)

382-382: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Align the value assignment.

Adding a few spaces before oklch will align this value with the other token definitions in this block.

✨ Proposed fix
-    --sf-color-text--subtle:   oklch(from var(--my-fg) l c h / 0.70);
+    --sf-color-text--subtle:      oklch(from var(--my-fg) l c h / 0.70);
🤖 Prompt for 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.

In `@docs/macros.md` at line 382, Align the value assignment for
--sf-color-text--subtle with the other token definitions by adding the necessary
spaces before the oklch expression.
docs/llm-guide.md (1)

221-221: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Align the trailing comment.

Adding a few spaces here will align this comment with the adjacent tokens for a cleaner look.

✨ Proposed fix
- --sf-color-text--subtle  /* Between muted and primary */
+ --sf-color-text--subtle     /* Between muted and primary */
🤖 Prompt for 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.

In `@docs/llm-guide.md` at line 221, Update the trailing comment on
--sf-color-text--subtle by adding the necessary spacing before the comment so it
aligns with the adjacent token comments. Preserve the variable and comment text
unchanged.
🤖 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.

Nitpick comments:
In `@docs/llm-guide.md`:
- Line 221: Update the trailing comment on --sf-color-text--subtle by adding the
necessary spacing before the comment so it aligns with the adjacent token
comments. Preserve the variable and comment text unchanged.

In `@docs/macros.md`:
- Line 382: Align the value assignment for --sf-color-text--subtle with the
other token definitions by adding the necessary spaces before the oklch
expression.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: d2a3c854-d76a-49af-9843-695cc5aaaa2d

📥 Commits

Reviewing files that changed from the base of the PR and between cffabe5 and 655755f.

⛔ Files ignored due to path filters (4)
  • configurator/src/data/api-index.generated.json is excluded by !**/*.generated.*
  • configurator/src/data/classes.generated.json is excluded by !**/*.generated.*
  • configurator/src/data/token-registry.generated.json is excluded by !**/*.generated.*
  • dist/css-custom-data.json is excluded by !**/dist/**
📒 Files selected for processing (42)
  • README.md
  • badges/badge-optimal.json
  • configurator/src/components/panels/EffectsPanel.svelte
  • configurator/src/components/panels/MiscPanel.svelte
  • configurator/src/components/panels/WcagPanel.svelte
  • configurator/src/data/domain-patterns.json
  • configurator/src/lib/preview/sections.ts
  • configurator/src/lib/preview/skin.ts
  • core/macros.css
  • core/states.css
  • core/themes.css
  • core/tokens.css
  • demo/index.html
  • docs/api-audit-checklist.md
  • docs/api-index.json
  • docs/api-index.md
  • docs/architecture.md
  • docs/classes.md
  • docs/llm-guide.md
  • docs/macros.md
  • docs/ref-allowlist.json
  • docs/registry.json
  • docs/roadmap.md
  • docs/states.md
  • docs/theming.md
  • docs/token-annotations.json
  • docs/token-index.json
  • docs/token-index.md
  • docs/tokens.md
  • index.html
  • optional/utilities.css
  • scripts/check-macro-catalog.js
  • scripts/token-tiers.js
  • tests/a11y-fixture.html
  • tests/baseline-modern.json
  • tests/behavior.spec.js
  • tests/demo-visual.spec.js
  • tests/states-full.spec.js
  • tests/tier1-p8-modern.spec.js
  • tests/token-api.snapshot.json
  • token-registry.json
  • user-manual/system-kolorow.md
💤 Files with no reviewable changes (5)
  • configurator/src/data/domain-patterns.json
  • scripts/check-macro-catalog.js
  • scripts/token-tiers.js
  • configurator/src/components/panels/EffectsPanel.svelte
  • tests/demo-visual.spec.js

…umns

Addresses two CodeRabbit nitpicks: the rename from --secondary to
--subtle left the value/comment column misaligned in docs/macros.md's
customize-example and docs/llm-guide.md's token list.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CAsUv13o2SAi7Tnsx93EtV
@jackgranatowski

Copy link
Copy Markdown
Contributor Author

@coderabbitai review

@coderabbitai

coderabbitai Bot commented Jul 21, 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.

@jackgranatowski
jackgranatowski merged commit 7eca696 into main Jul 21, 2026
13 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants