Skip to content

Commit 28758e4

Browse files
committed
fix: handle invalid coaching payloads for nudges
1 parent 987a135 commit 28758e4

File tree

2 files changed

+36
-1
lines changed

2 files changed

+36
-1
lines changed

src/primer/mcp/tools.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import os
66

77
import httpx
8+
from pydantic import ValidationError
89

910
from primer.mcp.nudges import build_in_session_nudges
1011
from primer.mcp.sync import sync_sessions
@@ -251,7 +252,7 @@ def primer_in_session_nudges(
251252
from primer.common.schemas import CoachingBrief
252253

253254
coaching_brief = CoachingBrief.model_validate(resp.json())
254-
except httpx.RequestError:
255+
except (ValidationError, ValueError, httpx.RequestError, json.JSONDecodeError):
255256
coaching_brief = None
256257

257258
data = build_in_session_nudges(live_signals, coaching_brief)

tests/test_mcp_tools.py

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -366,6 +366,40 @@ def test_primer_in_session_nudges_success(mock_get_signals, mock_get):
366366
assert "Debugging playbook" in result
367367

368368

369+
@patch("primer.mcp.tools.httpx.get")
370+
@patch("primer.mcp.tools.get_live_session_signals")
371+
def test_primer_in_session_nudges_falls_back_when_coaching_payload_is_invalid(
372+
mock_get_signals, mock_get
373+
):
374+
mock_get_signals.return_value = LiveSessionSignalsResponse(
375+
session_id="session-123",
376+
agent_type="claude_code",
377+
project_name="api-server",
378+
total_messages=12,
379+
risk_level="high",
380+
satisfaction_signal="negative",
381+
signals=[
382+
LiveSessionSignal(
383+
signal_type="verification_failure",
384+
severity="warning",
385+
title="Verification is failing",
386+
detail="Recent test runs are failing repeatedly.",
387+
)
388+
],
389+
)
390+
mock_resp = MagicMock()
391+
mock_resp.status_code = 200
392+
mock_resp.json.return_value = {"brief_type": "session_start", "sections": "invalid"}
393+
mock_get.return_value = mock_resp
394+
395+
from primer.mcp.tools import primer_in_session_nudges
396+
397+
result = primer_in_session_nudges(project_name="api-server")
398+
399+
assert "In-Session Workflow Nudges" in result
400+
assert "Tighten the verification loop" in result
401+
402+
369403
@patch("primer.mcp.tools.get_live_session_signals")
370404
def test_primer_in_session_nudges_error(mock_get_signals):
371405
mock_get_signals.side_effect = ValueError("No local sessions found")

0 commit comments

Comments
 (0)