Skip to content

feat(ui)!: isolate components with Shadow DOM - #473

Open
abharms wants to merge 54 commits into
mainfrom
journey-to-the-shadow-dom
Open

abharms wants to merge 54 commits into
mainfrom
journey-to-the-shadow-dom

Conversation

@abharms

@abharms abharms commented Nov 4, 2026 •

Copy link
Copy Markdown
Collaborator

Summary

  • automatically isolate the public React UI component surfaces in open Shadow DOM roots so consuming-app global CSS cannot distort SDK rendering
  • add the shared shadow host, local stylesheet delivery, shadow-aware dialog and popover portals, focus handling, event de-duplication, SSR/hydration behavior, and composed-component reuse needed for the rollout
  • cover authentication, pickers, leaf components, Scripture presentation, theme settings, verse actions, and the Bible Reader while preserving their public component APIs
  • document the rollout policy, consumer compatibility contract, architectural decision, release boundaries, and operational validation

Why

Consumer styles currently share the document cascade with SDK components. That makes otherwise valid application CSS capable of changing SDK typography, spacing, layout, controls, and overlays. This rollout creates an SDK-owned styling boundary while preserving the supported theme, direction, callback, ref, and interaction contracts.

Compatibility and release impact

This is a coordinated major UI release. In particular:

  • component internals move behind open shadow roots, so document-level selectors and ordinary document queries no longer reach them
  • overlays are rendered into the owning shadow scope
  • SDK custom properties remain governed by the documented contract; undeclared consumer properties are not ambient inputs
  • the documented client-only SSR/hydration first-paint behavior is intentional
  • native events remain retargeted at the host across the boundary
  • supported and unsupported form, label, ARIA, automation, font, and assistive-technology relationships are captured in the compatibility documentation

See:

Validation

The feature branch was assembled through focused, reviewed pull requests. Its recorded validation includes:

  • unit and SSR/hydration coverage for host lifecycle, stylesheet installation and recovery, refs, events, focus, portals, composition, and public behavior
  • hostile-CSS and realistic-consumer Storybook journeys in Chromium, Firefox, and Playwright WebKit
  • actual Safari release-candidate validation, including picker spacing, focus, layout, and overlay behavior
  • Safari + VoiceOver validation for the documented release-candidate journeys
  • custom-property contract enforcement against the compiled stylesheet
  • build, lint, type, changeset, and bundle-size coverage through CI

Windows/NVDA and other unlisted assistive-technology combinations remain explicitly unvalidated, as documented.

Related work

YPE-4113 and the coordinated Shadow DOM rollout tickets linked from the rollout policy.

RetriggerView in GreptileConfidence Score: 5/5

The PR appears safe to merge with its documented breaking-change contract.

Summary

The PR moves compatible public UI components into open Shadow DOM roots and documents the coordinated breaking release.

  • Selected public components render inside SDK-owned shadow roots.
  • Dialogs and popovers open inside their owning shadow root.
  • The major UI release documents the new Shadow DOM compatibility boundary.

This review was source-only. Tests and browser journeys were not run.

Diagram

%%{init: {'theme': 'neutral'}}%%
flowchart TD
  App[Consumer app] --> Provider[YouVersionProvider]
  Provider --> Fonts[Document styles and fonts]
  Provider --> Boundary[Public component boundary]
  Boundary --> Host[Open shadow root]
  Host --> Styles[Shared SDK stylesheet]
  Host --> Content[Component content]
  Content --> Reuse[SDK children reuse the boundary]
  Host --> Overlay[Shadow-local overlay container]
  Overlay --> TopLayer[Native top layer when open]
Loading

Reviews (3) · Last reviewed commit: "test(ui): query publisher story in shado..." · Reviewed by Greptile

cameronapak and others added 30 commits August 19, 2026 12:50
* feat(ui)!: prototype automatic Shadow DOM isolation

* docs(examples): add hostile CSS POC demo

* docs(examples): clarify hostile CSS vectors

* docs(ui): align shadow DOM prototype ADR

* test(ui): strengthen shadow isolation proof

* refactor(ui): remove shadow isolation type assertions

* fix(ui): block hostile shadow host pseudo-elements

* docs(ui): clarify shadow isolation trade-offs

* test(ui): align shadow isolation demo conventions

* docs(examples): keep hostile demo labels readable

* fix(ui): use style precedence for shadow fallback stylesheet

Addresses PR review feedback: the non-adoptedStyleSheets fallback
rendered a bare <style> tag inside the shadow-root portal. Use
React 19's <style href precedence> resource form instead so React
hoists and de-duplicates the stylesheet within the shadow root
rather than risking duplicate insertion.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>

---------

Co-authored-by: abharms <aharms@works24.com>
Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
* feat(ui): prototype shadow-local top-layer popovers

* fix(ui): reconcile shadow portal strategy changes

* fix(ui): narrow shadow portal spike scope

* fix(ui): harden shadow portal lifecycle

---------

Co-authored-by: abharms <aharms@works24.com>
* feat(ui): validate shadow DOM dialog top layer

* docs(ui): separate shadow DOM rollout plan

* refactor(ui): simplify shadow dialog coordination

* test(ui): prove shadow dialog escapes clipping

* refactor(ui): tighten shadow dialog portal behavior

---------

Co-authored-by: abharms <aharms@works24.com>
* fix(ui): harden Shadow DOM CSS isolation

* test(ui): cover InputGroup SDK radius token

* test(ui): align input group radius assertion

---------

Co-authored-by: abharms <aharms@works24.com>
* fix(ui): route verse actions through shadow portals

* style(ui): use logical overflow in shadow story

* fix(ui): address verse action popover review feedback

---------

Co-authored-by: abharms <aharms@works24.com>
* test(ui): validate shadow consumer compatibility (YPE-5436)

* test(ui): strengthen shadow compatibility evidence (YPE-5436)

* test(ui): await shadow content rendering (YPE-5436)

* docs(ui): qualify shadow automation guidance (YPE-5436)

* docs(ui): clarify shadow compatibility stories (YPE-5436)

* docs(ui): tighten shadow rollout research handoff (YPE-5436)

* test(ui): remove instructional copy assertions

* test(ui): address YPE-5436 review feedback

---------

Co-authored-by: abharms <aharms@works24.com>
)

* test(ui): prove nested overlays through the production shadow seam

Exercise YPE-5355 nested and concurrent overlay scenarios against the real ShadowRootHost + Radix path, without adding an ownership registry.

* fix(ui): restore shadow dialog focus after a rapid reopen

The production seam handled nested and concurrent overlays without a new ownership registry. Rapid reopen during exit captured the outgoing overlay as the restore target; skip portal-container nodes and fall back to the last wrapper control.

* test(ui): add static Storybook frames for the production overlay seam

Leave the ticket scenarios on screen so the production VerseActionPopover, permission dialog, nested popover, and independent overlays can be inspected without racing the play function.

* test(ui): finalize YPE-5355 overlay evidence

* docs: keep overlay proof evidence-only

---------

Co-authored-by: Cursor Agent <cursoragent@cursor.com>
Co-authored-by: abharms <aharms@works24.com>
* fix(ui): address shadow DOM review regressions

* test(ui): strengthen touch interaction coverage

* test(ui): wait for placement before measuring touch reanchoring

---------

Co-authored-by: abharms <aharms@works24.com>
* fix(ui): enforce custom property contract

* refactor(ui): clarify CSS contract validation

* docs(ui): clarify completed CSS audit step

* test(ui): strengthen custom property contract coverage

* refactor(ui): simplify custom property exceptions
* test(ui): prove shadow DOM hydration contract

* test(ui): strengthen shadow DOM hydration evidence

* docs: tighten shadow DOM hydration decision

* test(ui): prove iframe shadow styles apply
* test(ui): validate realistic Shadow DOM usage

* test(ui): prove Strict Mode effect replay

* fix(ui): make Strict Mode story environment-aware
* fix(ci): unblock journey pull requests

* fix(ci): scope stacked release previews

* test(ci): exercise stacked release preview behavior
)

* fix(ui): restore focus after rapid shadow dialog reopen

YPE-5889

* fix(ui): reset prevented shadow focus restoration

YPE-5889

* chore: retrigger upstream checks

YPE-5889

* fix(ui): preserve document focus restoration

YPE-5889

* test(ui): prove cross-document focus rejection

YPE-5889

* test(ui): mock provider font stylesheet globally

* fix(ui): reject moved shadow focus targets

* docs: clarify pre-rollout shadow focus scope

* fix(ui): preserve shadow dialog focus ownership

* test(ui): cover overlay-only dialog reopen

* docs(ui): correct rapid reopen lifecycle
* test(ui): consolidate Storybook DOM wait helpers

* test(ui): preserve shadow root wait timing

* test(ui): mock font stylesheet in Storybook
* test(ui): add cross-browser shadow DOM coverage

* test(ui): stabilize Firefox story readiness

* fix(ci): stabilize shadow browser jobs

* test(ui): make overlay exit ordering deterministic

* test(ui): await Storybook assertions

* fix(ci): avoid Firefox matcher teardown rejections

* test(ui): await shadow browser assertions

* test(ui): stabilize shadow browser timing

* test(ui): consume shadow story wait promises

* test(ui): avoid matcher promises in shadow stories

* fix(ui): handle language sync rejections

* test(ui): log browser unhandled rejection details

* test(ui): ignore expected font load events in firefox

* test(ui): filter firefox stylesheet load events

* test(ui): ignore browser events in lifecycle assertion

* test(ui): narrow font rejection filter

* test(ui): harden shadow DOM cross-browser evidence

* fix(ui): preserve shadow picker spacing in Safari

* fix(ui): preserve document-root spacing in Safari

* test(ui): cover spacing fixes cross-browser

* test(ui): reuse Storybook wait helper
* docs(ui): define Shadow DOM rollout policy

Reconcile YPE-5356 research into a coordinated package-wide rollout plan and focused implementation tickets.

* docs(ui): simplify rollout policy ownership

Keep the production policy authoritative and remove stale or overly broad dependency language found during the YPE-5356 simplification audit.

* docs(ui): clarify pending rollout evidence

Complete the public provider inventory and distinguish YPE-5946 branch results from browser coverage already present on YPE-5356.

* docs(ui): reconcile Shadow DOM rollout evidence

* docs(ui): keep rollout policy authoritative

* docs(ui): correct rollout compatibility status
* feat(ui): harden shadow boundary foundation

Refs: YPE-5947

* test(ui): consolidate shadow stylesheet failures

Refs: YPE-5947

* test(ui): prove shadow recovery across documents

Refs: YPE-5947

* test(ui): assert document-scoped shadow stylesheet
…-dom

# Conflicts:
#	.github/workflows/major-release-signoff.yml
* feat(ui): harden shadow boundary foundation

Refs: YPE-5947

* test(ui): consolidate shadow stylesheet failures

Refs: YPE-5947

* test(ui): prove shadow recovery across documents

Refs: YPE-5947

* test(ui): assert document-scoped shadow stylesheet

* feat(ui): isolate Bible pickers in Shadow DOM (YPE-5949)

* test(ui): deduplicate picker portal evidence (YPE-5949)

* test(ui): strengthen picker boundary evidence (YPE-5949)

* test(ui): stabilize chapter picker search journey (YPE-5949)

* test(ui): keep picker search proof deterministic (YPE-5949)

* test(ui): await picker data before search (YPE-5949)

* test(ui): isolate picker journey data (YPE-5949)

* test(ui): preserve picker initial state coverage (YPE-5949)

* test(ui): avoid dynamic picker height assertion (YPE-5949)

* docs(ui): align picker rollout records (YPE-5949)

* docs(ui): include reader search in Shadow DOM rollout

* docs(ui): refresh Shadow DOM evidence guidance
* feat(ui): isolate leaf components (YPE-5948)

* test(ui): close leaf isolation review gaps

* chore(ui): account for leaf isolation bundle cost

* fix(ui): preserve leaf host and theme contracts

* fix(ui): preserve explicit shadow themes

* chore(ui): allow bundle measurement variance

* fix(ui): preserve isolated leaf borders

* docs(ui): tighten shadow rollout guidance

* test(ui): remove redundant avatar story plays

* fix(ui): inherit provider theme in footnotes

* fix(ui): address shadow isolation review feedback
The replacement-failure recovery test passed even when the SDK sheet was
cached before replaceSync, which would leave later roots unstyled. Assert
that the recovered root adopts a populated sheet.

Also explain why the picker search inputs use onInput and why two picker
stories clear search with fireEvent.input inside shadow roots.

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
* feat(ui): isolate leaf components (YPE-5948)

* test(ui): close leaf isolation review gaps

* chore(ui): account for leaf isolation bundle cost

* fix(ui): preserve leaf host and theme contracts

* fix(ui): preserve explicit shadow themes

* chore(ui): allow bundle measurement variance

* fix(ui): preserve isolated leaf borders

* docs(ui): tighten shadow rollout guidance

* test(ui): remove redundant avatar story plays

* fix(ui): inherit provider theme in footnotes

* fix(ui): address shadow isolation review feedback

* feat(ui): isolate theme settings content (YPE-5994)

* refactor(ui): simplify theme settings evidence (YPE-5994)

* test(ui): close theme settings review gaps (YPE-5994)

* fix(ui): preserve constrained settings layout (YPE-5994)

* fix(ui): finalize settings host strategy (YPE-5994)

* fix(ui): address shadow layout review findings

* test(ui): make future reader boundary test falsifiable (YPE-5994)

Render the reader directly in the simulated boundary so the test fails
if the Toolbar stops reusing it for settings.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* fix(ui): preserve popover keyboard navigation across shadow roots

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
abharms and others added 21 commits October 1, 2026 08:55
* feat(ui): isolate scripture presentation components (YPE-5950)

* test(ui): simplify scripture isolation coverage

* fix(ui): preserve scripture boundary compatibility (YPE-5950)

* fix(ui): latch card highlights before isolation (YPE-5950)

* test(ui): stabilize scripture browser fixtures (YPE-5950)

* test(ui): consolidate scripture browser coverage

* test(ui): preserve scripture browser interactions

* fix(ui): reconcile scripture shadow review (YPE-5950)
* feat(ui): isolate Bible reader (YPE-5951)

Give BibleReader.Root one automatic shadow boundary, reuse it for reader-owned composition, and preserve focused reader/search behavior across the supported browser matrix.

* test(ui): simplify reader isolation evidence (YPE-5951)

* fix(ui): harden reader isolation evidence (YPE-5951)

* test(ui): stabilize reader search browser wait (YPE-5951)

* fix(ui): preserve reader external focus (YPE-5951)

* test(ui): scope reader search browser evidence (YPE-5951)

* fix(ui): keep reader focus handoff private (YPE-5951)

* test(ui): restore reader search focus journey (YPE-5951)

* test(ui): focus reader search boundary evidence (YPE-5951)

* fix(ui): restore reader pointer-time focus (YPE-5951)

* test(ui): await reader search destination (YPE-5951)

* test(ui): fixture reader search passages (YPE-5951)

* fix(ui): discard transient focus targets (YPE-5951)

* refactor(ui): clarify reader focus ownership (YPE-5951)

* style(ui): align reader hook imports (YPE-5951)

* docs: align reader isolation evidence (YPE-5951)
* fix(ui): deduplicate shadow ancestor events

* test(ui): simplify shadow event evidence

* fix(ui): preserve repeated native event dispatch

* fix(ui): identify duplicate shadow traversal

* test(ui): prove shadow delivery per event

* docs: clarify remaining shadow event duplication

* test(ui): allow slower browser story readiness

* test(ui): wait for picker data before browser interaction

* test(ui): isolate picker browser fixtures

* docs: clarify shadow event rollout disposition
…-dom

# Conflicts:
#	.github/workflows/major-release-signoff.yml
#	packages/ui/src/components/bible-reader.tsx
* fix(ui): deduplicate shadow blur events (YPE-6135)

* test(ui): cover repeated and nested shadow blur (YPE-6135)

* docs: note repeated blur cycles in shadow evidence (YPE-6135)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* test(ui): strengthen shadow blur evidence

* test(ui): preserve focusout duplicate detection

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
* fix(ui): deduplicate shadow ancestor events

* test(ui): simplify shadow event evidence

* fix(ui): preserve repeated native event dispatch

* fix(ui): identify duplicate shadow traversal

* test(ui): prove shadow delivery per event

* docs: clarify remaining shadow event duplication

* test(ui): allow slower browser story readiness

* test(ui): wait for picker data before browser interaction

* test(ui): isolate picker browser fixtures

* docs: clarify shadow event rollout disposition

* feat(ui): prepare coordinated shadow dom release

* fix(ui): harden shadow release validation

* docs: record shadow release candidate evidence

* fix(ui): preserve shadow release compatibility

* fix(ui): recover stale Safari automation sessions

* fix(ui): bound Safari transport recovery

* docs: record final Safari release evidence

* fix(ui): preserve version picker opening focus

* docs: record final focus validation evidence

* fix(ui): close accessibility validation gaps

* docs: record final accessibility validation evidence

* test(ui): clarify signed-in reader journey

* docs: record VoiceOver release evidence

* docs: record NVDA validation gap

* test(ui): wait for WebKit picker visibility

* docs: add coordinated shadow rollout changeset

* fix(ui): preserve Safari runner timeouts

* docs: complete shadow rollout release notes

* test(ui): harden shadow rollout validation

* test(ui): stabilize shadow story timing

* fix(ui): announce picker focus in Safari (#445)

* fix(ui): announce picker focus in Safari

* test(ui): cover delayed picker focus guards

* fix(ui): refocus rapidly reopened pickers

* docs: record final Safari picker evidence

* fix(ui): focus chapter picker on first mount

* docs: reconcile final Safari picker evidence
# Conflicts:
#	packages/ui/src/components/bible-reader-search.stories.tsx
#	packages/ui/src/components/bible-reader.tsx
#	packages/ui/src/components/verse-action-popover.tsx
* fix(ui): deduplicate shadow styles

* fix(ui): preserve component CSS audit

* docs(ui): record Safari stylesheet validation

* test(ui): verify reader selection rule

* chore(ui): align bundle size budget

* chore(ui): preserve bundle budget headroom

* docs(ui): clarify Safari validation evidence

* test(ui): await reader focus restoration

* fix(ui): preserve styles across external portals

* test(ui): assert shadow styles stay out of head

* chore(ui): clarify style checks and waits

* docs(ui): refresh Safari validation evidence

* test(ui): stabilize reader auth focus stories
* fix(ui): preserve shadow host layout after suspense

* test(ui): align shadow host ssr contracts

* test(ui): tighten shadow host compatibility evidence

* docs(ui): record suspense host Safari validation

* chore(ui): account for suspense host bundle cost

* fix(ui): preserve bundle budget headroom

* test(ui): await reader focus restoration

* test(ui): allow WebKit focus handoff budget

* test(ui): settle verse action focus before auth

* test(ui): align nested overlay focus contract

* fix(ui): address suspense layout review findings

* docs(ui): clarify CSP and font fallbacks

* test(ui): stabilize reader focus restoration

* test(ui): isolate browser suite resources

* docs(ui): clarify shadow host CSP tradeoff
* docs(ui): reconcile shadow dom release contract

* test(ui): simplify shadow root evidence

* chore: add release reconciliation changeset

* refactor(example): remove hostile css demo

* docs(ui): tighten shadow dom release contract

* docs(ui): note shadow host CSP requirement

* docs(ui): address shadow dom review feedback
* fix(ui): deduplicate remaining composed events

* test(ui): simplify composed event evidence

* docs(ui): align composed event release notes

* docs(ui): assign safari signoff follow-up

* docs(ui): preserve composed event caveats

* docs(ui): clarify remaining event duplication

* fix(ui): deduplicate pointer release events

* fix(ui): deduplicate text input events

* fix(ui): remove ineffective change event guard
fix(ui): preserve Firefox version picker tab order (YPE-6325)
* docs: record final Safari validation

* docs(ui): address Safari validation review

* docs(ui): align Safari evidence scope

* docs(ui): address final Safari review

* test(ui): keep Safari story discovery browser agnostic

* docs(ui): record post-focus Safari baseline

* test(ui): wait for reader popover exit
* fix(ui): preserve chapter picker tab order (YPE-6344)

* test(ui): preserve chapter picker keyboard coverage

* fix(ui): skip chapter picker scroll region in tab order
* fix(ui): preserve chapter picker tab order (YPE-6344)

* test(ui): preserve chapter picker keyboard coverage

* fix(ui): preserve Firefox chapter picker book focus

Jira: YPE-6374

* test(ui): address chapter picker review feedback
* fix(ui): make pending highlight pointer iframe-safe

* test(ui): clarify iframe highlight terminology

* test(ui): strengthen iframe pointer coverage
* fix(ui): keep inline shadow hosts phrasing-safe

* test(ui): strengthen phrasing host coverage

* test(ui): isolate auth streaming SSR coverage

* docs(ui): record phrasing host validation
# Conflicts:
#	.size-limit.js
#	packages/ui/scripts/verify-styles.js
#	packages/ui/src/components/bible-version-picker.stories.tsx
#	packages/ui/src/components/bible-version-picker.tsx
#	packages/ui/src/components/ui/popover.tsx
* test(ui): align shadow journeys with picker v2

* fix(ui): skip version list viewport in tab order

* fix(ui): preserve focus while picker closes

* test(ui): cover search dismissal focus

* test(ui): tighten picker v2 focus journey evidence

Assert the version list viewport overflows before checking Tab order,
cover outside dismissal from the Languages screen, restore a pill-shape
check for the language search input, and narrow the changeset wording.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* test(ui): name picker journeys after their claims

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* test(ui): wait for reopened picker before checking languages heading

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* fix(ui): normalize picker reopen focus

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
@changeset-bot

changeset-bot Bot commented Nov 4, 2026 •

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: 1c2d5ac

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

This PR includes changesets to release 4 packages
Name Type
@youversion/platform-react-ui Major
@youversion/platform-core Major
@youversion/platform-react-hooks Major
vite-react Patch

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

@github-actions

github-actions Bot commented Nov 4, 2026

Copy link
Copy Markdown
Contributor

🚨 Breaking change detected — signoff required for v3.0.0

This PR adds a changeset declaring a major bump, which would ship all three packages as v3.0.0 (they are a fixed group in .changeset/config.json, so they version together). Merging is blocked until a repo collaborator with write access comments on this PR with all four (4) of the following:

  1. The verbatim acknowledgment phrase below,
  2. The precise next version (v3.0.0 or 3.0.0),
  3. The release token being approved (cb54fa68a9f3e432), and
  4. A 🚀 (:rocket:) emoji.

I confirm that this is an intentional breaking change, and I have read the release procedures. I understand and have documented its impact upon release.

Copy-paste-ready reply:

I confirm that this is an intentional breaking change, and I have read the release procedures. I understand and have documented its impact upon release.

v3.0.0 cb54fa68a9f3e432 🚀

The check re-runs automatically when a qualifying comment is posted or edited. The token covers this release's changesets and version, so ordinary pushes (review fixes, lint, docs) leave this signoff standing; adding or editing a changeset, or a change to the version, needs a fresh one.

@chatgpt-codex-connector chatgpt-codex-connector 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.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 4d557b8b77

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Nov 4, 2026 •

Copy link
Copy Markdown

Codex Review Summary

This comment shows the latest Codex review activity on this pull request.

Review Status Commit Review trigger
📝 Code Review ✅ Completed 2026-11-04T23:05:01.835072Z 1c2d5ac New commits
ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

@chatgpt-codex-connector chatgpt-codex-connector 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.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 1c2d5ac889

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

This branch has not been deployed

No deployments
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.

4 participants