Skip to content

Accept self-registered redirects only on loopback, cursor:// and claude://, and allowlisted https hosts - #3229

Merged
jeremy merged 26 commits into
mainfrom
oauth-dcr-allowlist
Oct 27, 2026
Merged

jeremy merged 26 commits into
mainfrom
oauth-dcr-allowlist

Conversation

@jeremy

@jeremy jeremy commented Oct 23, 2026 •

Copy link
Copy Markdown
Member

Held for Jeremy. Draft; don't merge. Stacked on #3192 (oauth-token-digests).

Dynamic client registration is open and unauthenticated. After #3080 it accepted an https callback on any host, so anyone could register a client that sends authorization codes to a host they chose; the consent screen was the only check. This tightens it to bc3's strict allowlist, the policy bc3 ran before bc3#13778 opened https (Jeremy's ruling for Fizzy).

The rule

A self-registered client may name only:

Redirect Why it's safe for open registration Source in bc3
http://127.0.0.1, http://[::1], http://localhost, any port (RFC 8252 §7.3) served on the user's device LOOPBACK_ADDRESSES
cursor://…, claude://… (RFC 8252 §7.1) the OS hands it to an app on the user's device DCR_ALLOWED_CUSTOM_SCHEMES
https:// on a host in OAUTH_DCR_ALLOWED_HTTPS_HOSTS a vetted vendor's callback; the consent screen stays the backstop DCR_ALLOWED_HTTPS_HOSTS
  • App schemes: only cursor and claude. They must be hierarchical (cursor://host/path, never the opaque cursor:path, which can't carry ?code=), with no userinfo or fragment, and must name a host or path. Dotted reverse-DNS schemes get no pass on shape, because some route to a remote handler (z39.50r, iris.beep), as bc3#13431 found. This is new for Fizzy: Accept https redirect URIs for dynamically registered clients #3080 rejected every custom scheme for DCR.
  • The error is RFC 7591's invalid_redirect_uri. One unallowed URI refuses the whole registration, and the description lists what's accepted, hosts included.
  • Existing clients are unaffected. The host check runs only on hosts a write adds (Oauth::Client#added_https_hosts_are_vetted, run on create or when redirect_uris changes), never on hosts a client already holds. A client keeps saving and authorizing after its host leaves the list. Tests pin both.
  • Unchanged: operator-provisioned clients (dynamically_registered: false) aren't held to the list, and neither are CIMD clients on oauth-cimd, which register with dynamically_registered: false. The pre-consent rule is also unchanged: errors for a self-registered client still render on Fizzy unless its redirect is loopback.

Default host list (SaaS, saas/config/deploy.yml)

OAUTH_DCR_ALLOWED_HTTPS_HOSTS: "claude.ai claude.com chatgpt.com www.cursor.com grok.com"

Host Client Source
claude.ai Claude web connectors (https://claude.ai/api/mcp/auth_callback) bc3 doc/oauth/production_light_up.md#L671
claude.com Claude (https://claude.com/api/mcp/auth_callback) same line
chatgpt.com ChatGPT connectors (https://chatgpt.com/aip/g/oauth/callback) same line
www.cursor.com Cursor desktop and cloud, and the Grok Bot through Cursor's client (https://www.cursor.com/agents/mcp/oauth/callback) bc3 redirect_uris.rb before #13778, DCR_ALLOWED_HTTPS_HOSTS
grok.com Grok's native connector (https://grok.com/connectors-oauth-exchange-code/) same constant

bc3's list also held muse.ai and agent.meta.ai, for Meta's Muse. They're left out because the ruling named Claude, ChatGPT, Cursor and Grok. Adding them is one line in deploy.yml.

In bc3, Claude and ChatGPT reach the server through CIMD, not DCR. They're listed here because Fizzy's CIMD (oauth-cimd) isn't merged, and DCR is their fallback until it is (the directory packet: "OAuth with CIMD; DCR as the fallback").

OSS and self-hosted: strict by default

Unset, OAUTH_DCR_ALLOWED_HTTPS_HOSTS allows no https host: only loopback and the two app schemes. A self-hoster who wants a hosted connector names its host. This mirrors bc3's positive model: an open-registration server shouldn't accept arbitrary remote sinks by default, and an install that never mentions DCR gets the safe posture. config.x.oauth.dcr_allowed_https_hosts is read in production.rb and development.rb, separated by spaces or commas. test.rb names connector.example.com so existing tests keep their https client.

Expected conflicts

Tests

  • New test/integration/oauth_dcr_redirect_allowlist_test.rb covers:
    • allowed and unallowed hosts, with the error;
    • one bad URI refusing the whole set;
    • no hosts configured;
    • the two app schemes accepted, others refused;
    • an app-scheme client's consent screen (its CSP names cursor:) and its code arriving at cursor://…;
    • a client whose host left the list still authorizing.
  • test/models/oauth/client_test.rb covers:
    • adding a host only from the list;
    • keeping a removed host but not adding another;
    • operator clients exempt;
    • accepted and refused app schemes, including z39.50r, iris.beep, javascript, opaque cursor:callback, userinfo and a fragment.
  • Mutation check: with both the controller's and the model's host checks disabled, 6 tests fail.
  • Locally (OSS SQLite): 185 tests in the OAuth model and flow files pass, 0 failures. Rubocop is clean.
  • thelio: the full suites are running. Results follow in a comment.

Third-party data flow

A person who authorizes the Cursor or Claude desktop app via cursor:// or claude:// sends an authorization code for their own Fizzy data to that app, on their device. This is the flow the Trust & Compliance card Fizzy OAuth: people can connect third-party apps to their Fizzy data covers. No new subprocessor: Fizzy sends nothing to Cursor or Anthropic itself. This PR narrows the flow overall, from any https callback (#3080) to on-device callbacks, these two schemes, and operator-listed https hosts.

…de://, and allowlisted https hosts

Dynamic client registration is open and unauthenticated, so an https callback on any host let anyone register a client that sends codes to a host they choose. Self-registered clients now name an http loopback redirect, a cursor:// or claude:// app redirect, or https on a host in OAUTH_DCR_ALLOWED_HTTPS_HOSTS, as bc3's strict allowlist did before bc3#13778. Unset, no https host is allowed. SaaS lists the Claude, ChatGPT, Cursor and Grok callback hosts.

The host check runs only on hosts a registration adds, so a client keeps working after its host leaves the list.
@jeremy

jeremy commented Oct 23, 2026

Copy link
Copy Markdown
Member Author

@codex review

@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Oct 23, 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:36:53.578131Z 324b5cb Manual request
🔒 Security Review ✅ Completed 2026-10-26T08:41:19.979997Z 324b5cb 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

Copy link
Copy Markdown

🛡️ Codex Security Review · Automatically triggered

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

Reviewed commit: 0367b0e1a7

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: 0367b0e1a7

ℹ️ 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/models/oauth.rb Outdated
Comment thread app/models/oauth.rb
A hostless cursor:/callback showed consent no destination, so app-scheme redirects now name a plain host, and consent shows it with its scheme. An app scheme naming a loopback host (cursor://localhost) was treated as loopback, which earned it pre-consent error redirects; loopback now means http.
@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. 👍

Reviewed commit: 5363306e1a

ℹ️ 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: 5363306e1a

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 23, 2026

Copy link
Copy Markdown
Member Author

Tests on 5363306e1 (thelio, full suites):

  • OSS SQLite: 2148 tests, 0 failures, 0 errors
  • OSS MySQL: 2148 tests, 0 failures, 0 errors
  • SaaS MySQL: 2316 tests, 0 failures, 0 errors

The SaaS run on 0367b0e1a hit a Trilogy read timeout in db:test:purge at load average 78, so it was rerun with MIGRATE=1 for the schema load only. The tests ran with the normal SaaS timeouts.

Codex: both findings on 0367b0e1a were fixed in 5363306e1 (app-scheme redirects need a plain host; loopback means http) and their threads are resolved. Codex code and security reviews on 5363306e1 found nothing. Still held for Jeremy.

* 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
Consent names a self-registered app by where its access returns, so a
callback on fizzy.do, basecamp.com, 37signals.com or hey.com would read as
ours. The allowlist names only vendor hosts, so ours are already refused;
this holds that with production's list.
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 Security Review · Automatically triggered

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

Reviewed commit: d9c1872acc

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: d9c1872acc

ℹ️ 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/models/oauth.rb
Comment thread config/environments/production.rb
Self-registered clients may now use only on-device callbacks, the cursor:// and claude:// schemes, or an https host the operator lists. An install that sets nothing refuses web-based clients' registrations after upgrading, so docker-deployment.md says how to list them.
…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
* tp/oauth-token-digests:
  Name v0.2.0 in the pin's comment
  Pin fizzy-mcp-server v0.2.0
  Refuse a join code that was reset while it was being redeemed
  Filter presigned storage signatures from logs
  Keep the reviewer's memberships in reach, and print the member audit escaped
  Import an export that lacks a column this database has only just gained
  List the reviewer accounts' members when signing the reviewer out
  Bump thruster from 0.1.26 to 0.1.27 (#3199)
  Give the asset build a placeholder direct-upload credential
  Anchor the stubbed storage host pattern
  Sign direct uploads with a write-only storage credential
  Lock the reviewer's email address, so a code holder can't move its membership out of revocation's reach
  Use Ruby's GC defaults and log job memory (#3238)
* tp/oauth-cimd: (49 commits)
  Refuse an exchange whose subject token was rotated away before the lock
  Answer an exchange that isn't on the same way however many times it's asked
  Make this branch's migrations safe to run again after stopping partway
  Make this branch's migrations safe to run again after stopping partway
  Leave a client_id list to the shared single-valued check
  Hold the exchange to the token endpoint's single-valued check
  Refuse resource and account_id sent as lists as invalid_request
  Attribute what a delegated token sets up to the app the person connected
  Hold metadata documents to per-person budgets and the strict address policy
  Refuse a subject with too little life left to trade for a usable token
  Say what the exchange's media type gate is for, now the shared count reads every body
  Accept the exchange only form-urlencoded, where every repeated resource is visible
  Refuse an exchange that names several resources, counted in the raw body
  Accept the API's advertised resource identifier, and give each MCP resource a client of its own
  Resolve the exchange's scope again under the grant's lock
  Look again on the primary only for a token of exactly the minted shape
  Show a delegated token reaching its subject's account alone, and finding it at /my/identity
  Lock the exchange client while minting, judge a delegated token on the primary whole, and narrow it with its grant
  Judge the exchange's resource against the issuer the request came to
  Exchange an MCP grant for a short-lived API token (RFC 8693 delegation)
  ...

# Conflicts:
#	app/models/oauth.rb
#	app/models/oauth/client.rb
#	config/environments/development.rb
#	config/environments/production.rb
#	config/environments/test.rb
#	saas/config/deploy.yml
* tp/oauth-cimd:
  Report a personal access token as pat whether or not it has the personal access client
@jeremy jeremy changed the title HELD: Accept self-registered redirects only on loopback, cursor:// and claude://, and allowlisted https hosts Accept self-registered redirects only on loopback, cursor:// and claude://, and allowlisted https hosts Oct 26, 2026
* tp/oauth-cimd:
  Audit a personal access token from the personal access client as a pat
  Bring main's tests up to this branch: Ruby 4 and the access token finder
* tp/oauth-cimd:
  Pin the load balancers to kamal-proxy v0.10.2, and say why configure-lb-mcp.sh still checks
  Give the load balancer the real client IP
* tp/oauth-cimd:
  Answer a dark server's exchange with 404 first, and time exchanges with the token endpoint
@jeremy
jeremy marked this pull request as ready for review October 26, 2026 07:33
Copilot AI balanced review requested due to automatic review settings October 26, 2026 07:33
@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

The security-sensitive OAuth registration policy needs final human review and remains explicitly held for Jeremy.

No open issues 🎉

What changed in this PR

Tightens OAuth dynamic client registration to accept only HTTP loopback callbacks, cursor:// and claude:// app callbacks, and explicitly allowlisted HTTPS hosts.

Changes:

  • Centralizes redirect validation while preserving existing clients’ HTTPS hosts and operator-provisioned exemptions.
  • Configures SaaS vendor hosts and documents strict-by-default self-hosted behavior.
  • Updates consent destination display and adds model and integration coverage for registration and authorization.

[!TIP]
If you aren't ready for review, convert to a draft PR.
Click "Convert to draft" or run gh pr ready --undo.
Click "Ready for review" or run gh pr ready to reengage.

File Description
test/​test_helpers/​oauth_availability_test_helper.rb Adds temporary HTTPS allowlist configuration for tests.
test/​models/​oauth/​client_test.rb Tests host restrictions, app schemes, and existing-client compatibility.
test/​integration/​oauth_dcr_redirect_allowlist_test.rb Covers registration restrictions and authorization flows.
saas/​config/​deploy.yml Sets the SaaS HTTPS callback host allowlist.
docs/​docker-deployment.md Documents accepted callbacks and self-hosted configuration.
config/​environments/​test.rb Sets the test callback host allowlist.
config/​environments/​production.rb Loads allowed hosts from the environment.
config/​environments/​development.rb Enables environment-based host configuration locally.
app/​views/​oauth/​authorizations/​new.html.erb Distinguishes HTTP loopback and app-scheme destinations.
app/​models/​oauth/​client.rb Validates newly added HTTPS hosts and shared redirect rules.
app/​models/​oauth.rb Defines shared redirect policy and allowlist helpers.
app/​controllers/​oauth/​clients_controller.rb Enforces registration policy and explains accepted redirects.

Review effort: Balanced

@chatgpt-codex-connector

Copy link
Copy Markdown

Codex Review: Didn't find any major issues. What shall we delve into next?

Reviewed commit: 6d5ed9ab9e

ℹ️ 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: 6d5ed9ab9e

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.

…-age

* origin/oauth-cimd:
  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. Hooray!

Reviewed commit: d989db0ca3

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

* origin/oauth-cimd:
  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: f07c9504fc

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

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

This security-sensitive OAuth policy change remains explicitly held for Jeremy’s final human review.

No open issues 🎉

Review effort: Balanced

* origin/oauth-cimd:
  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

@chatgpt-codex-connector

Copy link
Copy Markdown

Codex Review: Didn't find any major issues. What shall we delve into next?

Reviewed commit: 324b5cbac2

ℹ️ 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 security-sensitive OAuth redirect policy needs final human review, and the PR is explicitly held for Jeremy.

No open issues 🎉

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: 324b5cbac2

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.

Base automatically changed from oauth-cimd to main October 27, 2026 06:30
@jeremy
jeremy merged commit ce7fb15 into main Oct 27, 2026
13 of 14 checks passed
@jeremy
jeremy deleted the oauth-dcr-allowlist branch October 27, 2026 06:30
kheubaum pushed a commit to kheubaum/fizzy that referenced this pull request Oct 27, 2026
The staff gate from basecamp#3246, reordered to land before the consent design (basecamp#3212).
It carries basecamp#3246's net change against basecamp#3212 as one commit on basecamp#3229's head,
with no dependency on basecamp#3212.
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