Skip to content

Design the OAuth consent screen and Connected apps (Decision 8) - #3212

Open
jeremy wants to merge 36 commits into
oauth-dcr-allowlistfrom
oauth-consent-design
Open

jeremy wants to merge 36 commits into
oauth-dcr-allowlistfrom
oauth-consent-design

Conversation

@jeremy

@jeremy jeremy commented Oct 20, 2026 •

Copy link
Copy Markdown
Member

Held draft for Jeremy. Don't merge. This is the consent and Connected apps design pass (hosted plan, Decision 8). Production acceptance waits on it. It's stacked on #3192.

It's modelled on bc3's consent page and Connected apps (oauth/authorizations/consent, oauth/_client_self_name from bc3#13580, grouping by kind from bc3#13579), in Fizzy's own pieces: panel, btn, divider, the dialog controller and local_datetime_tag. The only new stylesheet is oauth.css.

Consent screen

  • Who's asking. A self-registered app goes by where its access goes, not by the name it gave itself. That's the callback's host, with the port if it isn't the default, or "an app on your device" for a loopback or app-scheme callback. The heading reads "Authorize the app at connector.example.com". Its own name is only its claim, shown subdued under that: "Says it’s “Totally Fizzy Assistant”". A trusted app is known by its name and gets "Made by 37signals". An operator-registered app is known by its name alone.

  • Warning. Self-registered apps get "We haven’t checked this app. Anyone can run an app at any address, so only authorize it if you trust ." Device apps get "We haven’t checked this app. It runs on your device and will get this access, so only authorize it if you started it." Same wording as bc3#14089, as Jeremy ruled.

  • Name safety. Bidirectional control characters are stripped from a self-registered name, and bdi isolates it, so a right-to-left name can't move the quotes or the host.

  • Access. The select is replaced by two radio cards:

    • "Read only": see your boards, cards, comments and the people in your accounts. It can't change anything.
    • "Read and write": see everything you can, and act as you: create, edit, move, close and delete cards, comments and boards.

    A read-only client gets the single card. A line under the cards says the app reaches only what you can, in every account you belong to (or "in the account above" once account binding lands).

  • Identity. "Signed in as ", with a Not you? button. It's a CSRF-protected POST to oauth/authorization/switch, which re-runs every check the consent screen ran, rebuilds the authorize URL from those parameters (never from a URL in the request), signs out, and saves that URL so whoever signs in next returns to consent for the same request. The saved URL is used once. The account choice isn't carried over, since it belonged to the identity that signed out.

  • Destination. "Either way, you'll go back to ", with a link to Connected apps.

  • Buttons keep the names Authorize and Deny, so the system test and muscle memory hold.

  • Account picker. oauth/authorizations/_account_picker (locals form, accounts, selected_account_id) renders when the controller sets @accounts. The account-binding lane owns the controller and the account_id param, and this partial is its markup. With one account it names it and carries it in a hidden field; with several it shows radio cards.

Errors shown on Fizzy

This is the page shown when a request can't be redirected back safely, for example an unknown client or a redirect that doesn't match. It says "Can't authorize this app", the reason, "Nothing was shared. Close this window and start again from the app. If it keeps happening, let whoever made the app know", and the error code. The old "Go back" link to the referer is gone: it could point at the requesting site.

Connected apps

  • Grouped by what the app is. Oauth::Client#connection_kind decides it by how the app is registered, never by its name:

    • Apps and assistants on the web
    • Apps on your devices: every callback is loopback or an app scheme
    • Fizzy apps: trusted

    Empty groups don't show.

  • Each app shows:

    • its name;
    • who set the name, with the host;
    • its access ("Read and write, in every account you belong to");
    • "Connected · access last renewed <today / yesterday / N days ago>";
    • the number of connections if there are several.
  • Access last renewed is the newest token's updated_at, which moves each time the app renews its access. (Renamed from "last active" per Jeremy; it reads fine in the layout, so it stays.)

  • Disconnect keeps the existing dialog, including the webhooks it set up. It's now a labelled button rather than a bare trash icon, and its wording is "It loses its access to Fizzy right away."

  • Empty state: "Nothing connected yet." with a line on what shows up here.

Screenshots

Dark theme, from a system-test browser with fixtures. Desktop is 1200 px wide, mobile 390 px. Before is #3192's head 617edb87b.

Before After
Consent, web app, desktop Consent, web app, desktop, before Consent, web app, desktop, after
Consent, web app, mobile Consent, web app, mobile, before Consent, web app, mobile, after
Consent, app on device, desktop Consent, app on device, desktop, before Consent, app on device, desktop, after
Consent, app on device, mobile Consent, app on device, mobile, before Consent, app on device, mobile, after
Error shown on Fizzy Error shown on Fizzy, before Error shown on Fizzy, after
Connected apps, desktop Connected apps, desktop, before Connected apps, desktop, after
Connected apps, mobile Connected apps, mobile, before Connected apps, mobile, after
Connected apps, empty Connected apps, empty, before Connected apps, empty, after

The images live on the pr-assets/oauth-consent-design branch, pinned to its commit.

Rulings applied

Jeremy kept the group names, the host as heading, and the read copy naming people. "Last active" is now "access last renewed". "Not you?" is added (above).

After the rulings (head 0cc0901)

Consent, web app Consent, app on device Connected apps
Consent with Not you?, desktop Consent on device with Not you?, desktop Connected apps with access last renewed, desktop
Consent with Not you?, mobile Consent on device with Not you?, mobile Connected apps, mobile

Tests

  • New: test/integration/oauth_consent_screen_test.rb (identity line, warnings, bidi stripping, access levels, signed-in email, the error page), test/helpers/oauth_helper_test.rb (identity, access levels, grouping, both shapes of the account picker), Oauth::Client#connection_kind in the model tests, and Connected apps grouping and empty state.
  • Not you?: test/integration/oauth_authorization_switch_test.rb covers the button on consent, same-origin (CSRF) required, a forged return_to ignored, an unregistered redirect or unknown client refused with the person still signed in and nothing saved, and a full round trip that lands the next identity back on consent and uses the saved URL once.
  • Changed: oauth_flow_test.rb's scope assertions now look for radios instead of a select.
  • Local runs: the touched files plus the OAuth flow and the consent system test pass on SQLite, and rubocop is clean. GitHub CI runs the full OSS SQLite, OSS MySQL and SaaS suites.

…ay do, where it goes

The consent screen names a self-registered app by where its access goes, its
own name quoted beside it, warns that Fizzy hasn't checked it, explains each
access level in plain words, says who is signed in and where the browser goes
next. An account picker partial is ready for account binding. Errors shown on
Fizzy say what to do next. Connected apps groups apps by kind (web, on your
devices, Fizzy's own), with access, when connected and last active, and an
empty state.
@jeremy

jeremy commented Oct 20, 2026

Copy link
Copy Markdown
Member Author

@codex review

@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Oct 20, 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-10-26T08:54:57.452670Z 3765a67 Manual request
🔒 Security Review ✅ Completed 2026-10-26T08:56:39.332771Z 3765a67 Manual request
ℹ️ 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: ca5c1ba0d3

ℹ️ 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".

Comment thread app/views/my/connected_apps/_connected_app.html.erb Outdated
A self-registered client may list a loopback callback first and an https one
later, and its grant may have come through either, so the first callback
doesn't speak for the app.
@jeremy

jeremy commented Oct 20, 2026

Copy link
Copy Markdown
Member Author

Review summary for head 56bd25c:

  • CI: green. The SQLite and MySQL suites pass for both OSS and SaaS, and the checks pass.
  • Codex reviewed ca5c1ba once, as planned, and raised one finding: Connected apps took an app's host from its first callback only. That's fixed in 56bd25c and the thread is resolved. Codex hasn't been asked to review the fix commit.
  • Open threads: none.
  • Held for Jeremy's design read. The "For Jeremy to look at" section above lists the decisions that need him.

…t is

Switching signs out and brings whoever signs in next back to the same
authorization request, rebuilt from parameters that passed the consent
screen's checks rather than taken as a URL. Connected apps says when an app
last renewed its access, which is what the timestamp records.
@jeremy

jeremy commented Oct 23, 2026

Copy link
Copy Markdown
Member Author

@codex review

@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: 0cc090101c

ℹ️ 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".

Comment thread app/views/oauth/authorizations/error.html.erb
Comment thread app/controllers/oauth/authorizations/switches_controller.rb Outdated
…y when the request can be resumed

An authorization request naming no known client has nowhere to send the
browser back to, so it gets the error page rather than raw JSON. Not you?
refuses a request too long to keep in the session before signing anyone out,
since there would be nothing to return to.
@jeremy

jeremy commented Oct 23, 2026

Copy link
Copy Markdown
Member Author

Status for head cc77884:

  • Rulings applied. Group names, the host as heading and the read copy that names people are unchanged. "Last active" is now "access last renewed", which reads fine in the layout, so the field stays. "Not you?" is added (see the PR body).
  • CI: all four suites pass (OSS and SaaS, each on SQLite and MySQL). OSS MySQL first failed when the apt install step timed out after 10 minutes and passed on rerun. Security fails on a dependency, not on this PR: bundler-audit flags crass 1.0.7 (GHSA-pq4g-8rxf-4g29). That lockfile comes from this PR's base, Store tokens and client secrets as digests (D1 of 3: read by digest, plaintext fallback) #3192 (oauth-token-digests), and main already has crass 1.0.8. It clears once Store tokens and client secrets as digests (D1 of 3: read by digest, plaintext fallback) #3192 picks up main.
  • thelio (own MySQL container on 34512, head 0cc0901): SaaS 2328 tests, OSS MySQL 2160 and OSS SQLite 2160, with 0 failures.
  • Codex reviewed 0cc0901 and raised two findings. An unknown client got raw JSON instead of the error page, and Not you? signed people out before checking the request could be resumed. Both are fixed in cc77884 with tests, and both threads are resolved. Codex hasn't been asked to review the fix commit.
  • Open threads: none.
  • Held. Don't merge.

@jeremy

jeremy commented Oct 23, 2026

Copy link
Copy Markdown
Member Author

@codex review

@chatgpt-codex-connector

Copy link
Copy Markdown

Codex Review: Didn't find any major issues. Can't wait for the next one!

Reviewed commit: cc7788497e

ℹ️ 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

Copy link
Copy Markdown

🛡️ Codex Security Review · Automatically triggered

Security review completed. No security issues were found in this pull request.

Reviewed commit: cc7788497e

View security finding report

Only the user who started this review can view the report in Codex.

ℹ️ About Codex security reviews in GitHub

This is an experimental Codex feature. Security reviews are triggered when:

  • You comment "@codex security review"
  • A regular code review gets triggered (for example, "@codex review" or when a PR is opened), and you’re opted in so security review runs alongside code review

Once complete, Codex will leave suggestions, or a comment if no findings are found.

* origin/oauth-token-digests:
  Refuse an OAuth parameter that arrives as a list where one value is meant
* origin/oauth-token-digests: (48 commits)
  Bring main's tests up to this branch: Ruby 4, webhook attribution, token digests
  Pin the fizzy_mcp accessory to fizzy-mcp-server v0.1.0 by digest
  Scope webhook dispatch by account as well as board
  Test the reviewer audit against the structured log line production writes
  Revoke on the email alone, and record each use in the request's structured log
  Remove the reviewer's access tokens and passkeys on sign-out, so a code holder can't keep a way back in
  Wire the reviewer sign-in into production from Deploy/Fizzy
  Close the reviewer's live sockets on sign-out, and keep the identity id out of Sentry
  End the reviewer's sessions on rotation, so the old code's sessions don't outlive it
  Refuse a code that normalizes to nothing, not just a blank one
  Let the directory reviewer sign in with a fixed code, SaaS only and off unless configured
  Refuse docker-dev's shared default port in a git worktree
  Ruby 4.0.9 (#3234)
  Retry the offline clear only in an active worker
  Retry clearing old offline pages whenever the worker starts
  Clear offline pages rendered under an older rendering version
  Re-key every fragment and page ETag past crass 1.0.7
  Bump crass to 1.0.8 in Gemfile.saas.lock, and test rich text style scrubbing
  Bump crass to 1.0.8 for GHSA-pq4g-8rxf-4g29
  story accepted
  ...
* origin/oauth-token-digests:
  Filter the code parameter by its whole name, so code_challenge stays readable
* origin/oauth-token-digests:
  Redact retired refresh tokens from logged SQL
… lowercase

Read's description names the people in every account the person belongs to,
or in the one account an audienced grant is bound to, matching the reach
line beside it. A redirect's host is shown in lowercase, as a browser reads
it.
jeremy added a commit that referenced this pull request Oct 24, 2026
… DCR allowlist

B's account-picker test asserted its plain select; #3212 renders radio cards. CIMD's unknown-client tests read a JSON error; #3212 shows the error page. DCR's app-scheme test looked for the old consent line; #3212 says the app on your device. #3212's connected-apps test registered two https hosts that #3229 now vets.
@jeremy

jeremy commented Oct 24, 2026

Copy link
Copy Markdown
Member Author

@codex review

@chatgpt-codex-connector

Copy link
Copy Markdown

Codex Review: Didn't find any major issues. More of your lovely PRs please.

Reviewed commit: c2efad212e

ℹ️ 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

Copy link
Copy Markdown

🛡️ Codex Security Review · Automatically triggered

Security review completed. No security issues were found in this pull request.

Reviewed commit: c2efad212e

View security finding report

Only the user who started this review can view the report in Codex.

ℹ️ About Codex security reviews in GitHub

This is an experimental Codex feature. Security reviews are triggered when:

  • You comment "@codex security review"
  • A regular code review gets triggered (for example, "@codex review" or when a PR is opened), and you’re opted in so security review runs alongside code review

Once complete, Codex will leave suggestions, or a comment if no findings are found.

@jeremy

jeremy commented Oct 24, 2026

Copy link
Copy Markdown
Member Author

Ruling (Jeremy, 2026-10-24): the read copy doesn't mention email addresses, as on bc3#14090. This PR's copy already leaves them out, so it stays as it is. The "name set by" wording is still open and unchanged here.

…ping partway

* origin/oauth-token-digests:
  Make this branch's migrations safe to run again after stopping partway
  Make this branch's migrations safe to run again after stopping partway
  Make the OAuth migrations safe to run again after stopping partway
* origin/oauth-token-digests:
  Answer 404 from a dark endpoint however many times it's asked
…ked it

The name line reads Says it's "<name>": a registered name is whatever
the registrant typed, so it is presented only as the app's own claim.
The warning leads with "We haven't checked this app." in our voice, and
a web app's heading names where its access goes: Authorize the app at
<host>. Same wording as bc3's consent.
@jeremy

jeremy commented Oct 25, 2026

Copy link
Copy Markdown
Member Author

@codex review

@jeremy

jeremy commented Oct 26, 2026

Copy link
Copy Markdown
Member Author

@codex review

@chatgpt-codex-connector

Copy link
Copy Markdown

🛡️ Codex Security Review · Automatically triggered

Security review completed. No security issues were found in this pull request.

Reviewed commit: 07a7519ccd

View security finding report

Only the user who started this review can view the report in Codex.

ℹ️ About Codex security reviews in GitHub

This is an experimental Codex feature. Security reviews are triggered when:

  • You comment "@codex security review"
  • A regular code review gets triggered (for example, "@codex review" or when a PR is opened), and you’re opted in so security review runs alongside code review

Once complete, Codex will leave suggestions, or a comment if no findings are found.

@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: 07a7519ccd

ℹ️ 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".

Comment thread app/helpers/oauth_helper.rb
@jeremy
jeremy marked this pull request as ready for review October 26, 2026 07:33

@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: 07a7519ccd

ℹ️ 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".

Comment thread app/controllers/oauth/authorizations/switches_controller.rb
Comment thread app/views/my/connected_apps/_connected_app.html.erb Outdated
* origin/oauth-dcr-allowlist:
  Record a metadata document's registration as the client's own, find a revoking client by exact id, and read a quoted max-age
  Judge an exchange by the client row it locked, and look only for a delegated token's digest on the primary
  Deliver an app's push in an account only through a grant that reaches that account, and drop a duplicate render_error
@jeremy

jeremy commented Oct 26, 2026

Copy link
Copy Markdown
Member Author

🤖 @codex review

@chatgpt-codex-connector

Copy link
Copy Markdown

Codex Review: Didn't find any major issues. More of your lovely PRs please.

Reviewed commit: 33dba08381

ℹ️ 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

Copy link
Copy Markdown

🛡️ Codex Security Review · Automatically triggered

Security review completed. No security issues were found in this pull request.

Reviewed commit: 33dba08381

View security finding report

Only the user who started this review can view the report in Codex.

ℹ️ About Codex security reviews in GitHub

This is an experimental Codex feature. Security reviews are triggered when:

  • You comment "@codex security review"
  • A regular code review gets triggered (for example, "@codex review" or when a PR is opened), and you’re opted in so security review runs alongside code review

Once complete, Codex will leave suggestions, or a comment if no findings are found.

* origin/oauth-dcr-allowlist:
  Count a successful delegation exchange as a token grant, and run its sweep as a named cleanup step
  Refuse a whitespace resource indicator, and let an account-bound grant refresh only while its account is the person's
@jeremy

jeremy commented Oct 26, 2026

Copy link
Copy Markdown
Member Author

🤖 @codex review

@chatgpt-codex-connector

Copy link
Copy Markdown

Codex Review: Didn't find any major issues. Another round soon, please!

Reviewed commit: 2a80f7951c

ℹ️ 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

Copy link
Copy Markdown

🛡️ Codex Security Review · Automatically triggered

Security review completed. No security issues were found in this pull request.

Reviewed commit: 2a80f7951c

View security finding report

Only the user who started this review can view the report in Codex.

ℹ️ About Codex security reviews in GitHub

This is an experimental Codex feature. Security reviews are triggered when:

  • You comment "@codex security review"
  • A regular code review gets triggered (for example, "@codex review" or when a PR is opened), and you’re opted in so security review runs alongside code review

Once complete, Codex will leave suggestions, or a comment if no findings are found.

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

🔵 Needs a closer look

The security-sensitive identity-switching flow needs human sign-off, and the PR explicitly remains held for Jeremy’s design approval.

No open issues 🎉

Review effort: Balanced

* origin/oauth-dcr-allowlist:
  Answer a denial with access_denied whatever the stored row's scopes, and refund the fetch budget when admission is lost
@jeremy

jeremy commented Oct 26, 2026

Copy link
Copy Markdown
Member Author

🤖 @codex review

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

🔵 Needs a closer look

Authentication-sensitive identity switching and the explicit design-review hold require human approval, alongside resolution of the retained correctness issues.

2 open issues

Review effort: Balanced

Comment thread app/controllers/oauth/authorizations_controller.rb Outdated
Comment thread app/models/oauth/client.rb Outdated
@chatgpt-codex-connector

Copy link
Copy Markdown

🛡️ Codex Security Review · Automatically triggered

Security review completed. No security issues were found in this pull request.

Reviewed commit: 28b99586d9

View security finding report

Only the user who started this review can view the report in Codex.

ℹ️ About Codex security reviews in GitHub

This is an experimental Codex feature. Security reviews are triggered when:

  • You comment "@codex security review"
  • A regular code review gets triggered (for example, "@codex review" or when a PR is opened), and you’re opted in so security review runs alongside code review

Once complete, Codex will leave suggestions, or a comment if no findings are found.

@jeremy

jeremy commented Oct 26, 2026

Copy link
Copy Markdown
Member Author

🤖 @codex review

@chatgpt-codex-connector

Copy link
Copy Markdown

Codex Review: Didn't find any major issues. Nice work!

Reviewed commit: 3765a67481

ℹ️ 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".

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

🔵 Needs a closer look

The authentication-switching flow warrants human approval, and the PR remains explicitly held for Jeremy’s final design sign-off.

No open issues 🎉

2 resolved since last review

Review effort: Balanced

@chatgpt-codex-connector

Copy link
Copy Markdown

🛡️ Codex Security Review · Automatically triggered

Security review completed. No security issues were found in this pull request.

Reviewed commit: 3765a67481

View security finding report

Only the user who started this review can view the report in Codex.

ℹ️ About Codex security reviews in GitHub

This is an experimental Codex feature. Security reviews are triggered when:

  • You comment "@codex security review"
  • A regular code review gets triggered (for example, "@codex review" or when a PR is opened), and you’re opted in so security review runs alongside code review

Once complete, Codex will leave suggestions, or a comment if no findings are found.

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