Bug Description
The web dashboard shows "Turn ?" for every turn when using the Copilot provider. The Claude provider correctly shows the turn number (e.g., "Turn 7").
Root Cause
The Copilot SDK's assistant.turn_start event exposes the turn number as turn_id (a string), but the Conductor copilot provider reads turn (which doesn't exist on the event data object), causing it to always be None.
The React frontend then renders Turn ? via the nullish coalescing fallback: Turn ${i.turn ?? "?"}.
Affected Code
File: conductor/providers/copilot.py
Location 1 — _log_event_verbose (line ~1122):
# Current (broken):
turn = getattr(event.data, "turn", None)
# Fix:
turn = getattr(event.data, "turn_id", None)
Location 2 — _forward_event (line ~1179):
# Current (broken):
turn = getattr(event.data, "turn", None)
callback("agent_turn_start", {"turn": turn})
# Fix:
turn = getattr(event.data, "turn_id", None)
callback("agent_turn_start", {"turn": turn})
Evidence
The Copilot SDK (github_copilot_sdk 0.2.0) defines the field as turn_id: str | None in copilot/generated/session_events.py (line 2203):
turn_id: str | None = None
"""Identifier for this turn within the agentic loop, typically a stringified turn number"""
For comparison, the Claude provider (claude.py, line 971) works correctly because it maintains its own iteration counter instead of relying on the SDK event:
event_callback("agent_turn_start", {"turn": iteration})
Reproduction
- Run any Conductor workflow with the Copilot provider and
--web flag
- Open the web dashboard
- Observe that all turns display as "Turn ?" instead of "Turn 1", "Turn 2", etc.
Environment
- Conductor CLI: 0.1.5
- GitHub Copilot SDK: 0.2.0
- OS: Windows (also likely affects Linux/macOS)
Suggested Fix
Two-line change — replace "turn" with "turn_id" in both getattr calls in copilot.py.
Bug Description
The web dashboard shows "Turn ?" for every turn when using the Copilot provider. The Claude provider correctly shows the turn number (e.g., "Turn 7").
Root Cause
The Copilot SDK's
assistant.turn_startevent exposes the turn number asturn_id(a string), but the Conductor copilot provider readsturn(which doesn't exist on the event data object), causing it to always beNone.The React frontend then renders
Turn ?via the nullish coalescing fallback:Turn ${i.turn ?? "?"}.Affected Code
File:
conductor/providers/copilot.pyLocation 1 —
_log_event_verbose(line ~1122):Location 2 —
_forward_event(line ~1179):Evidence
The Copilot SDK (
github_copilot_sdk 0.2.0) defines the field asturn_id: str | Noneincopilot/generated/session_events.py(line 2203):For comparison, the Claude provider (
claude.py, line 971) works correctly because it maintains its owniterationcounter instead of relying on the SDK event:Reproduction
--webflagEnvironment
Suggested Fix
Two-line change — replace
"turn"with"turn_id"in bothgetattrcalls incopilot.py.