You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
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.
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.
• /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.
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.
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:
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.
Activity
nick-thinks commentedon Aug 6, 2026
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 infoand the log file will look like/Users/nick/.copilot/logs/process-1786017957609-61781.logJust to double check, can you also confirm if you have overridden the rubber duck subagent model in your subagent settings? If you go to
/subagentsyou 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.
tanselmi-appliedsurety commentedon Aug 6, 2026
Thanks @nick-thinks — checked both.
• /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.
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.
copilot-cli-4380-rubber-duck-evidence.REDACTED.txt
eggboy commentedon Aug 11, 2026
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-5and a complementary model was available (gpt-5.6-sol, samehighprice category). Rubber-duck still ran onclaude-opus-4.8.Cause: the parent agent passed
modelexplicitly in thetasktool call. Fromevents.jsonl:{"agent_type":"rubber-duck","name":"reval-review","model":"claude-opus-4.8","prompt":"..."}Driving
subagentStartPlaninruntime.nodedirectly (parentclaude-opus-5;claude-opus-5/claude-opus-4.8/gpt-5.6-solall athigh):/subagentssettingmodelarggpt-5.6-sol✅claude-opus-4.8claude-opus-4.8❌complementaryclaude-opus-4.8claude-opus-4.8❌gpt-5.6-solclaude-opus-4.8claude-opus-4.8❌So an explicit
modelargument outranks even a/subagentsvalue 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.jsonlfor a"model"key in thetasktool arguments (tool.execution_start,toolName: "task"). If it is absent, yours is the separatecomplementary unavailablepath your/subagentsoutput 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.