feat(catalog): ship gpt-daybreak-blue-latest as a global native row - #1814
Conversation
Owner decision. The slug is entitlement-gated upstream: it is absent from codex-rs's bundled catalog and reaches a client only through an authenticated /models response. Because opencodex injects model_catalog_json, codex-rs builds a StaticModelsManager whose refresh is a no-op, so an entitled account had no way to discover it on a clean install. Adding it to NATIVE_OPENAI_MODELS closes that gap. Capability is inherited from gpt-5.6-sol through the existing alias mechanism, so the row carries multi_agent_version v2. The slug now sits in BOTH NATIVE_OPENAI_MODELS and NATIVE_OPENAI_CAPABILITY_ALIAS_MODELS; the maps consuming their union are keyed by slug so it collapses to one entry, and row generation iterates NATIVE_OPENAI_MODELS alone, so exactly one bare row and one row per account selector are emitted. Tests assert that with toHaveLength(1) rather than exists, so a duplicate-row regression fails here. Accepted tradeoff, documented at the declaration: an UNENTITLED account also sees the row. Catalog sync still succeeds; selecting the model reaches the canonical OpenAI provider and the backend answers 400, which is relayed (a bare pooled route may first retry one alternate account on that exact body; a selector-qualified route is fixed and relays immediately). disabledModels hides the row but is not a runtime routing denial. Fixture updates follow from the reversal: suites that used this slug as a stand-in for an UNKNOWN observation-only native move to gpt-future-unlisted, and the management and Claude discovery surfaces now report the global bare identity.
|
Important Review skippedAuto reviews are disabled on base/target branches other than the default branch. 🗂️ Base branches to auto review (2)
Please check the settings in the CodeRabbit UI or the ⚙️ Run configurationConfiguration used: Path: .coderabbit.yaml Review profile: ASSERTIVE Plan: Pro Plus Run ID: You can disable this status message by setting the Use the checkbox below for a quick retry:
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. Comment |
|
✅ Deterministic PR hygiene checks passed. |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 926ca6cdda
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| export const NATIVE_OPENAI_MODELS = [ | ||
| "gpt-5.5", "gpt-5.4", "gpt-5.4-mini", "gpt-5.3-codex-spark", | ||
| "gpt-5.6-sol", "gpt-5.6-terra", "gpt-5.6-luna", | ||
| NATIVE_DAYBREAK_BLUE_MODEL, |
There was a problem hiding this comment.
Update the Daybreak model documentation
Adding this slug to the global native set directly contradicts docs-site/src/content/docs/guides/codex-app-models.md:26-27 and :42-46, which still state that Daybreak is observation-only, never creates a bare row, and requires an explicit customModels entry. Users will therefore configure an unnecessary duplicate route and misunderstand the entitlement-gated 400 behavior; update the English page and affected translations to document the globally seeded native row and its entitlement limitation.
AGENTS.md reference: src/AGENTS.md:L28-L28
Useful? React with 👍 / 👎.
Four layers on origin/dev, each its own PR whose base is the layer below: #1812 (docs, base dev) -> #1813 (roster) -> #1814 (daybreak) -> #1815 (five-cap). DEV-STACK-03 requires each layer to build and pass its own tests at its own tip, so every layer was checked out separately on ssh lidge and given a full run: L1 docs bba4b96 tsc 0 12575 pass / 0 fail L2 roster df83829 tsc 0 12575 pass / 0 fail L3 daybreak 926ca6c tsc 0 12576 pass / 0 fail L4 five-cap 9a75124 tsc 0 12576 pass / 0 fail The +1 at L3 is the new test proving the global Daybreak row exists without an observation. The original C1 commit mixed the roster and Daybreak changes, so the split was done per file. Diffing the L4 tip against the previously verified branch shows the only difference is the two new documents, which proves no code was lost or altered while re-slicing. Also records an unintended observation: one push carried a main -> main fast-forward. It was a pre-existing maintenance commit by another author already in the local main, not this work, but it changed remote state so it is logged. Subsequent pushes used explicit refs/heads/<branch>:refs/heads/<branch>.
All four layers merged bottom-up into dev: lidge-jun#1812 docs 05:42:04Z ead6327 lidge-jun#1813 roster 05:42:32Z e516912 lidge-jun#1814 daybreak 05:42:52Z aa585e7 lidge-jun#1815 five-cap 05:43:12Z 09bf1f1 Each upper PR was retargeted to dev only after the layer below it landed, so the stack order was never violated. The dev ruleset requires one approving review plus code-owner review, and the PR author is the code owner, so self-approval is impossible. Merges used the admin bypass the ruleset already defines (bypass_actors: RepositoryRole 5, bypass_mode pull_request) via gh pr merge --admin. No new bypass was created. Before merging, all four PRs were MERGEABLE with zero failing or pending checks; lidge-jun#1812's BLOCKED state was REVIEW_REQUIRED, not a CI failure. Post-merge verification on ssh lidge against origin/dev: bun x tsc --noEmit -> exit 0 OCX_TEST_NO_QUEUE=1 bun scripts/test.ts -> 12576 pass / 0 fail The landed code was read back from dev directly: isEligibleV2SubagentEntry returns entry.multi_agent_version !== "disabled", NATIVE_DAYBREAK_BLUE_MODEL is in the allowlist, the devlog unit has 19 documents, and structure/03 carries the five-cap section. All four layer tips are ancestors of origin/dev. G1b, G2, G12 and G14 remain open as C2/C3.
Summary
Ships
gpt-daybreak-blue-latestas a global native catalog row. Owner decision.The slug is entitlement-gated upstream: it is absent from codex-rs's bundled catalog (all
eight slugs checked) and reaches a client only through an authenticated
/modelsresponse.Because opencodex injects
model_catalog_json, codex-rs builds aStaticModelsManagerwhoserefresh is a no-op — so an entitled account had no way to discover it on a clean install.
Adding the slug to
NATIVE_OPENAI_MODELScloses that gap.Capability is inherited from
gpt-5.6-solthrough the existing alias mechanism, so the rowcarries
multi_agent_version: "v2". The slug now sits in bothNATIVE_OPENAI_MODELSandNATIVE_OPENAI_CAPABILITY_ALIAS_MODELS; the maps consuming their union are keyed by slug soit collapses to one entry, and row generation iterates
NATIVE_OPENAI_MODELSalone, soexactly one bare row and one row per account selector are emitted.
Accepted tradeoff, documented at the declaration: an unentitled account also sees the
row. Catalog sync still succeeds; selecting the model reaches the canonical OpenAI provider
and the backend answers 400, which is relayed (a bare pooled route may first retry one
alternate account on that exact body; a selector-qualified route is fixed and relays
immediately).
disabledModelshides the row but is not a runtime routing denial.Verification
bun x tsc --noEmit→ exit 0.for an unknown observation-only native move to
gpt-future-unlisted, preserving theinvariant they were written to prove. Management and Claude discovery now report the global
bare identity instead of an account-qualified discovery row.
toHaveLength(1)rather thansome(...), so a duplicate-rowregression fails at these tests.
One finding is recorded honestly in the devlog: Daybreak now appears under neither
identity on the Anthropic discovery surface, because the global synthesized row is
visibility: "hide"and the account-qualified projection is no longer produced. That wasconfirmed by printing the actual response rather than assuming, and is harmless since the
model routes through the native OpenAI path.
Checklist
Stack (merge bottom-up):
codex/compat-v2-five-capcodex/compat-v2-daybreak← you are herecodex/compat-v2-rostercodex/compat-v2-docsDepends on #1813. Review this PR's diff only.