Skip to content

fix(reconciler): fail closed when the default branch is unknown - #586

Draft
leoparente wants to merge 5 commits into
developfrom
fix/reconciler-branch-boot-race
Draft

fix(reconciler): fail closed when the default branch is unknown#586
leoparente wants to merge 5 commits into
developfrom
fix/reconciler-branch-boot-race

Conversation

@leoparente

Copy link
Copy Markdown
Contributor

Fixes #553.

The bug

At boot the default-branch fetch races OAuth client bootstrap. When it loses, NetBox answers 403 Invalid token, the refresher logs a warning and leaves the cache cold — and both processors carry on regardless:

branchID := ""
if branch, err := p.ops.DefaultBranch(ctx); err == nil && branch != nil {
    branchID = branch.ID
}
results := p.ops.BulkPlanApply(ctx, batch, branchID)

A cold cache returns (nil, nil). err is nil, branch is nil, so branchID stays ""indistinguishable from "no default branch is configured". Work is planned and applied against main, bypassing the branch's approval boundary.

Two things made it worse than a momentary blip:

  • No retry. fetchAndStoreBranch ran once at boot, then waited a full DefaultBranchRefreshInterval (5 minutes) before trying again. So one lost race meant up to five minutes of branchless applies.
  • HasBranchLoaded() already existed to distinguish "known absent" from "not yet known" — but it was only ever read to populate a log field, and wasn't on the IngestionProcessorOps interface the processors consume. No caller could act on it. The distinction was built and never wired up.

The reporter's workaround is telling: restart the reconciler twice, ~45s apart, and grep the logs for the warning. I hit this same warning in a local stack while working on something else and put it down to a stale token — it's easy to misread as a config problem.

The fix

  • Put HasBranchLoaded() on IngestionProcessorOps and gate both poll loops on it.
  • Gate before claiming, not inside processBatch. Both loops claim from the DB then process, so deferring after the claim would strand rows in a claimed state. Deferring before it leaves them queued.
  • Retry the initial fetch with backoff (1s doubling to 30s) so the boot race resolves in seconds instead of keeping processors idle for five minutes.

Gated on HasBranchLoaded() rather than on branch presence deliberately: no default branch configured has to stay a fast path, so single-tenant deployments are unaffected.

Tests

  • Both processors asserted to claim nothing while the cache is cold. Verified these fail without the gate — neutralised the condition and watched both tests fail, then restored it.
  • The refresher asserted to recover from an initial 403 well inside the refresh interval (passes in ~1s, so only the retry can satisfy it).
  • Existing processor tests stub the new method.

Full suite and golangci-lint clean. While fixing the stubs I found the missing mock expectation wedged the package at Go's 600s test timeout — testify calls FailNow from the processor goroutine — so the suite is back to ~5s from that 600s.

Worth a reviewer's eye

Deferring blocks both planning and applying while the cache is cold. Planning against the wrong branch produces the wrong diff, so I don't think plan-but-don't-apply is safe — but if you'd rather change-set generation continued during the window, that's the knob to turn.

🤖 Generated with Claude Code

@github-actions

github-actions Bot commented Aug 31, 2026

Copy link
Copy Markdown

Vulnerability Scan: Passed — diode-auth

Image: diode-auth:scan

Source Library CVE Severity Installed Fixed Title
usr/bin/hydra github.com/docker/docker CVE-2026-33997 🟡 MEDIUM v28.3.3+incompatible 29.3.1 moby: docker: github.com/moby/moby: Moby: Privilege validation bypass during plu
usr/bin/hydra github.com/go-jose/go-jose/v3 CVE-2026-34986 🟠 HIGH v3.0.4 3.0.5 github.com/go-jose/go-jose/v3: github.com/go-jose/go-jose/v4: Go JOSE: Denial of
usr/bin/hydra github.com/jackc/pgx/v5 CVE-2026-33815 🔴 CRITICAL v5.7.5 5.9.0 github.com/jackc/pgx/v5: github.com/jackc/pgx: Memory-safety vulnerability
usr/bin/hydra github.com/jackc/pgx/v5 CVE-2026-33816 🔴 CRITICAL v5.7.5 5.9.0 github.com/jackc/pgx/v5: github.com/jackc/pgx: Memory-safety vulnerability
usr/bin/hydra github.com/jackc/pgx/v5 CVE-2026-41889 ⚪ LOW v5.7.5 5.9.2 github.com/jackc/pgx: golang: pgx: SQL injection via specific SQL query conditio
usr/bin/hydra go.opentelemetry.io/otel CVE-2026-29181 🟠 HIGH v1.40.0 1.41.0 github.com/open-telemetry/opentelemetry-go: OpenTelemetry-Go: Denial of Service
usr/bin/hydra go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp CVE-2026-39882 🟡 MEDIUM v1.37.0 1.43.0 github.com/open-telemetry/opentelemetry-go: golang: OpenTelemetry-Go: Memory exh
usr/bin/hydra go.opentelemetry.io/otel/sdk CVE-2026-39883 🟠 HIGH v1.40.0 1.43.0 github.com/open-telemetry/opentelemetry-go: OpenTelemetry-Go: Arbitrary code exe
usr/bin/hydra golang.org/x/crypto CVE-2026-56854 🔴 CRITICAL v0.46.0 0.55.0 golang.org/x/crypto/ssh: golang.org/x/crypto/ssh: Authentication bypass due to u
usr/bin/hydra golang.org/x/crypto CVE-2026-39828 🟠 HIGH v0.46.0 0.52.0 golang.org/x/crypto/ssh: golang.org/x/crypto/ssh: Unauthorized command execution
usr/bin/hydra golang.org/x/crypto CVE-2026-39829 🟠 HIGH v0.46.0 0.52.0 golang.org/x/crypto/ssh: golang.org/x/crypto/ssh: Denial of Service via crafted
usr/bin/hydra golang.org/x/crypto CVE-2026-39830 🟠 HIGH v0.46.0 0.52.0 golang.org/x/crypto/ssh: golang.org/x/crypto/ssh: Denial of Service via resource
usr/bin/hydra golang.org/x/crypto CVE-2026-39831 🟠 HIGH v0.46.0 0.52.0 golang.org/x/crypto/ssh: golang.org/x/crypto/ssh: Security key bypass due to mis
usr/bin/hydra golang.org/x/crypto CVE-2026-39832 🟠 HIGH v0.46.0 0.52.0 golang.org/x/crypto/ssh/agent: golang.org/x/crypto/ssh/agent: Security bypass du
usr/bin/hydra golang.org/x/crypto CVE-2026-39835 🟠 HIGH v0.46.0 0.52.0 golang.org/x/crypto/ssh: golang: golang.org/x/crypto/ssh: Denial of Service via
usr/bin/hydra golang.org/x/crypto CVE-2026-42508 🟠 HIGH v0.46.0 0.52.0 golang.org/x/crypto/ssh/knownhosts: golang: golang.org/x/crypto/ssh/knownhosts:
usr/bin/hydra golang.org/x/crypto CVE-2026-46595 🟠 HIGH v0.46.0 0.52.0 golang.org/x/crypto/ssh: golang.org/x/crypto/ssh: Authorization bypass due to sk
usr/bin/hydra golang.org/x/crypto CVE-2026-46597 🟠 HIGH v0.46.0 0.52.0 golang.org/x/crypto/ssh: golang.org/x/crypto/ssh: Denial of Service via crafted
usr/bin/hydra golang.org/x/crypto CVE-2026-39827 🟡 MEDIUM v0.46.0 0.52.0 golang.org/x/crypto/ssh: golang: golang.org/x/crypto/ssh: Denial of Service via
usr/bin/hydra golang.org/x/crypto CVE-2026-39833 🟡 MEDIUM v0.46.0 0.52.0 golang.org/x/crypto/ssh/agent: golang.org/x/crypto/ssh/agent: Security bypass du
usr/bin/hydra golang.org/x/crypto CVE-2026-39834 🟡 MEDIUM v0.46.0 0.52.0 golang.org/x/crypto/ssh: golang: golang.org/x/crypto/ssh: Denial of Service due
usr/bin/hydra golang.org/x/crypto CVE-2026-46598 🟡 MEDIUM v0.46.0 0.52.0 golang.org/x/crypto/ssh/agent: golang: golang.org/x/crypto/ssh/agent: Denial of
usr/bin/hydra golang.org/x/mod CVE-2026-56864 🟠 HIGH v0.30.0 0.40.0 A malicious GOSUMDB was capable of serving arbitrary module content no ...
usr/bin/hydra golang.org/x/mod CVE-2026-56865 🟠 HIGH v0.30.0 0.40.0 golang.org/x/mod/sumdb/tlog: golang.org/x/mod/sumdb/tlog: Supply chain compromis
usr/bin/hydra golang.org/x/net CVE-2026-25681 🟠 HIGH v0.48.0 0.55.0 golang.org/x/net/html: golang.org/x/net/html: Arbitrary code execution via Cross
usr/bin/hydra golang.org/x/net CVE-2026-27136 🟠 HIGH v0.48.0 0.55.0 golang.org/x/net/html: golang: golang.org/x/net/html: Cross-Site Scripting via H
usr/bin/hydra golang.org/x/net CVE-2026-33814 🟠 HIGH v0.48.0 0.53.0 net/http/internal/http2: golang: golang.org/x/net: Go HTTP/2: Denial of Service
usr/bin/hydra golang.org/x/net CVE-2026-39821 🟠 HIGH v0.48.0 0.55.0 golang.org/x/net/idna: golang: net/http: golang.org/x/net/idna: Privilege escala
usr/bin/hydra golang.org/x/net CVE-2026-46600 🟠 HIGH v0.48.0 0.56.0 golang.org/x/net/dns/dnsmessage: golang.org/x/net/dns/dnsmessage: Denial of Serv
usr/bin/hydra golang.org/x/net CVE-2026-25680 🟡 MEDIUM v0.48.0 0.55.0 golang.org/x/net/html: golang.org/x/net/html: Denial of Service due to excessive
usr/bin/hydra golang.org/x/net CVE-2026-42502 🟡 MEDIUM v0.48.0 0.55.0 golang.org/x/net/html: golang: golang.org/x/net/html: Cross-Site Scripting via u
usr/bin/hydra golang.org/x/net CVE-2026-42506 🟡 MEDIUM v0.48.0 0.55.0 golang.org/x/net/html: golang.org/x/net/html: Cross-Site Scripting (XSS) via arb
usr/bin/hydra golang.org/x/text CVE-2026-56852 🟠 HIGH v0.32.0 0.39.0 golang.org/x/text: golang.org/x/text: Denial of Service via invalid UTF-8 input
usr/bin/hydra google.golang.org/grpc GHSA-hrxh-6v49-42gf 🟠 HIGH v1.79.3 1.82.1 gRPC-Go: xDS RBAC and HTTP/2 Vulnerabilities
usr/bin/hydra stdlib CVE-2026-25679 🟠 HIGH v1.26.0 1.25.8, 1.26.1 net/url: Incorrect parsing of IPv6 host literals in net/url
usr/bin/hydra stdlib CVE-2026-27137 🟠 HIGH v1.26.0 1.26.1 crypto/x509: Incorrect enforcement of email constraints in crypto/x509
usr/bin/hydra stdlib CVE-2026-27145 🟠 HIGH v1.26.0 1.25.11, 1.26.4 crypto/x509: golang: golang crypto/x509: Denial of Service via excessive process
usr/bin/hydra stdlib CVE-2026-32280 🟠 HIGH v1.26.0 1.25.9, 1.26.2 crypto/x509: crypto/tls: golang: Go: Denial of Service vulnerability in certific
usr/bin/hydra stdlib CVE-2026-32281 🟠 HIGH v1.26.0 1.25.9, 1.26.2 crypto/x509: golang: Go crypto/x509: Denial of Service via inefficient certifica
usr/bin/hydra stdlib CVE-2026-32283 🟠 HIGH v1.26.0 1.25.9, 1.26.2 crypto/tls: golang: Go crypto/tls: Denial of Service via multiple TLS 1.3 key up
usr/bin/hydra stdlib CVE-2026-33810 🟠 HIGH v1.26.0 1.26.2 crypto/x509: golang: Go crypto/x509: Certificate validation bypass due to incorr
usr/bin/hydra stdlib CVE-2026-33811 🟠 HIGH v1.26.0 1.25.10, 1.26.3 net: golang: Go net package: Denial of Service via long CNAME response in Lookup
usr/bin/hydra stdlib CVE-2026-33814 🟠 HIGH v1.26.0 1.25.10, 1.26.3 net/http/internal/http2: golang: golang.org/x/net: Go HTTP/2: Denial of Service
usr/bin/hydra stdlib CVE-2026-33818 🟠 HIGH v1.26.0 1.25.13, 1.26.6, 1.27.0-rc.3 encoding/asn1: golang: Go encoding/asn1: Denial of Service via excessive recursi
usr/bin/hydra stdlib CVE-2026-39820 🟠 HIGH v1.26.0 1.25.10, 1.26.3 net/mail: golang: Go net/mail: Denial of Service via crafted email inputs
usr/bin/hydra stdlib CVE-2026-39821 🟠 HIGH v1.26.0 1.25.13, 1.26.6, 1.27.0-rc.3 golang.org/x/net/idna: golang: net/http: golang.org/x/net/idna: Privilege escala
usr/bin/hydra stdlib CVE-2026-39822 🟠 HIGH v1.26.0 1.25.12, 1.26.5, 1.27.0-rc.2 golang: Go os.Root: Symlink following vulnerability allows directory traversal
usr/bin/hydra stdlib CVE-2026-39836 🟠 HIGH v1.26.0 1.25.10, 1.26.3 net: golang: Go net package: Denial of Service via NUL byte in Dial and LookupPo
usr/bin/hydra stdlib CVE-2026-42499 🟠 HIGH v1.26.0 1.25.10, 1.26.3 net/mail: golang: net/mail: Denial of Service via pathological email address par
usr/bin/hydra stdlib CVE-2026-42504 🟠 HIGH v1.26.0 1.25.11, 1.26.4 mime: golang: Golang MIME: Denial of Service via maliciously-crafted MIME header
usr/bin/hydra stdlib CVE-2026-46600 🟠 HIGH v1.26.0 1.26.6, 1.27.0-rc.3 golang.org/x/net/dns/dnsmessage: golang.org/x/net/dns/dnsmessage: Denial of Serv
usr/bin/hydra stdlib CVE-2026-56853 🟠 HIGH v1.26.0 1.25.13, 1.26.6, 1.27.0-rc.3 net/http: golang: Go net/http: Unencrypted HTTP/2 connections vulnerable to Deni
usr/bin/hydra stdlib CVE-2026-56858 🟠 HIGH v1.26.0 1.25.13, 1.26.6, 1.27.0-rc.3 html/template: golang: Go html/template: Cross-Site Scripting via pathological i
usr/bin/hydra stdlib CVE-2026-56859 🟠 HIGH v1.26.0 1.25.13, 1.26.6, 1.27.0-rc.3 encoding/xml: golang: Go: Denial of Service via XML decoding recursion depth iss
usr/bin/hydra stdlib CVE-2026-56860 🟠 HIGH v1.26.0 1.25.13, 1.26.6, 1.27.0-rc.3 net/url: golang: golang net/url: Denial of Service from quadratic complexity in
usr/bin/hydra stdlib CVE-2026-56862 🟠 HIGH v1.26.0 1.25.13, 1.26.6, 1.27.0-rc.3 crypto/tls: golang: Golang crypto/tls: Denial of Service via indefinite KeyUpdat
usr/bin/hydra stdlib CVE-2026-27142 🟡 MEDIUM v1.26.0 1.25.8, 1.26.1 html/template: URLs in meta content attribute actions are not escaped in html/te
usr/bin/hydra stdlib CVE-2026-32282 🟡 MEDIUM v1.26.0 1.25.9, 1.26.2 golang: internal/syscall/unix: Root.Chmod can follow symlinks out of the root
usr/bin/hydra stdlib CVE-2026-32288 🟡 MEDIUM v1.26.0 1.25.9, 1.26.2 archive/tar: golang: Go's archive/tar package: Denial of Service via maliciously
usr/bin/hydra stdlib CVE-2026-32289 🟡 MEDIUM v1.26.0 1.25.9, 1.26.2 html/template: golang: html/template: Cross-Site Scripting (XSS) via improper co
usr/bin/hydra stdlib CVE-2026-39823 🟡 MEDIUM v1.26.0 1.25.10, 1.26.3 html/template: golang: Go html/template: Cross-Site Scripting via improper URL e
usr/bin/hydra stdlib CVE-2026-39825 🟡 MEDIUM v1.26.0 1.25.10, 1.26.3 net/http/httputil: golang: net/http/httputil: ReverseProxy forwards hidden query
usr/bin/hydra stdlib CVE-2026-39826 🟡 MEDIUM v1.26.0 1.25.10, 1.26.3 html/template: golang: html/template: Cross-site scripting due to incorrect scri
usr/bin/hydra stdlib CVE-2026-42505 🟡 MEDIUM v1.26.0 1.25.12, 1.26.5, 1.27.0-rc.2 crypto/tls: golang: Go crypto/tls: Information disclosure in Encrypted Client He
usr/bin/hydra stdlib CVE-2026-42507 🟡 MEDIUM v1.26.0 1.25.11, 1.26.4 net/textproto: golang: Golang net/textproto: Misleading error messages via input
usr/bin/hydra stdlib CVE-2026-27138 ⚪ LOW v1.26.0 1.26.1 crypto/x509: Panic in name constraint checking for malformed certificates in cry
usr/bin/hydra stdlib CVE-2026-27139 ⚪ LOW v1.26.0 1.25.8, 1.26.1 os: FileInfo can escape from a Root in golang os module

Commit: dc55643

@github-actions

github-actions Bot commented Aug 31, 2026

Copy link
Copy Markdown

Vulnerability Scan: Passed — diode-reconciler

Image: diode-reconciler:scan

No vulnerabilities found.

Commit: dc55643

@github-actions

github-actions Bot commented Aug 31, 2026

Copy link
Copy Markdown

Go test coverage

STATUS ELAPSED PACKAGE COVER PASS FAIL SKIP
🟢 PASS 1.40s github.com/netboxlabs/diode/diode-server/auth 57.4% 78 0 0
🟢 PASS 0.72s github.com/netboxlabs/diode/diode-server/auth/cli 0.0% 0 0 0
🟢 PASS 1.04s github.com/netboxlabs/diode/diode-server/authutil 82.8% 5 0 0
🟢 PASS 0.13s github.com/netboxlabs/diode/diode-server/dbstore/postgres 0.0% 0 0 0
🟢 PASS 1.10s github.com/netboxlabs/diode/diode-server/entityhash 79.2% 13 0 0
🟢 PASS 1.10s github.com/netboxlabs/diode/diode-server/entitymatcher 82.8% 97 0 0
🟢 PASS 0.07s github.com/netboxlabs/diode/diode-server/errors 0.0% 0 0 0
🟢 PASS 1.14s github.com/netboxlabs/diode/diode-server/graph 52.0% 81 0 0
🟢 PASS 1.03s github.com/netboxlabs/diode/diode-server/grpckeepalive 100.0% 1 0 0
🟢 PASS 1.43s github.com/netboxlabs/diode/diode-server/ingester 85.4% 66 0 0
🟢 PASS 1.09s github.com/netboxlabs/diode/diode-server/matching 94.1% 66 0 0
🟢 PASS 1.06s github.com/netboxlabs/diode/diode-server/migrator 70.4% 4 0 0
🟢 PASS 3.11s github.com/netboxlabs/diode/diode-server/netboxdiodeplugin 46.8% 23 0 0
🟢 PASS 0.14s github.com/netboxlabs/diode/diode-server/pprof 0.0% 0 0 0
🟢 PASS 9.76s github.com/netboxlabs/diode/diode-server/reconciler 75.0% 106 0 0
🟢 PASS 0.09s github.com/netboxlabs/diode/diode-server/reconciler/changeset 0.0% 0 0 0
🟢 PASS 1.05s github.com/netboxlabs/diode/diode-server/reconciler/differ 49.3% 23 0 0
🟢 PASS 1.01s github.com/netboxlabs/diode/diode-server/server 85.7% 14 0 0
🟢 PASS 1.01s github.com/netboxlabs/diode/diode-server/strcase 100.0% 24 0 0
🟢 PASS 1.02s github.com/netboxlabs/diode/diode-server/telemetry 26.2% 26 0 0
🟢 PASS 1.01s github.com/netboxlabs/diode/diode-server/telemetry/otel 90.2% 25 0 0
🟢 PASS 1.01s github.com/netboxlabs/diode/diode-server/tls 65.2% 6 0 0
🟢 PASS 1.01s github.com/netboxlabs/diode/diode-server/version 100.0% 2 0 0

Total coverage: 56.7%

@github-actions

github-actions Bot commented Aug 31, 2026

Copy link
Copy Markdown

Vulnerability Scan: Passed — diode-ingester

Image: diode-ingester:scan

No vulnerabilities found.

Commit: dc55643

@leoparente

Copy link
Copy Markdown
Contributor Author

@codex review

@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Aug 31, 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-08-31T16:24:32.293864Z 44e8645 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.

At boot the default-branch fetch races OAuth client bootstrap. When it
loses, NetBox answers 403 Invalid token, the refresher logs a warning and
leaves the cache cold, and both processors carry on:

    branchID := ""
    if branch, err := p.ops.DefaultBranch(ctx); err == nil && branch != nil {
        branchID = branch.ID
    }
    results := p.ops.BulkPlanApply(ctx, batch, branchID)

A cold cache returns (nil, nil), so err is nil and branch is nil, and the
empty branchID is indistinguishable from "no default branch is configured".
Work is planned and applied against main, bypassing the branch's approval
boundary, until the next refresh up to DefaultBranchRefreshInterval (5m)
later. There was no retry: one attempt, then a full interval.

HasBranchLoaded() already existed to tell those two states apart, but it
was only ever read for a log field and was not on the interface the
processors consume, so no caller could act on it.

Put it on IngestionProcessorOps and gate both poll loops on it, before
claiming rather than after, so deferred work stays queued instead of
stranded in a claimed state. Retry the initial fetch with backoff (1s
doubling to 30s) so the boot race resolves in seconds rather than keeping
processors idle for five minutes.

Deliberately gated on HasBranchLoaded() rather than on branch presence:
"no default branch configured" must stay a fast path, so single-tenant
deployments are unaffected.

Tests: both processors are asserted to claim nothing while the cache is
cold, verified to fail when the gate is removed; the refresher is asserted
to recover from an initial 403 well inside the refresh interval. Existing
processor tests stub the new method. Full suite and golangci-lint pass.

Fixes #553

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@leoparente
leoparente force-pushed the fix/reconciler-branch-boot-race branch from 14d723a to 97102bb Compare August 31, 2026 16:04
@leoparente
leoparente marked this pull request as draft August 31, 2026 16:04

@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: 14d723adea

ℹ️ 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 diode-server/reconciler/ingestion_log_processor.go Outdated
The gate is re-evaluated on every poll iteration by every worker, so the
warning fired once per idle interval per worker for as long as the cache
stayed cold. The backoff bounds that for a boot race, but misconfigured
credentials keep the cache cold indefinitely, and the interval scales with
INGESTION_LOG_PROCESSOR_CONCURRENCY / AUTO_APPLY_PROCESSOR_CONCURRENCY.

Track the cold state in an atomic.Bool and log on the transition into it,
leaving per-attempt diagnostics to the branch refresher. Also log on the way
out, so operators get both ends of the window rather than a warning with no
matching recovery.

Caught in review by Codex on #586.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@leoparente

Copy link
Copy Markdown
Contributor Author

@codex review

@chatgpt-codex-connector

Copy link
Copy Markdown

Codex Review: Didn't find any major issues. 🚀

Reviewed commit: 44e86456ea

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

@leoparente leoparente self-assigned this Sep 1, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

reconciler: default-branch refresh races OAuth at boot leading to branchless applies to main

1 participant