Skip to content

Rubber Duck #4380

Description

@tanselmi-appliedsurety

Describe the bug

rubber-duck reviews sometimes use the same model family as the primary session instead of selecting an independent reviewer, reducing the value of adversarial review.

i have observed this on a variety of models. most recently using 5.6 Terra - Max

Affected version

v1.0.78

Steps to reproduce the behavior

Have code/plan/contract whilst working in a gpt-5.6-terra session and request a rubber-duck review...

you then see this: Rubber-duck(gpt-5.6-terra) Assess audit design quality
└ Agent started in background with agent_id: audit-design-duck. You'll be notif...

Expected behavior

I would expect a different model family selected from the current model being used in the session.

Additional context

No response

Activity

  1. added
    area:agentsSub-agents, fleet, autopilot, plan mode, background agents, and custom agents
    area:modelsModel selection, availability, switching, rate limits, and model-specific behavior
    and removed on Aug 6, 2026
  2. nick-thinks commented on Aug 6, 2026

    @nick-thinks

    Hi @tanselmi-appliedsurety I agree, typically you should have received a complementary model.

    Are you able to provide a session process log of when this happened to you? That will help to make sure we have identified the exact problem 😄 You can find the session's log file by using /session info and the log file will look like /Users/nick/.copilot/logs/process-1786017957609-61781.log

    Just to double check, can you also confirm if you have overridden the rubber duck subagent model in your subagent settings? If you go to /subagents you are able to change the model mapping behavior for rubber duck from the default of "complementary (different family)". If it is set to "inherit" it will use your session model, and if you have set a specific model it will use that.

    It is also possible that the session agent itself decided to override the rubber duck model choice, which we can identify from the process log. We discourage this option in instructions but leave it open for some flexibility in-session.

  3. tanselmi-appliedsurety commented on Aug 6, 2026

    @tanselmi-appliedsurety
    Author

    Thanks @nick-thinks — checked both.

    1. Rubber-duck model mapping

    •  /subagents :  rubber-duck  →  complementary — unavailable, disabled 
    • Overridden: No
    • Status: On
    I did not set this.  settings.json  has no  rubber-duck  model override (only explore/task/research/etc.). So complementary is the built-in default, but the UI treats it as unavailable for the current session model/catalog.

    1. Process log
      Attached a redacted extract from yesterday’s session ( v1.0.78 ) with multiple  rubber-duck  execute/complete events.
      Note: INFO logs show the duck runs, but do not emit complementary selection debug ( parent_model  /  available_models  /  selected_model ). Happy to capture a fresher log if you want a specific debug flag/level.

    That matches the original report: complementary path fails open to same-family/session model (e.g. terra-on-terra) instead of a different family.

    Image

    copilot-cli-4380-rubber-duck-evidence.REDACTED.txt

  4. eggboy commented on Aug 11, 2026

    @eggboy

    Adding evidence from a case with the same symptom but what looks like a different mechanism — filed separately as #4432 to keep the two apart.

    In my case the parent session was claude-opus-5 and a complementary model was available (gpt-5.6-sol, same high price category). Rubber-duck still ran on claude-opus-4.8.

    Cause: the parent agent passed model explicitly in the task tool call. From events.jsonl:

    {"agent_type":"rubber-duck","name":"reval-review","model":"claude-opus-4.8","prompt":"..."}
    subagent.completed   agentName: "rubber-duck"   model: "claude-opus-4.8"
    

    Driving subagentStartPlan in runtime.node directly (parent claude-opus-5; claude-opus-5 / claude-opus-4.8 / gpt-5.6-sol all at high):

    /subagents setting explicit model arg resolved
    (none) (none) gpt-5.6-sol ✅
    (none) claude-opus-4.8 claude-opus-4.8 ❌
    complementary claude-opus-4.8 claude-opus-4.8 ❌
    gpt-5.6-sol claude-opus-4.8 claude-opus-4.8 ❌

    So an explicit model argument outranks even a /subagents value the user deliberately set. Since that argument is emitted by the calling model rather than typed by the user, model discretion silently overrides user configuration — with no warning surfaced.

    @tanselmi-appliedsurety — worth checking your events.jsonl for a "model" key in the task tool arguments (tool.execution_start, toolName: "task"). If it is absent, yours is the separate complementary unavailable path your /subagents output points to, and the two need different fixes. If it is present, these are the same bug.

    Repro script and suggested fixes are in #4432.

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    area:agentsSub-agents, fleet, autopilot, plan mode, background agents, and custom agentsarea:modelsModel selection, availability, switching, rate limits, and model-specific behavior

    Type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions