Skip to content

Release v3.8.50: upstream main sync handoff - #10036

Closed
ChristianBirke wants to merge 1999 commits into
diegosouzapw:mainfrom
ChristianBirke:codex/pr-8875-merge
Closed

Release v3.8.50: upstream main sync handoff#10036
ChristianBirke wants to merge 1999 commits into
diegosouzapw:mainfrom
ChristianBirke:codex/pr-8875-merge

Conversation

@ChristianBirke

Copy link
Copy Markdown

Summary

Fork-only replacement handoff for upstream PR #8875, Release v3.8.50.

This branch merges the latest upstream main into the verified release candidate and preserves the release branch intent. The original upstream branch was not modified.

Source and target

  • Source: ChristianBirke:codex/pr-8875-merge
  • Source commit: 4c3f70565f9c59f5be7efdb269a39ed62f99afc1
  • Target: diegosouzapw:main
  • Related PR: Release v3.8.50 #8875

Please review this PR as the fork-based replacement for #8875 and close/supersede the original PR after confirming the diff.

Merge resolution

  • Merged upstream main at 918fba5e392ce8b137976349f035597196edc440.
  • Resolved the .gitignore conflict by retaining the release branch's .playwright-cli rule.
  • The merge commit has parents 25817aa5b30a3b29aa0186bb8bd6553ab708a2df and 918fba5e392ce8b137976349f035597196edc440.

Included release-side changes

In addition to the release branch content, the candidate includes the already-reviewed local changes in:

  • .github/workflows/npm-publish.yml
  • docs/ROADMAP.md
  • src/shared/middleware/chatBodyAdmission.ts

Validation

  • Focused admission test: 14/14 passed.
  • npm run typecheck:core: passed.
  • npm run lint: passed.
  • npm run build: passed.
  • The full unit baseline was not claimed green because tests/unit/quota-redis-store.test.ts opens an unavailable local Redis endpoint on port 6399 and leaves its retry loop active in this environment.

Maintainer action

Review the complete release diff and merge this fork PR when satisfied. No upstream permissions or upstream branches were changed by this handoff.

dependabot Bot and others added 30 commits August 7, 2026 20:53
…egosouzapw#9461)

Merge-train validated (tip 6ce4effef8). Vitest failures confirmed as base-red (diegosouzapw#9679).
…pw#9462)

Merge-train validated (tip 6ce4effef8). Vitest failures confirmed as base-red (diegosouzapw#9679).
)

Merge-train validated (tip 6ce4effef8). Vitest failures confirmed as base-red (diegosouzapw#9679).
Merge-train validated (tip 6ce4effef8). Vitest failures confirmed as base-red (diegosouzapw#9679).
…onstant (diegosouzapw#9482)

Merge-train validated (tip 6ce4effef8). Vitest failures confirmed as base-red (diegosouzapw#9679).
…egosouzapw#9483)

Merge-train validated (tip 6ce4effef8). Vitest failures confirmed as base-red (diegosouzapw#9679).
…#9494)

Merge-train validated (tip 6ce4effef8). Vitest failures confirmed as base-red (diegosouzapw#9679).
…iegosouzapw#9513)

Merge-train validated (tip 6ce4effef8). Vitest failures confirmed as base-red (diegosouzapw#9679).
Merge-train validated (tip 6ce4effef8). Vitest failures confirmed as base-red (diegosouzapw#9679).
Merge-train validated (tip 6ce4effef8). Vitest failures confirmed as base-red (diegosouzapw#9679).
Merge-train validated (tip 6ce4effef8). Vitest failures confirmed as base-red (diegosouzapw#9679).
Merge-train validated (tip 6ce4effef8). Vitest failures confirmed as base-red (diegosouzapw#9679).
Merge-train validated (tip 6ce4effef8). Vitest failures confirmed as base-red (diegosouzapw#9679).
Merge-train validated (tip 6ce4effef8). Vitest failures confirmed as base-red (diegosouzapw#9679).
Merge-train validated (tip 6ce4effef8). Vitest failures confirmed as base-red (diegosouzapw#9679).
…iegosouzapw#9580)

Merge-train validated (tip 6ce4effef8). Vitest failures confirmed as base-red (diegosouzapw#9679).
Merge-train validated (tip 6ce4effef8). Vitest failures confirmed as base-red (diegosouzapw#9679).
…iegosouzapw#9573) (diegosouzapw#9610)

Merge-train validated (tip 6ce4effef8). Vitest failures confirmed as base-red (diegosouzapw#9679).
…iegosouzapw#9628)

Merge-train validated (tip 6ce4effef8). Vitest failures confirmed as base-red (diegosouzapw#9679).
…the whole connection (diegosouzapw#9635)

Merge-train validated (tip 6ce4effef8). Vitest failures confirmed as base-red (diegosouzapw#9679).
…souzapw#9570) (diegosouzapw#9668)

Merge-train validated (tip 6ce4effef8). Vitest failures confirmed as base-red (diegosouzapw#9679).
Flip two heavy/noisy defaults to reduce resource load and log volume:

- CALL_LOG_PIPELINE_CAPTURE_STREAM_CHUNKS now defaults to false.
  Stream chunks are the largest call-log artifact; capturing them on
  every request by default is what grows ~/.omniroute/call_logs by
  hundreds of MB in days. Operators can re-enable with =true.
- OMNIROUTE_LOG_REQUEST_SHAPE now logs only when explicitly set to
  "1" (was: enabled unless set to "0"). Large-body diagnostics
  are debug tooling, not default behavior.

Docs (.env.example + ENVIRONMENT.md) updated to match the new defaults.
…apw#9745)

Two files both claimed migration version 135:
135_connection_runtime_state.sql (diegosouzapw#9449, landed 2026-08-07) and
135_migrate_model_capability_max_token.sql (diegosouzapw#8908, landed 2026-08-05).
diegosouzapw#9449 branched before diegosouzapw#8908 merged and never got renumbered before
landing on release/v3.8.50.

This is not cosmetic: getMigrationFiles() throws "Migration version
collision detected" the moment ANY code path first touches the
database (getDbInstance() -> runMigrations()), which means a
completely fresh install/deploy from this branch cannot even boot —
confirmed live against a freshly built container while testing
unrelated live-verification tooling.

Renumbered the later-landing file to 140 (the next free slot) and
added the matching isSchemaAlreadyApplied("140") retroactive guard in
migrationRunner.ts, so a DB that already ran this migration under the
old 135 number isn't treated as needing a fresh application. This
matches the established pattern already used for the prior 135/136 ->
137/138 renumber in the same file (also caused by the same recurring
branch-before-merge numbering race).

Test plan:
- TDD: new tests/unit/migration-135-numbering-collision.test.ts (2/2)
  — spins up a hermetic fresh DB and confirms getDbInstance() applies
  every real on-disk migration without throwing, plus confirms both
  formerly-135 migrations' effects are present. Confirmed failing
  (reproducing the exact live crash) with the pre-fix colliding
  filenames restored, passing after the rename.
- npm run typecheck:core — clean
- npm run lint — clean
- npm run check:file-size — clean (migrationRunner.ts rebaselined
  1084->1094 for the new guard case)
- Full migration-runner + migration-numbering test suites (64 tests
  across 6 files) — all pass, no regressions
_tasks is a SEPARATE nested git repo (gitignored). A self-referential symlink
_tasks -> its own path was tracked here; every pull materialized it over the real
_tasks repo, destroying plans/specs/hands-off. Now untracked (and /_tasks in
.gitignore prevents re-capture).
…/input_image + modalityBridge settings (diegosouzapw#9759)

* feat(sse): unified media-part detection helper (image+audio, input_image)

* refactor(guardrails): extractImageParts/comboStructure delegate to unified media detector

* fix(sse): media detector — audio parts no longer shadow sibling/nested image indicators

* fix(guardrails): close extract↔replace contract for input_image (allowlist + splice)

* perf(guardrails): skip media traversal when bridge disabled; short-circuit combo image check

* feat(guardrails): in-memory LRU bridge cache (sha256 keyed)

* feat(settings): modalityBridge* schema with legacy visionBridge* fallback

* feat(db): migrate visionBridge* settings to modalityBridge* (idempotent)

* refactor(guardrails): harden bridge cache key/config + settings resolution (review minors)

* feat(guardrails): vision bridge mode selector (auto/describe/reroute) short-circuit

* feat(guardrails): task-aware vision description prompt (default on)

* feat(guardrails): describe-path cache integration

* docs(guardrails): review polish — cache-key coupling notes + helper header

* feat(guardrails): in-memory bridge stats + modality-bridge response header

* feat(api): modality bridge stats endpoint + header wiring in chat handler

* docs(guardrails): document modality bridge mode/task-aware/cache/header + stats endpoint

* chore: untrack _tasks symlink (inherited from base tip; blocks pre-commit tracked-artifacts gate)

* fix(db): renumber modality bridge migration 139->140 (base renumbered ccr_blocks to 139)

* docs(guardrails): migration filename touch-up 139->140

* docs(db): stale comment touch-ups after 139->140 renumber and diegosouzapw#9688 landing

* fix(db): renumber modality bridge migration 140->141 (base renumbered connection_runtime_state to 140)

* test(db): migration test titles 139->141

---------

Co-authored-by: diegosouzapw <diegosouzapw@users.noreply.github.com>
backryun and others added 26 commits August 10, 2026 00:28
Co-authored-by: rinseaid <rinseaid@rinseaid.net>
diegosouzapw#9929)

opencode.ai/zen/v1 rejects non-browser clients (urllib) with 403
error_code 1010 while curl on the same key succeeds. The 403 was
treated as an auth-level failure and two of them crystallized a
misleading ALL_ACCOUNTS_INACTIVE on the free pool.

- errorClassifier: new FINGERPRINT_REJECTION type; a 403 carrying
  error_code 1010 / browser_signature_banned is the CDN refusing the
  client TLS/UA signature, not the account credentials.
- combo/targetExhaustion: fingerprint rejections skip auth-level
  exhaustion so remaining targets stay eligible.
- auth: resolveTerminalConnectionStatus no longer treats the
  fingerprint rejection as a terminal banned account state.

UA passthrough is deliberately untouched: diegosouzapw#5997/diegosouzapw#5720 make the
forward-only behavior load-bearing.

Signed-off-by: Minxi Hou <houminxi@gmail.com>
…zapw#9555)

Co-authored-by: xz-dev <xz-dev@users.noreply.github.com>
Co-authored-by: diegosouzapw <8016841+diegosouzapw@users.noreply.github.com>
Co-authored-by: Antigravity Agent (via Agisota) <agisota@users.noreply.github.com>
Wire Bearer /alpha billing credits and 5h/weekly windows into Provider
Limits and genericQuotaFetcher so dashboard and preflight see live CC quotas.

Co-authored-by: Cursor <cursoragent@cursor.com>
…w#9931)

* fix(executors): preserve non-strict Codex tool semantics

* docs(changelog): add Codex strict semantics fix
…osouzapw#9940)

* fix: add per-connection virtual admission lanes (diegosouzapw#9654)

Worst-day-ever analysis to harden AdaptiveAdmissionController:

- Guard expireEntry() against null entry (CRITICAL null deref)
- Add deleteLane() to drain+reject on LRU eviction (HIGH orphaned promises)
- Fix Map mutation during evictIdleLanes iteration (MEDIUM safety)
- Add ADMISSION_LANE_EVICTED reject code (MEDIUM clarity)
- Pass sessionId to admitChatRequest in route.ts
- virtualLanes defaults to false in validateConfig
- 7 new controller tests + 14 new byte-level admission tests
- Assertions tightened from >= to === (Matt Pocock methodology)

Debunked 2 false positives: concurrency race (single-threaded JS)
and memory amplification (FairCostQueue bounds per-lane).

Fixes diegosouzapw#9654

* fix(admission): restore bounded queue-wait on per-connection lanes (diegosouzapw#9654)

The per-connection lane refactor dropped the bounded queue-wait
(acquireHeavyWithin / #waiters / queueMs). diegosouzapw#9654's acceptance criteria and
diegosouzapw#9608 section C prefer server-side wait/pacing up to defaultMaxWaitMs over
an instant retryable 503.

- ChatAdmissionController: re-add #waiters FIFO + acquireHeavyWithin(timeoutMs);
  queueMs: 0 preserves the instant-503 path
- admitChatStructure and admitChatRequest.reserve are async again and take queueMs
- route: pass CHAT_ADMISSION_QUEUE_MAX_MS and await the admission calls
- per-connection lane tests await the async admitChatStructure

Admission suite: 114/114 pass (bun test, 7 files).

* chore: re-trigger CI after dast-smoke infra cancellation (diegosouzapw#9654)

* feat(admission): cancel queue-wait on client abort (diegosouzapw#9654)

U2 from KC plan 2026-08-09-001. Thread the request AbortSignal through
acquireHeavyWithin so a disconnected client stops parking in the FIFO
for the full queueMs.

- acquireHeavyWithin(timeoutMs, signal?): on abort the waiter is removed
  from the FIFO immediately and the promise resolves null early;
  pre-aborted signals never park; the deadline timer is cleared when
  abort/release wins the race
- admitChatRequest reserve() passes request.signal; admitChatStructure
  gains options.signal; the route threads request.signal
- 5 exact-assertion tests (settle-early, pre-aborted, byte-heavy,
  structural, FIFO-preservation): 119/119 across the 7-file suite

* fix(admission): bound queued bytes for the queue-wait heap valve (diegosouzapw#9654)

U3 from KC plan 2026-08-09-001. The restored queue-wait parks fully-buffered
bodies; without a cap, several large coding-agent bodies (~750 KB) waiting at
once recreates the diegosouzapw#4380 heap amplification this module was built to stop.

- acquireHeavyWithin(timeoutMs, signal?, queuedBytes): each parked waiter is
  charged its buffered size against CHAT_ADMISSION_MAX_QUEUED_BYTES (default
  4 MB); over-budget waits reject immediately with a retryable 503 and never
  park. The charge is released on wake, abort, or timeout.
- Real sizes threaded from admitChatRequest (declared length / sniffed bytes);
  structural waits charge the conservative 256 KB weight.
- Lower default OMNIROUTE_CHAT_ADMISSION_QUEUE_MS to 2000ms (was 5000ms).
- Env vars documented in .env.example; 6 exact-assertion tests: 125/125 across
  the 7-file admission suite (was 119).

* docs: map the two admission-lane systems for operators (diegosouzapw#9654)

U5 from KC plan 2026-08-09-001. Verifies lane metrics are exposed by the health
payload (GET /api/monitoring/health -> adaptiveAdmission -> lane* fields) and
records which lane system reports where: byte-level per-connection lanes (always
on, memory scope) vs adaptive virtual lanes (opt-in via OMNIROUTE_CHAT_VIRTUAL_LANES,
dispatch scope) plus the explicit opt-in ops note.

* docs: add required frontmatter to admission-lanes doc (dast-smoke build fix)

* docs: sync env vars with .env.example and ENVIRONMENT.md (docs gate fix)

* fix(admission): complete REJECT_MAP, literal lane env read, split oversized test file

Three CI-gate fixes surfaced by the post-merge check run (head 3de7716):

1. open-sse-typecheck (TS2741): REJECT_MAP was missing the ADMISSION_LANE_EVICTED
   entry that controller.ts:662 emits on lane eviction. Add the 503 mapping so the
   Record<AdmissionRejectCode, RejectHttpMapping> is total.
2. Docs Gates fabricated-claim: OMNIROUTE_CHAT_VIRTUAL_LANES was read dynamically
   via ENV_KEYS.virtualLanes (env[key]), invisible to the literal env.X scanner.
   Read it literally — behavior-identical, doc claim now verifiable.
3. check:file-size: chat-body-admission.test.ts (1307 lines) exceeded the 1000-line
   new-file cap. Split the queue-wait/abort/heap-valve section into
   chat-body-admission-queue.test.ts (818 + 513 lines, both under cap).

Suite: 125/125 across 8 files. All three checkers pass locally.

* refactor(admission): drop dead ENV_KEYS.virtualLanes entry + lock lane-evicted mapping test

Code-review follow-up on 50c93d2:

1. ENV_KEYS.virtualLanes is now unreferenced since the literal env read landed;
   remove it so the config map only lists keys actually read through the map.
2. Add an exact-assertion runtime test for the ADMISSION_LANE_EVICTED mapping:
   a queued lane waiter evicted by the 60s idle TTL rejects with 503 /
   admission_lane_evicted / Retry-After 1 / sanitized body (no raw tenant key).
   Proves the REJECT_MAP entry end-to-end through buildAdmissionRejectResponse.

Suite: 126/126 (17 in runtime file, 125 in the 8-file admission suite).

---------

Co-authored-by: Brandon Bennett <brandonbennett@macbookair.myfiosgateway.com>
…zapw#9946)

- auto/best-vision and auto/pro-vision now resolve to the vision CATEGORY
  (candidate filter by capability) instead of the flat smart variant, so the
  vision-bridge describe/reroute target can actually see images
  (resolveBuiltinAutoSpec in builtinCatalog).
- vision candidate pool excludes registry entries whose catalog OVERSTATES
  vision support (opencode-go/opencode-zen/tokenrouter are forced through the
  vision bridge by isVisionBridgeForcedModel) in both the auto-combo candidate
  filter (suffixComposition) and the vision router (visionBridgeRouter).
- reroute guard: an auto/* target is a virtual combo; a missing 'auto' provider
  row (hasUsableCredentials=false) must never block the reroute.
- claude-wire backends (minimax, zai, ...) reject remote image URLs (MiniMax
  403 2013): ensureBase64ImagesForClaudeWire resolves URLs to base64 before
  rerouting, and the describe self-loop normalizes to base64 for those targets
  (isClaudeWireFormatModel).
- self-loop describe uses a real DB-backed key (resolveSelfLoopApiKey) instead
  of the sk_omniroute sentinel rejected by REQUIRE_API_KEY instances, and
  bypasses the runtime's hooked global fetch via undici (ProxyFetch with a dead
  local proxy would otherwise break every describe); compression is disabled
  on the self-loop sub-request so image payloads are never mangled.

Tests: vision-bridge-auto-reroute (2), vision-bridge-selfloop-key (4),
vision-bridge-claude-wire (6), builtin-vision-spec (4),
vision-filter-excludes-forced (4).

Co-authored-by: herjarsa <herjarsa@users.noreply.github.com>
…e 1.24.3 (diegosouzapw#9962)

npm ci / next build fail on Node 24/26 because the optional
@huggingface/transformers@3.5.2 pins onnxruntime-node@1.21.0, whose NAN
native code no longer compiles against newer V8 - npm silently skips the
whole optional subtree, and Turbopack fails the build with 'Module not
found: Can't resolve @huggingface/transformers' (lazy import in
src/lib/memory/embedding/transformersLocal.ts).

Fix: move @huggingface/transformers out of optionalDependencies (npm ci
can never skip it), bump to ^4.2.0, add onnxruntime-node ~1.24.3 (napi
prebuilds, no node-gyp). Verified on Node 26.6.0: npm ci + production
build succeed; both packages require() cleanly.
…zen (was top-level)

Co-authored-by: diegosouzapw <8016841+diegosouzapw@users.noreply.github.com>
…duckduckgo search fallback (diegosouzapw#9913)

Co-authored-by: SupremeNexas <SupremeNexas@users.noreply.github.com>
Co-authored-by: diegosouzapw <8016841+diegosouzapw@users.noreply.github.com>
…gate thought-signature bypass sentinel (diegosouzapw#9939)

* fix(deps): bump nanoid, dompurify for 2 new Dependabot alerts (diegosouzapw#189, diegosouzapw#190)

Bumps: nanoid ^3.3.17 (was transitive, now overridden), dompurify ^3.4.13
(with monaco-editor scoped override). Closes Dependabot diegosouzapw#189, diegosouzapw#190.

Remaining diegosouzapw#182-diegosouzapw#188 (js-yaml + mermaid) already closed by diegosouzapw#9651 merge —
awaiting Dependabot re-scan.

npm audit → 0 vulnerabilities.

* fix(repo): harden .gitignore to also ignore a _tasks symlink (/_tasks)

_tasks is a SEPARATE nested git repo (gitignored). The pattern _tasks/ (trailing
slash) ignores only a directory, not a SYMLINK named _tasks. A self-referential
_tasks symlink can slip in via git add -A and, once pulled, checkout materializes
it over the real _tasks repo (destroying plans/specs/hands-off). Anchored /_tasks
ignores the symlink too, preventing re-capture.

* fix(antigravity): ban-safety hardening — bounded onboarding retries with jitter, gate the thought-signature bypass sentinel

- onboardAntigravityUser: cap retries 10->3 and jitter the delay (3-7s) so a
  stuck loop cannot read as scripted automation to the upstream
- openai-to-gemini: the skip_thought_signature_validator sentinel is an
  audit-trail risk; gate it behind ANTIGRAVITY_ALLOW_SIGNATURE_BYPASS (default
  enabled for compatibility, set 0 to disable). Real signatures always win.

* test(antigravity): cover the signature-bypass sentinel gate (default on, env-disabled)

Adds tests/unit/translator-antigravity-signature-bypass.test.ts (2 tests, verified
locally with node --import tsx/esm) + CHANGELOG entry for the ban-safety hardening.

---------

Co-authored-by: diegosouzapw <diegosouzapw@users.noreply.github.com>
Co-authored-by: Diego Rodrigues de Sa e Souza <diegosouza.pw@outlook.com>
Co-authored-by: diegosouzapw <diegosouza.pw@gmail.com>
Co-authored-by: benzntech <benzntech@users.noreply.github.com>
Co-authored-by: diegosouzapw <8016841+diegosouzapw@users.noreply.github.com>
…iegosouzapw#9911)

* feat(cursor): prefer live synced catalog for listing and Test All

When an active synced Cursor catalog exists, list only live models plus
injected auto routers (and customs). Keep the static registry as offline
fallback.

Co-authored-by: Cursor <cursoragent@cursor.com>

* fix(cursor): send live-catalog model ids verbatim on AgentRun

Skip diegosouzapw#7289 effort/reasoning splits when the exact id is in the active synced
Cursor catalog so AgentRun does not rewrite flattened live ids into missing
bases that return AI Model Not Found. Also wires auto-cost/balance/intelligence
to default + optimization for the injected routers.

Co-authored-by: Cursor <cursoragent@cursor.com>

---------

Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: yansigit <yansigit@users.noreply.github.com>
…y cannot spawn (diegosouzapw#9937)

* fix(deps): bump nanoid, dompurify for 2 new Dependabot alerts (diegosouzapw#189, diegosouzapw#190)

Bumps: nanoid ^3.3.17 (was transitive, now overridden), dompurify ^3.4.13
(with monaco-editor scoped override). Closes Dependabot diegosouzapw#189, diegosouzapw#190.

Remaining diegosouzapw#182-diegosouzapw#188 (js-yaml + mermaid) already closed by diegosouzapw#9651 merge —
awaiting Dependabot re-scan.

npm audit → 0 vulnerabilities.

* fix(repo): harden .gitignore to also ignore a _tasks symlink (/_tasks)

_tasks is a SEPARATE nested git repo (gitignored). The pattern _tasks/ (trailing
slash) ignores only a directory, not a SYMLINK named _tasks. A self-referential
_tasks symlink can slip in via git add -A and, once pulled, checkout materializes
it over the real _tasks repo (destroying plans/specs/hands-off). Anchored /_tasks
ignores the symlink too, preventing re-capture.

* fix(services): stop embedded-service supervisor retry loop when binary cannot spawn

A non-spawnable supervised binary (ENOENT/EACCES, or an ELF on Windows
where spawn() throws EFTYPE synchronously) left the supervisor in
'starting' forever while the HealthChecker polled the dead port every
healthIntervalMs. Each failed probe fired a full ProxyFetch
dispatcher+native fetch pair, burning CPU and eventually collapsing the
server (observed: 24 warns/min against 127.0.0.1:8317 for 2 days).

- handle synchronous spawn() throws and the child 'error' event: stop
  the poller and transition to an explicit error state
- transition to error and stop polling when FAILURE_THRESHOLD
  consecutive health probes fail, including during startup
- waitForHealthy re-checks the state after its deadline so a
  mid-startup error surfaces as a rejection instead of being overwritten
  by 'running'

---------

Co-authored-by: diegosouzapw <diegosouzapw@users.noreply.github.com>
Co-authored-by: Diego Rodrigues de Sa e Souza <diegosouza.pw@outlook.com>
Co-authored-by: diegosouzapw <diegosouza.pw@gmail.com>
Co-authored-by: herjarsa <herjarsa@users.noreply.github.com>
Co-authored-by: rinseaid <rinseaid@rinseaid.net>
Co-authored-by: rinseaid <rinseaid@users.noreply.github.com>
diegosouzapw#10018)

Co-authored-by: diegosouzapw <diegosouzapw@users.noreply.github.com>
…souzapw#9927) (diegosouzapw#10019)

Co-authored-by: diegosouzapw <diegosouzapw@users.noreply.github.com>
diegosouzapw#10020)

Co-authored-by: diegosouzapw <diegosouzapw@users.noreply.github.com>
…souzapw#9934) (diegosouzapw#10022)

Co-authored-by: diegosouzapw <diegosouzapw@users.noreply.github.com>
@ChristianBirke
ChristianBirke marked this pull request as ready for review August 10, 2026 17:21
@diegosouzapw

Copy link
Copy Markdown
Owner

Thank you for the sync handoff and the .gitignore conflict resolution! We kept #8875 as the living release PR for the cycle — the CHANGELOG for the whole v3.8.50 cycle has now been reconciled directly on release/v3.8.50 (#10189), and the main back-merge will be applied straight on the branch when we cut the release. Closing this one as superseded; the conflict-resolution insight was incorporated. Appreciated!

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.