Skip to content

[WRONG BRANCH] release: promote verified 2.49.0 product tree to preview - #4116

Merged
lidge-jun merged 135 commits into
previewfrom
codex/release-249-preview-01a08498
Sep 9, 2026
Merged

[WRONG BRANCH] release: promote verified 2.49.0 product tree to preview#4116
lidge-jun merged 135 commits into
previewfrom
codex/release-249-preview-01a08498

Conversation

@lidge-jun

Copy link
Copy Markdown
Owner

Summary

Promote audited product baseline ad36c7be8913f4367fed0f3fa46acd2224914c7a into preview as 2.49.0-preview.20260909. The owner explicitly authorized main and preview promotions and instructed these promotion PRs to merge immediately without querying or waiting for pre-merge CI. This is owner-directed PR-only integration, not an independent approving review or a claim that every PR check passed.

The preview branch is synchronized to this product tree; no separate npm preview publication is planned. The npm preview dist-tag remains on its previously published version.

Development version pre-move #4115 is already merged: dev carries 2.50.0; no 2.50 package is being released. This branch preserves the original source commits and authors, including the composed-schema repair #4113.

Verification

  • Promotion head ad18c27d9c2e7b579d4c34f7a8f6386e5af44156 is tree-identical to the audited product baseline except the single package.json channel-version line. Preview conflict resolution was confined to that version line; main composed without conflict.
  • Full development CI 34348082430 passed 26/26 jobs, including all Windows shards and macOS control. Service 34348086831 passed 3/3 on that same baseline.
  • Product proof reuses this exact-tree baseline; no new full matrix on the promotion SHA is claimed. Its own push-event CI and service checks must pass after merge before publication. Release uses expected-sha and a dry-run before publishing.
  • Local product tests/typecheck/build/install: NOT RUN under the owner restriction.
  • enforce-target permits dev/child bases and may reject this maintainer release promotion. This known target-policy exception is explicitly authorized for main/preview, as in [WRONG BRANCH] release: promote 2.48.0 to preview #4010/[WRONG BRANCH] release: promote 2.48.0 to main #4011; no rule or check is modified and a failing check is not relabeled green.
  • Inherited GUI visual baseline below shows the compaction control layout; its explanatory hint predates the current source text. Current English/Korean hint changes were source-reviewed and covered by remote checks; no fresh local render is claimed.

Inherited compaction control visual baseline

Checklist

  • Scope stays focused and avoids unrelated cleanup.
  • Docs or release notes were updated when needed; the release workflow generates the channel changelog.
  • Security-sensitive changes were reviewed for secrets, auth, and unsafe defaults in the accepted source/corrective PRs.

lidge-jun and others added 30 commits September 8, 2026 19:14
chore(release): open dev at 2.49.0 before releasing 2.48.0
docs(devlog): archive the 2.48.0 release train record
The carried CodeBuddy commits predate the tests/ modularization, so their
two test files landed at the tests/ root where the layout guard rejects
them. Move them under tests/providers and register both in layout.json
and the expected-layout fixture.
Same drift as the CodeBuddy layer: the carried Qoder commit predates the
tests/ modularization. Move both files under tests/providers and register
them in layout.json and the expected-layout fixture.
…rors

The Qoder catalog branch was written against the pre-#3601 shape of
provider-fetch.ts, so it merged cleanly while dropping captured.effectiveAlias
from all four hint applications; a Qoder row would carry whatever alias the
cached row already held instead of the decision captured at flight admission.

The shared coding-agent result classifier matched the bare word
authentication anywhere in vendor text, turning transient upstream wording
into a 401 credential verdict that drives reauth messaging and key-pool
rotation. Anchor it to credential phrasing; the existing 'Not logged in;
invalid token' fixture still classifies as 401.
…3989)

Configure `sourcePreservingYaml: { path: ["providers", "opencodex"] }` for
Hermes Agent in `INTEGRATION_CLIENTS`.

Hermes Agent is a multi-provider autonomous agent whose configuration
(`~/.hermes/config.yaml`) typically hosts multiple providers, vision models,
and comments. Previously, Hermes was registered without source preservation,
causing `classifyIntegration` to fail-closed (`state: "conflict", reason: "foreign-edit"`)
whenever a user modified sibling providers or comments. In the dashboard UI,
this locked the toggle and threatened a destructive full-file restore ("Replace").

By giving Hermes source-preserving YAML semantics (joining OMP and DSH):
- OpenCodex mutates only `providers.opencodex` in-place.
- Sibling provider configurations, user comments, and formatting remain untouched.
- Unit and invariant test suites updated with dedicated regression coverage.
- Public documentation in `guides/integrations.md` updated accordingly.

Closes #3989

(cherry picked from commit a1fe9ca)
…ss Gemini and CCA

Google Gemini (via Cloud Code Assist / Antigravity, Vertex AI, and AI Studio)
rejects requests whose conversation history ends on a model turn with HTTP 400
INVALID_ARGUMENT ("Requests ending with a model turn are not supported.").

Previously, the continue nudge was only attached for Claude-on-Antigravity under
the assumption that Gemini natively accepts model-tail histories. In practice,
autonomous multi-turn loops (such as subagent orchestration and continuation turns
in Codex CLI) produce histories ending in an assistant message, triggering the 400.

This patch:
- Injects a synthetic user `(continue)` nudge in `messagesToGeminiFormat` whenever
  the reconstructed `contents` ends with `role: "model"` or is empty.
- Broadens the post-replay Antigravity tail check to cover all Google models.
- Updates unit tests to verify that Gemini 3.7 Flash, Gemini 3.8 Flash, and
  AI Studio endpoints all receive the continue nudge on model-tail contexts.

Co-authored-by: CommandCodeBot <noreply@commandcode.ai>
(cherry picked from commit 1837b8f)
qoder and qoder-cn landed without an icon alias or display name, so the
dashboard drew them as an initial tile with a raw config id underneath;
codebuddy and codebuddy-cn had the same gap. Every other first-class provider
carries both.

Qoder ships its own square symbol as the declared site icon, byte-identical
across qoder.com, qoder.cn, qoder.com.cn and the schema.org Organization
logo, and neither terms document restricts its use; it is committed
verbatim and wired to both ids. CodeBuddy keeps the initials tile on purpose:
section 9.3 of the Tencent service agreement forbids using Tencent brand
features under any circumstances without written consent. Both decisions,
with sources and clauses, are recorded in the provider-icons README so the
refusal is not silently re-litigated.

Also publishes the Qoder Global/CN section in the docs-site providers guide
(the repo-level docs/qoder-cli-provider.md is not built) and lists the
qoder adapter in the configuration reference.
…ervation

The English guide now lists Hermes with OMP and DSH as source-preserving
YAML writers; the French and Traditional Chinese pages still named it among
the clients whose switch locks on sibling edits, contradicting runtime
behaviour.
The carried change added the nudge to messagesToGeminiFormat for every
Google mode and also widened the post-replay Antigravity check from
Claude-only to all models, leaving two injection sites on one request. The
second is only a no-op while nothing between them reshapes the tail; the
signature sanitizer can. Drop the post-replay copy so the formatter owns the
invariant.
feat(provider): add official CodeBuddy Global and CN providers (carry #3340)
feat(provider): add Qoder Global PAT provider (carry #3349)
feat(provider): add Qoder CN PAT provider (carry #3350)
feat(gui): give Qoder its brand mark and name the CLI providers
feat(integrations): support source-preserving YAML for Hermes Agent (carry #3990)
fix(google): guard model-tail histories with user continue nudge across Gemini and CCA (carry #3988)
Roadmap, measured conflict map, mark sourcing decision, two audit rounds,
secondary PR dispositions, and the delivery record for #4026-#4031: six
layers merged bottom-up into dev at e2bf167 after a green lane=all run
(34231255231) on the top head 16d49ce. Local suite/typecheck/build were
deliberately NOT RUN; hosted CI is the only execution proof. Closed as
_fin because every outcome it records is already in public history.
docs(devlog): record the provider runtime stack landing
* test(lib): make idle deadline reset timing deterministic

Carried from #4041 (author luvs01) for maintainer-side CI and sequential integration.

Co-authored-by: luvs01 <27862058+luvs01@users.noreply.github.com>

* test: stabilize Windows fixture waits and case cleanup

Carried from #4015 (author luvs01) for maintainer-side CI and sequential integration.

Co-authored-by: luvs01 <27862058+luvs01@users.noreply.github.com>

* test(codex): verify timeout termination without racing child timers

Carried from #4012 (author luvs01) for maintainer-side CI and sequential integration.

Co-authored-by: luvs01 <27862058+luvs01@users.noreply.github.com>

* test(codex): hold prompt-probe admission through document edits

Carried from #4014 (author luvs01) for maintainer-side CI and sequential integration.

Co-authored-by: luvs01 <27862058+luvs01@users.noreply.github.com>

* test(clients): bound transaction fixture child completion

Carried from #4004 (author luvs01) for maintainer-side CI and sequential integration.
Closes #4003

Co-authored-by: luvs01 <27862058+luvs01@users.noreply.github.com>

* fix(codex): retain overlapping multiline TOML terminators

Carried from #4039 (author luvs01) for maintainer-side CI and sequential integration.

Co-authored-by: luvs01 <27862058+luvs01@users.noreply.github.com>

* fix(cli): reject unsupported caps and report ignored legacy values

Carried from #4043 (author luvs01) for maintainer-side CI and sequential integration.

Co-authored-by: luvs01 <27862058+luvs01@users.noreply.github.com>

* fix(codex): share trigger-only delegation guidance with v1

Carried from #4034 (author luvs01) for maintainer-side CI and sequential integration.

Co-authored-by: luvs01 <27862058+luvs01@users.noreply.github.com>

* fix(codex): preserve settings when journal injection hashes are missing

Carried from #4006 (author luvs01) for maintainer-side CI and sequential integration.
Closes #4005

Co-authored-by: luvs01 <27862058+luvs01@users.noreply.github.com>

* docs(cli): note that --injection still accepts none and minimal

CodeRabbit review on #4049: the effort reference documents caps only, so the
new rejection of none/minimal reads as a global removal. --injection keeps
both values because it sets the injection effort rather than a cap.

---------

Co-authored-by: t <a@b.com>
Co-authored-by: luvs01 <27862058+luvs01@users.noreply.github.com>
…rage, history) (#4051)

* fix(codex): keep Spark five-hour quota model-scoped

Carried from #4018 (author cb8010d6) for maintainer-side CI and sequential integration.
Closes #4017

Co-authored-by: cb8010d6 <53855466+cb8010d6@users.noreply.github.com>

* fix(codex): retain Spark quota on partial header updates

Carried from #4008 (author cb8010d6) for maintainer-side CI and sequential integration.
Closes #4007

Co-authored-by: cb8010d6 <53855466+cb8010d6@users.noreply.github.com>

* fix(codex): invalidate app-server observations at catalog boundaries

Carried from #3981 (author yansigit) for maintainer-side CI and sequential integration.

Co-authored-by: yansigit <44089734+yansigit@users.noreply.github.com>

* fix(web-search): stop inactivity timing after terminal events

Carried from #3979 (author yansigit) for maintainer-side CI and sequential integration.

Co-authored-by: yansigit <44089734+yansigit@users.noreply.github.com>

* fix(responses): strip Muse web_search fields on direct Meta

Carried from #3964 (author ildunari) for maintainer-side CI and sequential integration.

Co-authored-by: ildunari <95185577+ildunari@users.noreply.github.com>

* fix: preserve combo capabilities and skip referenced archives

Carried from #3863 (author x3M3x) for maintainer-side CI and sequential integration.

Co-authored-by: x3M3x <98298256+x3M3x@users.noreply.github.com>

* fix(codex): recover ocx1-compacted threads for native replay

Carried from #3920 (author cb8010d6) for maintainer-side CI and sequential integration.
Closes #3916

Co-authored-by: cb8010d6 <53855466+cb8010d6@users.noreply.github.com>

---------

Co-authored-by: t <a@b.com>
Co-authored-by: cb8010d6 <53855466+cb8010d6@users.noreply.github.com>
Co-authored-by: yansigit <44089734+yansigit@users.noreply.github.com>
Co-authored-by: ildunari <95185577+ildunari@users.noreply.github.com>
Co-authored-by: x3M3x <98298256+x3M3x@users.noreply.github.com>
…lback test (#4053)

* test(cli): make stale-port status fixture deterministic

Carried from #3980 (author yansigit) for maintainer-side CI and sequential integration.

Co-authored-by: yansigit <44089734+yansigit@users.noreply.github.com>

* refactor(router): isolate API-key selection capture

Carried from #3897 (author parkjs101) for maintainer-side CI and sequential integration.
Closes #3894

Co-authored-by: parkjs101 <93533648+parkjs101@users.noreply.github.com>

* docs: retire the historical dashboard capture pack

Carried from #3963 (author luvs01) for maintainer-side CI and sequential integration.

Co-authored-by: luvs01 <27862058+luvs01@users.noreply.github.com>

* refactor(gui): stabilize model feedback callback dependencies

Carried from #3984 (author yansigit) for maintainer-side CI and sequential integration.

Co-authored-by: yansigit <44089734+yansigit@users.noreply.github.com>

* test(gui): pin the publishFeedback callback identity

#3984 changes publishFeedback to a useCallback and adds it to saveDisplayName's
dependency array, but shipped without coverage, so the hygiene gate flags
missing_regression_test. This source-oracle test asserts both halves and fails
on dev without the fix (0 pass / 2 fail), so the suppression cannot come back
unnoticed.

Co-authored-by: yansigit <44089734+yansigit@users.noreply.github.com>

* chore(assets): file the #3984 screenshot with the others

#3984 added its review screenshot under a new assets/pr-screenshots/ directory.
The repository's nineteen existing PR screenshots all live in
docs-site/public/pr-screenshots/, so this moves it there and keeps the new
top-level directory out of the tree.

Co-authored-by: yansigit <44089734+yansigit@users.noreply.github.com>

---------

Co-authored-by: t <a@b.com>
Co-authored-by: yansigit <44089734+yansigit@users.noreply.github.com>
Co-authored-by: parkjs101 <93533648+parkjs101@users.noreply.github.com>
Co-authored-by: luvs01 <27862058+luvs01@users.noreply.github.com>
…streamAborted

Add two groups of regression tests for the usage-marker parity criterion
in devlog/_plan/260906_opaque_transport_finality/010_failure_boundaries.md:

tee path (consumeForInspection / stream-aborted-marker.test.ts):
- bare { type: "error" } SSE event followed by clean EOF → onTerminal("failed", 502)
  with no streamAborted on the persisted attempt (semantic failure, not a read reset)
- read error following a bare error event → streamAborted stays true (onReadError path)

eager path (relaySseEagerBounded / relay-eager.test.ts, 090-13):
- bare error frame + clean upstream EOF → onSynthetic receives ("failed", "upstream_error")
  so core.ts onSynthetic can record a semantic failed status without streamAborted

No source changes; all existing tests continue to pass. The implementation
already handles these paths correctly in relay.ts and relay-eager.ts;
these tests make the contract explicit and regression-proof.
lidge-jun and others added 20 commits September 9, 2026 19:54
…-20260909

fix(transport): pin manual redirects at upstream dispatch
fix(server): honor rejected identity checks during port reclaim
oauth/xai: honor Retry-After and stop retrying aborted token requests
…dation

oauth/xai: pin discovery endpoints to trusted auth hosts and reject userinfo
…stream-expiry

fix(server): close expired dashboard selection streams quietly when no frames are queued
…-windows

test(config): platform-policy readiness budget for the config-lock holder child, unmasked readiness failures
fix(codex): restore main policy binding after owned startup
…down

fix(codex): fall back to caller main during Pool cooldown
…-20260909

fix(stop): confirm shared teardown before skipping parent restoration
…am-evidence

fix(logs): persist transport finality evidence
…-carry

fix(auth): keep credentials scoped to the final routed provider (carry of #4081)
The paragraph excluded custom providers by name, but isCanonicalOpenAiForwardProvider classifies on adapter, auth mode and destination, so a custom-named forward entry pointing at the ChatGPT backend takes the same public channel. It also separates the doctor hint, which inspects only the built-in openai row, from the endpoint behaviour it describes.
…rrow the object

Dropping a regex-keyed matcher moves its keys to additionalProperties. On a closed object that forbids or re-constrains them, and a dictionary tool whose only matcher was regex-keyed admits nothing once minProperties is 1. Such objects now pass through as written, so an ECMA-compatible destination keeps working and an incompatible one reports the regex instead of receiving an unsatisfiable schema.
…ly warning

With a user-owned root openai_base_url the client-compaction path still writes the opencodex table, so the old warning misdescribed the file: it claimed nothing was injected and asked the operator to delete a valid setting, while the history line claimed those threads still reached the proxy. That configuration now reports the table it wrote and says the openai-tagged threads follow the operator destination. The setting is never overwritten and no session history is rewritten.
…guidance

feat(doctor): explain ChatGPT public endpoint latency
feat(codex): opt into client-side compaction
fix(openai): drop tool-schema patterns Python re cannot compile
Keep regex-keyed schemas and nonmonotone subtrees unchanged; retain scalar Artifact compatibility in ordinary positive positions.

Co-authored-by: itismyfield <itismyfield@users.noreply.github.com>
…schemas

fix(openai): preserve composed tool schema contracts
@lidge-jun
lidge-jun requested a review from Ingwannu as a code owner September 9, 2026 12:28
@coderabbitai

coderabbitai Bot commented Sep 9, 2026

Copy link
Copy Markdown
Contributor

Important

Review skipped

Too many files!

This PR contains 328 files, which is 28 over the limit of 300.

To get a review, reduce the PR to 300 files or fewer by splitting it into smaller PRs or changing its base branch.

Usage-priced reviews support at most 300 files.

⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Advanced

Run ID: bdb9eb40-4eaa-40d1-8c0e-69be73c08d7c

📥 Commits

Reviewing files that changed from the base of the PR and between c71474e and ad18c27.

⛔ Files ignored due to path filters (49)
  • .github/pr-assets/3863-storage-skip-referenced.png is excluded by !**/*.png
  • .github/pr-assets/muse-spark-meta-search-content-types-400.jpg is excluded by !**/*.jpg
  • assets/pr-screenshots/client-compaction-dashboard.png is excluded by !**/*.png
  • assets/sponsors/orcarouter-overview-mobile.png is excluded by !**/*.png
  • assets/sponsors/orcarouter-overview.png is excluded by !**/*.png
  • assets/sponsors/orcarouter-picker.png is excluded by !**/*.png
  • assets/sponsors/orcarouter-readme.png is excluded by !**/*.png
  • assets/sponsors/orcarouter.png is excluded by !**/*.png
  • assets/sponsors/packycode-overview-mobile.png is excluded by !**/*.png
  • assets/sponsors/packycode-overview.png is excluded by !**/*.png
  • assets/sponsors/packycode-picker.png is excluded by !**/*.png
  • assets/sponsors/packycode-readme.png is excluded by !**/*.png
  • assets/sponsors/packycode.png is excluded by !**/*.png
  • bun.lock is excluded by !**/*.lock
  • devlog/_fin/260908_provider_runtime_stack/assets/031_l4_provider_marks.png is excluded by !**/*.png
  • devlog/_plan/260904_dashboard_minimal/assets/011_sidebar_footer_after.png is excluded by !**/*.png
  • devlog/_plan/260904_dashboard_minimal/assets/011_star_in_update_dialog.png is excluded by !**/*.png
  • devlog/_plan/260904_dashboard_minimal/assets/021_dashboard_after.png is excluded by !**/*.png
  • devlog/_plan/260904_dashboard_minimal/assets/021_startup_autostart_row.png is excluded by !**/*.png
  • devlog/_plan/260904_dashboard_minimal/assets/031_models_after.png is excluded by !**/*.png
  • devlog/_plan/260904_dashboard_minimal/assets/031_models_disclosures_open.png is excluded by !**/*.png
  • devlog/_plan/260904_dashboard_minimal/assets/041_integrations_after.png is excluded by !**/*.png
  • devlog/_plan/260904_dashboard_minimal/assets/051_codex_set_after.png is excluded by !**/*.png
  • devlog/_plan/260904_dashboard_minimal/assets/051_codex_set_more_open.png is excluded by !**/*.png
  • devlog/_plan/260904_dashboard_minimal/assets/061_usage_after.png is excluded by !**/*.png
  • devlog/_plan/260904_dashboard_minimal/assets/071_startup_after.png is excluded by !**/*.png
  • devlog/_plan/260904_dashboard_minimal/assets/081_subagents_after.png is excluded by !**/*.png
  • devlog/_plan/260904_dashboard_minimal/assets/codex-set_1440.png is excluded by !**/*.png
  • devlog/_plan/260904_dashboard_minimal/assets/dashboard_1440.png is excluded by !**/*.png
  • devlog/_plan/260904_dashboard_minimal/assets/dashboard_models_1440.png is excluded by !**/*.png
  • devlog/_plan/260904_dashboard_minimal/assets/dashboard_providers_1440.png is excluded by !**/*.png
  • devlog/_plan/260904_dashboard_minimal/assets/integrations_1440.png is excluded by !**/*.png
  • devlog/_plan/260904_dashboard_minimal/assets/logs_1440.png is excluded by !**/*.png
  • devlog/_plan/260904_dashboard_minimal/assets/logs_debug_1440.png is excluded by !**/*.png
  • devlog/_plan/260904_dashboard_minimal/assets/models_1440.png is excluded by !**/*.png
  • devlog/_plan/260904_dashboard_minimal/assets/models_combos_1440.png is excluded by !**/*.png
  • devlog/_plan/260904_dashboard_minimal/assets/models_compatibility_1440.png is excluded by !**/*.png
  • devlog/_plan/260904_dashboard_minimal/assets/models_routing_1440.png is excluded by !**/*.png
  • devlog/_plan/260904_dashboard_minimal/assets/providers_1440.png is excluded by !**/*.png
  • devlog/_plan/260904_dashboard_minimal/assets/startup_1440.png is excluded by !**/*.png
  • devlog/_plan/260904_dashboard_minimal/assets/storage_1440.png is excluded by !**/*.png
  • devlog/_plan/260904_dashboard_minimal/assets/subagents_1440.png is excluded by !**/*.png
  • devlog/_plan/260904_dashboard_minimal/assets/usage_1440.png is excluded by !**/*.png
  • devlog/_plan/260909_usage_custom_range_disclosure/assets/010_before.png is excluded by !**/*.png
  • devlog/_plan/260909_usage_custom_range_disclosure/assets/020_after_collapsed.png is excluded by !**/*.png
  • devlog/_plan/260909_usage_custom_range_disclosure/assets/030_after_open.png is excluded by !**/*.png
  • docs-site/public/pr-screenshots/3984-model-feedback.png is excluded by !**/*.png
  • gui/public/provider-icons/packycode.svg is excluded by !**/*.svg
  • gui/public/provider-icons/qoder.svg is excluded by !**/*.svg
📒 Files selected for processing (328)
  • .github/workflows/cleanup-orphaned-workflows.yml
  • Dockerfile
  • README.md
  • SPONSORS.md
  • devlog/_fin/260908_provider_runtime_stack/000_plan.md
  • devlog/_fin/260908_provider_runtime_stack/010_layer_plan.md
  • devlog/_fin/260908_provider_runtime_stack/011_conflict_map.md
  • devlog/_fin/260908_provider_runtime_stack/012_mark_sourcing.md
  • devlog/_fin/260908_provider_runtime_stack/013_secondary_dispositions.md
  • devlog/_fin/260908_provider_runtime_stack/020_wp2_carry.md
  • devlog/_fin/260908_provider_runtime_stack/030_wp3_marks_docs.md
  • devlog/_fin/260908_provider_runtime_stack/040_wp4_publish_merge.md
  • devlog/_fin/260908_provider_runtime_stack/050_delivery_record.md
  • devlog/_fin/260908_provider_runtime_stack/060_ledger.md
  • devlog/_fin/260908_release_248/000_plan.md
  • devlog/_fin/260908_release_248/010_release.md
  • devlog/_fin/260908_release_248/020_progress.md
  • devlog/_fin/260908_release_248/030_wp2_regression_review.md
  • devlog/_fin/260908_release_248/040_wp3_promotion.md
  • devlog/_fin/260908_release_248/050_wp4_publication.md
  • devlog/_plan/260904_dashboard_minimal/000_inventory.md
  • devlog/_plan/260904_dashboard_minimal/001_subagent_opinions.md
  • devlog/_plan/260904_dashboard_minimal/assets/codex-set_interactive.txt
  • devlog/_plan/260904_dashboard_minimal/assets/codex-set_text.txt
  • devlog/_plan/260904_dashboard_minimal/assets/dashboard_interactive.txt
  • devlog/_plan/260904_dashboard_minimal/assets/dashboard_models_interactive.txt
  • devlog/_plan/260904_dashboard_minimal/assets/dashboard_models_text.txt
  • devlog/_plan/260904_dashboard_minimal/assets/dashboard_providers_interactive.txt
  • devlog/_plan/260904_dashboard_minimal/assets/dashboard_providers_text.txt
  • devlog/_plan/260904_dashboard_minimal/assets/dashboard_text.txt
  • devlog/_plan/260904_dashboard_minimal/assets/integrations_interactive.txt
  • devlog/_plan/260904_dashboard_minimal/assets/integrations_text.txt
  • devlog/_plan/260904_dashboard_minimal/assets/logs_debug_interactive.txt
  • devlog/_plan/260904_dashboard_minimal/assets/logs_debug_text.txt
  • devlog/_plan/260904_dashboard_minimal/assets/logs_interactive.txt
  • devlog/_plan/260904_dashboard_minimal/assets/logs_text.txt
  • devlog/_plan/260904_dashboard_minimal/assets/models_combos_interactive.txt
  • devlog/_plan/260904_dashboard_minimal/assets/models_combos_text.txt
  • devlog/_plan/260904_dashboard_minimal/assets/models_compatibility_interactive.txt
  • devlog/_plan/260904_dashboard_minimal/assets/models_compatibility_text.txt
  • devlog/_plan/260904_dashboard_minimal/assets/models_interactive.txt
  • devlog/_plan/260904_dashboard_minimal/assets/models_routing_interactive.txt
  • devlog/_plan/260904_dashboard_minimal/assets/models_routing_text.txt
  • devlog/_plan/260904_dashboard_minimal/assets/models_text.txt
  • devlog/_plan/260904_dashboard_minimal/assets/providers_interactive.txt
  • devlog/_plan/260904_dashboard_minimal/assets/providers_text.txt
  • devlog/_plan/260904_dashboard_minimal/assets/startup_interactive.txt
  • devlog/_plan/260904_dashboard_minimal/assets/startup_text.txt
  • devlog/_plan/260904_dashboard_minimal/assets/storage_interactive.txt
  • devlog/_plan/260904_dashboard_minimal/assets/storage_text.txt
  • devlog/_plan/260904_dashboard_minimal/assets/subagents_interactive.txt
  • devlog/_plan/260904_dashboard_minimal/assets/subagents_text.txt
  • devlog/_plan/260904_dashboard_minimal/assets/usage_interactive.txt
  • devlog/_plan/260904_dashboard_minimal/assets/usage_text.txt
  • devlog/_plan/260907_router_selection_capture/010_implementation.md
  • devlog/_plan/260908_d_group_test_infra_stack/000_plan.md
  • devlog/_plan/260908_d_group_test_infra_stack/001_audit_record.md
  • devlog/_plan/260908_d_group_test_infra_stack/010_phase1_stack_build.md
  • devlog/_plan/260908_d_group_test_infra_stack/020_phase2_publish.md
  • devlog/_plan/260908_d_group_test_infra_stack/030_phase3_merge_and_settle.md
  • devlog/_plan/260908_sponsor_overview/010_overview.md
  • devlog/_plan/260909_config_mutation_lock_windows/000_plan.md
  • devlog/_plan/260909_usage_custom_range_disclosure/000_plan.md
  • devlog/_plan/260909_usage_custom_range_disclosure/010_audit.md
  • devlog/_plan/260909_xai_oauth_retry_hardening/000_plan.md
  • devlog/_plan/260909_xai_oauth_retry_hardening/010_phase1_retry_after_abort.md
  • devlog/_plan/260909_xai_oauth_retry_hardening/020_phase2_endpoint_validation.md
  • docs-site/src/content/docs/fr/guides/codex-integration.md
  • docs-site/src/content/docs/fr/guides/integrations.md
  • docs-site/src/content/docs/fr/guides/sub-agent-surface.md
  • docs-site/src/content/docs/fr/reference/cli/lifecycle.md
  • docs-site/src/content/docs/fr/reference/proxy-formats.md
  • docs-site/src/content/docs/guides/claude-code.md
  • docs-site/src/content/docs/guides/codex-app-models.md
  • docs-site/src/content/docs/guides/codex-integration.md
  • docs-site/src/content/docs/guides/integrations.md
  • docs-site/src/content/docs/guides/providers.md
  • docs-site/src/content/docs/guides/sub-agent-surface.md
  • docs-site/src/content/docs/guides/web-dashboard.md
  • docs-site/src/content/docs/ja/guides/codex-integration.md
  • docs-site/src/content/docs/ja/guides/sub-agent-surface.md
  • docs-site/src/content/docs/ja/reference/cli/lifecycle.md
  • docs-site/src/content/docs/ja/reference/proxy-formats.md
  • docs-site/src/content/docs/ko/guides/claude-code.md
  • docs-site/src/content/docs/ko/guides/codex-integration.md
  • docs-site/src/content/docs/ko/guides/sub-agent-surface.md
  • docs-site/src/content/docs/ko/reference/cli/agents.md
  • docs-site/src/content/docs/ko/reference/cli/lifecycle.md
  • docs-site/src/content/docs/ko/reference/cli/providers-accounts.md
  • docs-site/src/content/docs/ko/reference/proxy-formats.md
  • docs-site/src/content/docs/reference/cli/agents.md
  • docs-site/src/content/docs/reference/cli/lifecycle.md
  • docs-site/src/content/docs/reference/cli/providers-accounts.md
  • docs-site/src/content/docs/reference/configuration/providers.md
  • docs-site/src/content/docs/reference/configuration/server.md
  • docs-site/src/content/docs/reference/management-api.md
  • docs-site/src/content/docs/reference/proxy-formats.md
  • docs-site/src/content/docs/ru/guides/codex-integration.md
  • docs-site/src/content/docs/ru/guides/sub-agent-surface.md
  • docs-site/src/content/docs/ru/reference/cli/lifecycle.md
  • docs-site/src/content/docs/ru/reference/proxy-formats.md
  • docs-site/src/content/docs/tr/guides/codex-integration.md
  • docs-site/src/content/docs/tr/guides/sub-agent-surface.md
  • docs-site/src/content/docs/tr/reference/cli/lifecycle.md
  • docs-site/src/content/docs/tr/reference/proxy-formats.md
  • docs-site/src/content/docs/zh-cn/guides/codex-integration.md
  • docs-site/src/content/docs/zh-cn/guides/sub-agent-surface.md
  • docs-site/src/content/docs/zh-cn/reference/cli/lifecycle.md
  • docs-site/src/content/docs/zh-cn/reference/proxy-formats.md
  • docs-site/src/content/docs/zh-tw/guides/codex-integration.md
  • docs-site/src/content/docs/zh-tw/guides/integrations.md
  • docs-site/src/content/docs/zh-tw/guides/sub-agent-surface.md
  • docs-site/src/content/docs/zh-tw/reference/cli/lifecycle.md
  • docs-site/src/content/docs/zh-tw/reference/proxy-formats.md
  • docs/qoder-cli-provider.md
  • gui/public/provider-icons/README.md
  • gui/src/components/provider-catalog/ProviderCatalog.tsx
  • gui/src/components/provider-catalog/provider-presets.ts
  • gui/src/components/provider-workspace/ProviderDetails.tsx
  • gui/src/components/provider-workspace/ProviderOverview.tsx
  • gui/src/components/provider-workspace/ProviderSponsor.tsx
  • gui/src/i18n/de.ts
  • gui/src/i18n/en.ts
  • gui/src/i18n/fr.ts
  • gui/src/i18n/ja.ts
  • gui/src/i18n/ko.ts
  • gui/src/i18n/ru.ts
  • gui/src/i18n/tr.ts
  • gui/src/i18n/zh-TW.ts
  • gui/src/i18n/zh.ts
  • gui/src/pages/Models.tsx
  • gui/src/pages/Providers.tsx
  • gui/src/pages/Storage.tsx
  • gui/src/pages/Usage.tsx
  • gui/src/pages/dashboard-overview-sections.tsx
  • gui/src/pages/dashboard-shared.ts
  • gui/src/pages/use-dashboard-data.ts
  • gui/src/provider-icons.ts
  • gui/src/styles.css
  • gui/src/styles/provider-workspace-shell.css
  • gui/tests/provider-catalog-sponsor-pinning.test.ts
  • gui/tests/provider-icons.test.ts
  • gui/tests/provider-sponsor-overview.test.tsx
  • gui/tests/usage-custom-range.test.tsx
  • gui/tests/vision-sidecar-dashboard.test.tsx
  • package.json
  • scripts/test-layout/layout.json
  • src/adapters/anthropic.ts
  • src/adapters/codebuddy/adapter.ts
  • src/adapters/codebuddy/profiles.ts
  • src/adapters/coding-agent/profile.ts
  • src/adapters/coding-agent/protocol.ts
  • src/adapters/coding-agent/turn.ts
  • src/adapters/google.ts
  • src/adapters/mimo-free.ts
  • src/adapters/openai-chat.ts
  • src/adapters/openai-responses.ts
  • src/adapters/qoder/adapter.ts
  • src/adapters/qoder/live-models.ts
  • src/adapters/qoder/profiles.ts
  • src/adapters/registry.ts
  • src/adapters/responses-tool-schema.ts
  • src/cli/dispatch.ts
  • src/cli/doctor.ts
  • src/cli/effort.ts
  • src/cli/help.ts
  • src/cli/index.ts
  • src/cli/provider-runtime.ts
  • src/cli/registry.ts
  • src/cli/system-command.ts
  • src/cli/usage-report.ts
  • src/codex/account-lifecycle.ts
  • src/codex/auth-api.ts
  • src/codex/auth-collision.ts
  • src/codex/auth-context.ts
  • src/codex/catalog/provider-fetch.ts
  • src/codex/inject.ts
  • src/codex/internal/catalog-writer.ts
  • src/codex/journal.ts
  • src/codex/model-cache.ts
  • src/codex/native-profile-startup.ts
  • src/codex/native-profile-store.ts
  • src/codex/ocx-compaction-history.ts
  • src/codex/project-config-warnings.ts
  • src/codex/quota.ts
  • src/codex/reserve-availability.ts
  • src/codex/runtime.ts
  • src/codex/sync.ts
  • src/config.ts
  • src/images/loop.ts
  • src/images/xai-video-client.ts
  • src/integrations/registry.ts
  • src/lib/process-control.ts
  • src/lib/upstream-retry.ts
  • src/oauth/chatgpt.ts
  • src/oauth/xai.ts
  • src/providers/api-key-selection-capture.ts
  • src/providers/api-key-selection.ts
  • src/providers/caller-authorization.ts
  • src/providers/codebuddy-models.ts
  • src/providers/derive.ts
  • src/providers/free-directory.ts
  • src/providers/openai-sidecar.ts
  • src/providers/qoder-models.ts
  • src/providers/registry.ts
  • src/responses/compaction.ts
  • src/responses/task-input.ts
  • src/router.ts
  • src/server/chat-completions.ts
  • src/server/claude-messages.ts
  • src/server/images.ts
  • src/server/management-api.ts
  • src/server/management/account-selection-stream.ts
  • src/server/management/config-routes.ts
  • src/server/management/logs-usage-routes.ts
  • src/server/management/native-integration-routes.ts
  • src/server/management/provider-routes.ts
  • src/server/port-reclaim.ts
  • src/server/request-log.ts
  • src/server/responses/collaboration.ts
  • src/server/responses/core.ts
  • src/server/responses/fetch-helpers.ts
  • src/server/responses/policy-fallback.ts
  • src/service.ts
  • src/storage/cleanup.ts
  • src/types/config.ts
  • src/usage/log.ts
  • src/vision/anthropic-describe.ts
  • src/web-search/anthropic-executor.ts
  • src/web-search/loop.ts
  • src/web-search/progress-stream.ts
  • structure/01_runtime.md
  • structure/02_config-and-codex-home.md
  • structure/03_catalog-and-subagents.md
  • structure/04_transports-and-sidecars.md
  • structure/05_gui-and-management-api.md
  • structure/08_openai-provider-tiers.md
  • tests/adapters/adapter-buffered-tool-conformance.test.ts
  • tests/adapters/adapter-registry-authority.test.ts
  • tests/adapters/adapter-tool-conformance.test.ts
  • tests/adapters/anthropic/anthropic-error-stop-reason.test.ts
  • tests/adapters/anthropic/anthropic-quota-dispatch.test.ts
  • tests/adapters/google/google-claude-prefill-guard.test.ts
  • tests/adapters/openai/openai-chat-hardening.test.ts
  • tests/ci-workflows/install-scripts.test.ts
  • tests/cli/cli-effort.test.ts
  • tests/cli/cli-headless-parity.test.ts
  • tests/cli/cli-help.test.ts
  • tests/cli/cli-management-auth.test.ts
  • tests/cli/cli-restore-back.test.ts
  • tests/cli/cli-start-journal-order.test.ts
  • tests/cli/cli-status-json.test.ts
  • tests/cli/cli-usage-report.test.ts
  • tests/clients/client-connect.test.ts
  • tests/clients/integrations-state.test.ts
  • tests/clients/integrations-writer.test.ts
  • tests/codex-integration/bearer-admission-routed-provider.test.ts
  • tests/codex-integration/catalog-hub-context-window.test.ts
  • tests/codex-integration/codex-auth-context.test.ts
  • tests/codex-integration/codex-catalog-restore.test.ts
  • tests/codex-integration/codex-catalog.test.ts
  • tests/codex-integration/codex-composed-acceptance.test.ts
  • tests/codex-integration/codex-inject-integration.test.ts
  • tests/codex-integration/codex-inject.test.ts
  • tests/codex-integration/codex-journal.test.ts
  • tests/codex-integration/codex-models-cache-invalidate.test.ts
  • tests/codex-integration/codex-prompt-route.test.ts
  • tests/codex-integration/codex-quota-parser-parity.test.ts
  • tests/codex-integration/codex-retained-root-serialization.test.ts
  • tests/codex-integration/codex-routing.test.ts
  • tests/codex-integration/codex-runtime.test.ts
  • tests/codex-integration/codex-spark-visibility.test.ts
  • tests/codex-integration/doctor.test.ts
  • tests/codex-integration/history-ocx-compaction-recovery.test.ts
  • tests/codex-integration/main-account-hard-lock-auth.test.ts
  • tests/codex-integration/multi-agent-compat.test.ts
  • tests/codex-integration/native-profile-processes.test.ts
  • tests/codex-integration/project-config-warnings.test.ts
  • tests/codex-integration/reserve-availability.test.ts
  • tests/config/config-mutation-lock.test.ts
  • tests/config/settings-stream-mode.test.ts
  • tests/fixtures/parent-stop-runner.ts
  • tests/fixtures/test-layout-expected.json
  • tests/gui/integrations-invariants.test.ts
  • tests/gui/models-feedback-callback.test.ts
  • tests/helpers/adapter-conformance/wire-drivers.ts
  • tests/helpers/bounded-auth-read-child.ts
  • tests/helpers/main-account-policy-startup-child.ts
  • tests/images/loop.test.ts
  • tests/lib/abort-idle-deadline.test.ts
  • tests/lib/credential-redirect-guard.test.ts
  • tests/lib/process-control-graceful.test.ts
  • tests/oauth/chatgpt-oauth.test.ts
  • tests/oauth/oauth-accounts-api.test.ts
  • tests/providers/api-key-selection-capture.test.ts
  • tests/providers/codebuddy-adapter.test.ts
  • tests/providers/codebuddy-protocol.test.ts
  • tests/providers/mimo-free-provider.test.ts
  • tests/providers/muse-spark-web-search-compat.test.ts
  • tests/providers/provider-connection-test.test.ts
  • tests/providers/provider-registry-parity.test.ts
  • tests/providers/qoder-adapter.test.ts
  • tests/providers/qoder-live-models.test.ts
  • tests/providers/sponsor-presets.test.ts
  • tests/providers/xai/grok-lifecycle.test.ts
  • tests/providers/xai/xai-oauth-retry.test.ts
  • tests/responses/openai-responses-passthrough.test.ts
  • tests/responses/responses-compaction-routing.test.ts
  • tests/responses/responses-parser.test.ts
  • tests/routing/combo-child-headers.test.ts
  • tests/routing/routing-policy-fallback.test.ts
  • tests/routing/subagent-fallback-handle-responses.test.ts
  • tests/server/port-reclaim.test.ts
  • tests/server/relay-eager.test.ts
  • tests/server/server-combo-failover-e2e.test.ts
  • tests/server/server-images.test.ts
  • tests/server/server-xai-responses-streaming.test.ts
  • tests/server/stream-aborted-marker.test.ts
  • tests/server/v2-agent-message-failfast.test.ts
  • tests/service/stop-deferred-teardown.test.ts
  • tests/storage/storage-cleanup.test.ts
  • tests/usage/request-log.test.ts
  • tests/usage/usage-aggregate-cache.test.ts
  • tests/videos/xai-video-client.test.ts
  • tests/vision/vision-anthropic.test.ts
  • tests/web-search/web-search-anthropic.test.ts
  • tests/web-search/web-search-progress-stream.test.ts
  • tests/web-search/web-search.test.ts

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@github-actions github-actions Bot added the intake: hygiene-blocked Deterministic PR hygiene checks failed label Sep 9, 2026
@github-actions

github-actions Bot commented Sep 9, 2026

Copy link
Copy Markdown
Contributor

⚠️ Deterministic hygiene checks failed.

  • missing_coauthor_credit — This pull request says it reimplements, supersedes, carries, or rebases another author's pull request, but no Co-authored-by trailer names that author. Prose in a commit body is not read by anything; the trailer is what GitHub counts. Add it to the description or a commit, or obtain attribution-approved. Paths: #3340, #3349, #3350.

@lidge-jun
lidge-jun merged commit a433d39 into preview Sep 9, 2026
22 of 29 checks passed
@lidge-jun
lidge-jun deleted the codex/release-249-preview-01a08498 branch September 9, 2026 12:29
@github-actions github-actions Bot changed the title release: promote verified 2.49.0 product tree to preview [WRONG BRANCH] release: promote verified 2.49.0 product tree to preview Sep 9, 2026
@github-actions

github-actions Bot commented Sep 9, 2026

Copy link
Copy Markdown
Contributor

⏳ DRAFT

  • wrong target branch (preview); retarget to dev. hygiene: missing_coauthor_credit.

What to do

  • Retarget this PR to dev — all contributions go to dev.
  • Fix missing_coauthor_credit — This pull request says it reimplements, supersedes, carries, or rebases another author's pull request, but no Co-authored-by trailer names that author. Prose in a commit body is not read by anything; the trailer is what GitHub counts. Add it to the description or a commit, or obtain attribution-approved. Paths: #3340, #3349, #3350.

Its title has been prefixed with [WRONG BRANCH].
Automatic draft conversion failed (token cannot change draft status). Please convert this pull request to a draft manually. The required enforce-target check will keep failing until every issue above is resolved.

@lidge-jun

Copy link
Copy Markdown
Owner Author

리뷰 · 우선순위 76 / 80

이 PR은 검증된 제품 기준선 ad36c7be8913f4367fed0f3fa46acd2224914c7a(지금 dev tip 직전, #4113 composed tool-schema 보존까지 포함)를 preview 채널로 올리는 2.49.0 승격이다. 베이스는 preview, 헤드 브랜치는 codex/release-249-preview-01a08498, promotion head는 ad18c27d9c2e7b579d4c34f7a8f6386e5af44156다. 기준선과 트리 비교하면 바뀌는 파일은 package.json 한 줄뿐이고, 채널 버전만 2.49.0-preview.20260909로 바뀐다. 로컬 체크아웃의 현재 dev HEAD는 57077ca3260494aa4266b4108a7bd4c8a4dac288이고, 그 차이는 이미 머지된 open-dev 범프 #4115(package.json만 2.50.0)뿐이다. 점수·카탈로그 기준은 방금 갱신한 dev와 맞다.

diff가 300파일 넘게 크게 보이는 이유는 preview에 아직 없던 2.49 트레인 전체가 한 번에 보이기 때문이다. 이미 dev에 들어간 것들의 채널 출구다. 대표적으로 CodeBuddy Global/CN·Qoder Global/CN 제공자 스택, Hermes source-preserving YAML, Gemini model-tail continue nudge, 기여자 wp1–wp7(픽스처·쿼터·카탈로그·Bun 1.4.2·stop 사유 전달 등), client-side compaction(#3987 계열), OpenAI tool-schema regex strip(#4072/#4096)과 그 위 composed-schema 보존(#4113), transport finality/#3657 로그 증거, caller auth 스코프, OrcaRouter 스폰서 배치, doctor ChatGPT latency 안내가 들어 있다. 이 PR을 파일 단위 기능 리뷰로 다시 까는 대상이 아니라, 후보 SHA·버전선·CI 증거·발행 순서를 확인하는 출구 리뷰다.

AGENTS.md/MAINTAINERS.mdpreview/main은 메인테이너 승격으로만 움직인다. enforce-target은 평소 기여자 PR이 dev만 보게 막는 게이트라서 이번에도 실패했고, 제목에 [WRONG BRANCH]가 붙었다. 본문이 #4010/#4011과 같이 owner가 명시한 타깃 예외라고 적어 두었고, 게이트를 초록으로 위장하거나 규칙을 바꾸지 않았다. 봇이 “베이스를 dev로 바꿔라”고 안내해도 그대로 따르면 채널 승격이 깨진다. intake: hygiene-blocked도 대형 승격 PR에서 흔히 뜨는 표식이다.

검증·순서 쪽은 이번 컷이 이전과 조금 다르다. 본문은 후보 SHA의 full development CI(run 34348082430, 26/26·Windows 샤드·macOS control 포함)와 service(run 34348086831, 3/3)를 증거로 두고, 로컬 스위트는 owner 제한으로 NOT RUN이다. 또한 owner가 pre-merge CI를 기다리지 말고 바로 머지하라고 지시했다고 명시했다. 리뷰 작성 시점에 이 PR은 이미 preview에 머지되었고(merge a433d39d9), 짝 #4117도 거의 동시에 main에 올라 2.49.0이 됐다. npm dist-tag는 아직 latest=2.48.0, preview=2.48.0-preview.20260908이고 v2.49* 태그/릴리스는 없다. 본문도 preview 쪽은 별도 npm preview 발행을 계획하지 않고, 이전에 공개된 preview dist-tag를 유지한다고 적었다. 다음 게이트는 머지 후 push-event CI·Service lifecycle 초록과 release.yml expected-sha + dry-run 뒤의 실제 발행이다.

경로 base=preview / enforce-target 실패 - 기여자용 dev-only 게이트와 충돌한다. 릴리스 승격 예외로 의도된 것이다. dev로 리타깃하지 마라.
경로 package.json 라인 3 (2.49.0-preview.20260909) - 후보 ad36c7be8와 트리 동일·버전선만 채널명인지 확인됨(git diff 1파일). 머지 후에도 origin/preview가 이 버전을 가리킨다.
경로 후보 CI run 34348082430 / 34348086831 - 제품 증거는 이 exact-tree 기준선 재사용이다. promotion SHA에 대한 새 full matrix를 주장하지 않았다.
경로 이 PR push-event Cross-platform / Service lifecycle - 머지 후 별도 초록이 발행 전제다. 후보 CI만으로 레지스트리를 밀면 안 된다.
경로 .github/workflows/release.yml - expected-sha + dry-run 후 live. 관측 실패 시 republish 금지 계약을 유지한다. 본문상 이번 preview는 npm preview 재발행을 안 할 수 있으니, 실제 발행 대상이 main/latest인지 한 번 더 맞춰라.
경로 짝 #4117 - 이미 연속 머지됨. preview 완충 관측 없이 main live를 서두르지 말고, dry-run·태그·npm latest를 사람이 확인한다.
경로 open-dev #4115 - 이미 dev가 2.50.0이라 안정 채널과 버전선이 겹치지 않는다. 잘 된 선작업이다.

메인테이너의 판단이 필요한 지점

  • preview npm 재발행을 정말 건너뛸지, 관측용으로 2.49.0-preview.20260909를 한 번 찍을지
  • 머지 후 push-event CI가 일부 빨갛더라도 owner 지시대로 발행으로 갈지, 초록까지 기다릴지
  • [WRONG BRANCH] release: promote verified 2.49.0 product tree to main #4117 main live 전에 preview 채널(또는 동일 트리) 짧은 관측 창을 둘지
  • hygiene-blocked / wrong-branch 표식을 릴리스 PR 예외로 문서에 고정할지

너의 추천
내용 리베이스나 types/config 분할 때문에 닫을 대상은 아니다. 이미 머지됐으니 다음은 (1) origin/preview push CI·Service lifecycle 확인, (2) 본문 정책대로 preview npm을 건너뛸지 확정, (3) #4117 쪽 dry-run → v2.49.0 태그 → npm latest 발행 순서다. 봇 retarget-to-dev는 무시. 발행 영수증 없이 재시도하지 마라.

이 댓글은 grok-bot이 작성했습니다

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

intake: hygiene-blocked Deterministic PR hygiene checks failed

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants