Skip to content

feat(agents): treat a v1 pin as an eligible leaf subagent - #1813

Merged
lidge-jun merged 1 commit into
devfrom
codex/compat-v2-roster
Aug 16, 2026
Merged

feat(agents): treat a v1 pin as an eligible leaf subagent#1813
lidge-jun merged 1 commit into
devfrom
codex/compat-v2-roster

Conversation

@lidge-jun

Copy link
Copy Markdown
Owner

Summary

Fixes the defect that kept gpt-5.6-luna out of the effective subagent roster.

Upstream 6d4d9442c changed multi_agent_version from an eligibility gate into a child
capability declaration
. model_supports_multi_agent_backend
(multi_agents_common.rs:36-42) now admits every model except an explicit "disabled", and
collab_tools_enabled (spec_plan.rs:599-610) grants a child collaboration tools only when
its own catalog value is exactly Some(V2).

isEligibleV2SubagentEntry still implemented the superseded == "v2" equality, so every
"v1"-pinned row was dropped. That is upstream's own pin for gpt-5.6-luna
(models-manager/models.json), which therefore could never be offered as a subagent model.

The three-way distinction survives but now reads eligible-recursive / eligible-LEAF /
excluded
. This is the roster filter only — catalog stamping stays with
applyMultiAgentMode, including the keepNativeChatGptOnV1 policy (#1728) that keeps
ChatGPT-native rows on v1 so a native parent can still spawn a routed child despite
backend-encrypted NEW_TASK bodies (#92). Recognizing those v1 rows as eligible leaves is
what makes that policy usable, not a contradiction of it.

Verification

  • bun test tests/multi-agent-compat.test.ts tests/multi-agent-keep-native-v1.test.ts tests/codex-catalog-model-picker-order.test.ts69 pass / 0 fail at this layer's tip.
  • bun x tsc --noEmit → exit 0.
  • Full suite green at the stack tip on ssh lidge: 12561 pass / 13 skip / 0 fail.
  • Updated expectations state the new contract: luna appears in candidates and advertised,
    and the disabled pin — not v1 — now carries the surface_incompatible exclusion role.

Checklist

  • Scope stays focused and avoids unrelated cleanup.
  • Docs or release notes were updated when needed.
  • Security-sensitive changes were reviewed for secrets, auth, and unsafe defaults.

Stack (merge bottom-up):

# PR Layer Review focus
4 codex/compat-v2-five-cap the five-model window doc + SoT sync
3 codex/compat-v2-daybreak global native row + fixture reversals
2 #1813 codex/compat-v2-roster ← you are here roster predicate
1 #1812 codex/compat-v2-docs upstream analysis, no code

Depends on #1812. Review this PR's diff only.

Upstream codex-rs 6d4d9442c ("Support leaf models in multi-agent v2") turned
multi_agent_version from an eligibility gate into a CHILD capability declaration.
model_supports_multi_agent_backend (multi_agents_common.rs:36-42) now admits every
model except an explicit "disabled", while collab_tools_enabled
(spec_plan.rs:599-610) grants a child collaboration tools only when its own value
is exactly Some(V2).

isEligibleV2SubagentEntry still implemented the superseded equality rule, so every
"v1"-pinned row was dropped from the roster. That is upstream's own pin for
gpt-5.6-luna, which therefore could never be offered as a subagent model.

The three-way distinction survives but now reads eligible-recursive /
eligible-LEAF / excluded. This is the roster filter only. Catalog stamping stays
with applyMultiAgentMode, including the keepNativeChatGptOnV1 policy (#1728) that
keeps ChatGPT-native rows on v1 so a native parent can still spawn a routed child
despite backend-encrypted NEW_TASK bodies (#92). Recognizing those v1 rows as
eligible leaves is what makes that policy usable, not a contradiction of it.

Tests: luna now appears in both candidates and advertised; the disabled pin, not
v1, carries the surface_incompatible exclusion role.
@coderabbitai

coderabbitai Bot commented Aug 16, 2026

Copy link
Copy Markdown
Contributor

Important

Review skipped

Auto reviews are disabled on base/target branches other than the default branch.

🗂️ Base branches to auto review (2)
  • ^dev$
  • ^preview$

Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: fdf8393b-165f-4b53-88e1-be2b75b079ac

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

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

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

Copy link
Copy Markdown
Contributor

Deterministic PR hygiene checks passed.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: df83829cdd

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread src/codex/catalog/sync.ts
export function isEligibleV2SubagentEntry(entry: RawEntry): boolean {
const pinned = entry.multi_agent_version;
return pinned === "v2" || pinned === null || pinned === undefined;
return entry.multi_agent_version !== "disabled";

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Update the documented v2 roster eligibility

This predicate now makes "v1" entries such as Luna eligible leaf workers, but docs-site/src/content/docs/guides/sub-agent-surface.md:44-46 still tells users that genuine "v1" pins are excluded; the same obsolete claim remains in several translated versions. Update the English eligibility description and the translations so the public guidance reflects that only "disabled" excludes a model.

AGENTS.md reference: AGENTS.md:L279-L280

Useful? React with 👍 / 👎.

lidge-jun added a commit that referenced this pull request Aug 16, 2026
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>.
@lidge-jun
lidge-jun changed the base branch from codex/compat-v2-docs to dev August 16, 2026 05:42
@lidge-jun
lidge-jun merged commit e516912 into dev Aug 16, 2026
27 checks passed
ntdatt812 pushed a commit to ntdatt812/opencodex that referenced this pull request Aug 16, 2026
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.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancement New feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant