Conversation
WalkthroughThis pull request performs a comprehensive rebranding of the MCP server from Root Signals to Scorable, including namespace migration from Changes
Estimated code review effort🎯 3 (Moderate) | ⏱️ ~25 minutes
Poem
Pre-merge checks and finishing touches✅ Passed checks (3 passed)
✨ Finishing touches
🧪 Generate unit tests (beta)
Comment |
There was a problem hiding this comment.
Actionable comments posted: 0
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (1)
.github/workflows/test.yml (1)
86-94: Update codecov upload name for consistency.The codecov upload name still references "rootsignals-mcp-integration-codecov" on line 92, which is inconsistent with the rebranding.
Apply this diff to complete the rebranding:
flags: integration - name: rootsignals-mcp-integration-codecov + name: scorable-mcp-integration-codecov fail_ci_if_error: false
🧹 Nitpick comments (6)
src/scorable_mcp/test/test_client.py (1)
23-324: Silence Ruff ARG001 for unusedcompose_up_mcp_serverfixture argumentsEach async test takes
compose_up_mcp_serveronly to trigger the fixture’s side effects, so the argument is intentionally unused but flagged by Ruff (ARG001). Consider annotating the parameter with anoqacomment in these tests to keep lint clean, for example:-async def test_client_connection(compose_up_mcp_server: Any) -> None: +async def test_client_connection(compose_up_mcp_server: Any) -> None: # noqa: ARG001You can apply the same pattern to the other tests that accept
compose_up_mcp_serverbut don’t reference it.src/scorable_mcp/stdio_server.py (1)
15-19: Drop unused# noqa: E501on the ScorableFastMCP importRuff reports the
# noqa: E501as unused (E501 isn’t enabled), while# isort: skipis still useful. You can simplify the import line as:-from scorable_mcp.fastmcp_adapter import ScorableFastMCP # noqa: E501 # isort: skip +from scorable_mcp.fastmcp_adapter import ScorableFastMCP # isort: skipThis keeps imports ordered as intended without carrying an unnecessary noqa.
README.md (1)
2-2: LGTM! Documentation rebranding is comprehensive.All documentation has been successfully updated including:
- Logo and branding links
- Product name references
- API key environment variables
- Docker image references
- Code examples with
ScorableMCPClient- Import paths to
scorable_mcp.*- Configuration examples
Optional: Address markdown linting warnings.
Static analysis flagged a few minor markdown formatting issues:
- Badge images (lines 11, 15, 19, 23) should have alt text for accessibility
- Heading level jump at line 55 (h4 instead of h3)
These are not critical but could improve documentation quality.
Also applies to: 10-10, 14-14, 18-18, 22-22, 27-29, 33-33, 37-50, 55-56, 62-62, 69-77, 85-89, 100-108, 143-143, 146-146
src/scorable_mcp/schema.py (1)
1-4: Minor: consider updating remaining docstring references to Root-generated typesA few docstrings still mention
root.generated.openapi_aclient...even though this module is now Scorable‑branded. If those types are still the true upstream sources, this is fine; otherwise you may want to reword them to reference “Scorable OpenAPI models” (or similar) for consistency with the rest of the rebrand.Purely a documentation/clarity point, no behavioral impact.
Also applies to: 155-179
src/scorable_mcp/evaluator.py (1)
101-112: Minor: docstrings still reference evaluator_id in run_evaluation_by_nameThe docstring in
run_evaluation_by_namestill says “The evaluator_id field will be treated as the evaluator name”, but the request model now usesevaluator_nameexplicitly. Same for therun_evaluationdocstring mentioning anevaluator_idarg rather than therequestmodel.Consider tightening these docstrings to match the actual
EvaluationRequest/EvaluationRequestByNamesignatures to avoid confusion for readers.Also applies to: 135-144
src/scorable_mcp/root_api_client.py (1)
113-149: Both suggestions are reasonable but optional given current usage patternsVerification confirms:
Client reuse: The
_make_requestmethod is called only 4 times in the codebase (from_fetch_paginated_results,list_evaluators, and related judgment methods). The currentasync with httpx.AsyncClient(...) as client:pattern is idiomatic and handles resource cleanup automatically. Pooling would require non-trivial lifecycle management and offers minimal practical benefit at this call frequency.Logger style: Switching
logger.error(f"Request error: {str(e)}")tologger.error("Request error: %s", e)would improve consistency with Ruff and placeholder-based logging patterns—this is valid polish.The code is functionally correct; both suggestions are valid refinements rather than necessary changes.
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
⛔ Files ignored due to path filters (1)
uv.lockis excluded by!**/*.lock
📒 Files selected for processing (32)
.env.example(1 hunks).github/workflows/test.yml(3 hunks)Dockerfile(2 hunks)README.md(7 hunks)demonstrations/example_pydantic-ai.py(4 hunks)main.py(1 hunks)pyproject.toml(4 hunks)src/__init__.py(1 hunks)src/root_signals_mcp/__init__.py(0 hunks)src/root_signals_mcp/test/__init__.py(0 hunks)src/scorable_mcp/__init__.py(1 hunks)src/scorable_mcp/client.py(8 hunks)src/scorable_mcp/core.py(4 hunks)src/scorable_mcp/evaluator.py(4 hunks)src/scorable_mcp/fastmcp_adapter.py(3 hunks)src/scorable_mcp/judge.py(3 hunks)src/scorable_mcp/root_api_client.py(12 hunks)src/scorable_mcp/schema.py(11 hunks)src/scorable_mcp/settings.py(4 hunks)src/scorable_mcp/sse_server.py(3 hunks)src/scorable_mcp/stdio_server.py(4 hunks)src/scorable_mcp/test/__init__.py(1 hunks)src/scorable_mcp/test/conftest.py(1 hunks)src/scorable_mcp/test/test_client.py(9 hunks)src/scorable_mcp/test/test_evaluator.py(5 hunks)src/scorable_mcp/test/test_judge.py(3 hunks)src/scorable_mcp/test/test_root_client.py(22 hunks)src/scorable_mcp/test/test_settings.py(1 hunks)src/scorable_mcp/test/test_sse_integration.py(7 hunks)src/scorable_mcp/test/test_sse_server.py(5 hunks)src/scorable_mcp/test/test_stdio_integration.py(9 hunks)src/scorable_mcp/tools.py(2 hunks)
💤 Files with no reviewable changes (2)
- src/root_signals_mcp/init.py
- src/root_signals_mcp/test/init.py
🧰 Additional context used
🧬 Code graph analysis (19)
src/scorable_mcp/__init__.py (1)
src/scorable_mcp/fastmcp_adapter.py (1)
ScorableFastMCP(25-58)
src/scorable_mcp/test/test_judge.py (5)
src/scorable_mcp/judge.py (3)
JudgeService(24-113)list_judges(68-81)run_judge(83-113)src/scorable_mcp/root_api_client.py (4)
ResponseValidationError(40-51)ScorableAPIError(25-37)list_judges(395-454)run_judge(456-492)src/scorable_mcp/schema.py (3)
JudgeEvaluatorResult(265-270)RunJudgeRequest(239-262)RunJudgeResponse(273-278)src/scorable_mcp/test/test_evaluator.py (1)
mock_api_client(27-35)src/scorable_mcp/client.py (2)
list_judges(223-230)run_judge(232-253)
src/scorable_mcp/core.py (2)
src/scorable_mcp/evaluator.py (1)
EvaluatorService(25-165)src/scorable_mcp/judge.py (1)
JudgeService(24-113)
src/scorable_mcp/test/test_client.py (2)
src/scorable_mcp/client.py (1)
ScorableMCPClient(22-253)src/scorable_mcp/test/conftest.py (1)
compose_up_mcp_server(129-175)
src/scorable_mcp/test/conftest.py (1)
src/scorable_mcp/sse_server.py (1)
SSEMCPServer(31-47)
main.py (1)
src/scorable_mcp/sse_server.py (1)
run_server(91-98)
src/scorable_mcp/sse_server.py (1)
src/scorable_mcp/core.py (1)
RootMCPServerCore(42-158)
src/scorable_mcp/tools.py (1)
src/scorable_mcp/schema.py (5)
ListEvaluatorsRequest(23-29)EvaluationRequest(126-133)EvaluationRequestByName(91-123)CodingPolicyAdherenceEvaluationRequest(136-143)ListJudgesRequest(205-211)
src/scorable_mcp/fastmcp_adapter.py (1)
src/scorable_mcp/core.py (1)
RootMCPServerCore(42-158)
src/scorable_mcp/test/test_sse_integration.py (4)
src/scorable_mcp/client.py (1)
ScorableMCPClient(22-253)src/scorable_mcp/evaluator.py (1)
EvaluatorService(25-165)src/scorable_mcp/schema.py (5)
EvaluationRequest(126-133)EvaluationRequestByName(91-123)EvaluationResponse(150-162)EvaluatorInfo(174-196)EvaluatorsListResponse(199-202)src/scorable_mcp/test/test_sse_server.py (1)
test_list_tools(37-54)
src/scorable_mcp/root_api_client.py (1)
src/scorable_mcp/schema.py (5)
EvaluationResponse(150-162)EvaluatorInfo(174-196)JudgeInfo(214-230)RunJudgeRequest(239-262)RunJudgeResponse(273-278)
src/scorable_mcp/stdio_server.py (2)
src/scorable_mcp/core.py (1)
RootMCPServerCore(42-158)src/scorable_mcp/fastmcp_adapter.py (1)
ScorableFastMCP(25-58)
src/scorable_mcp/test/test_settings.py (1)
src/scorable_mcp/settings.py (1)
get_package_version(15-34)
src/scorable_mcp/test/test_sse_server.py (2)
src/scorable_mcp/root_api_client.py (2)
ResponseValidationError(40-51)ScorableEvaluatorRepository(215-389)src/scorable_mcp/schema.py (2)
EvaluationRequest(126-133)UnknownToolRequest(37-45)
src/scorable_mcp/test/test_stdio_integration.py (1)
src/scorable_mcp/core.py (1)
RootMCPServerCore(42-158)
src/scorable_mcp/test/test_root_client.py (2)
src/scorable_mcp/root_api_client.py (4)
ResponseValidationError(40-51)ScorableAPIError(25-37)ScorableEvaluatorRepository(215-389)ScorableJudgeRepository(392-492)src/scorable_mcp/schema.py (2)
EvaluatorInfo(174-196)RunJudgeRequest(239-262)
src/scorable_mcp/evaluator.py (3)
src/scorable_mcp/root_api_client.py (4)
ResponseValidationError(40-51)ScorableAPIError(25-37)ScorableEvaluatorRepository(215-389)list_evaluators(218-276)src/scorable_mcp/schema.py (5)
EvaluationRequest(126-133)EvaluationRequestByName(91-123)EvaluationResponse(150-162)EvaluatorInfo(174-196)EvaluatorsListResponse(199-202)src/scorable_mcp/client.py (1)
list_evaluators(113-120)
src/scorable_mcp/judge.py (3)
src/scorable_mcp/root_api_client.py (4)
ResponseValidationError(40-51)ScorableAPIError(25-37)ScorableJudgeRepository(392-492)list_judges(395-454)src/scorable_mcp/schema.py (4)
JudgeInfo(214-230)JudgesListResponse(233-236)RunJudgeRequest(239-262)RunJudgeResponse(273-278)src/scorable_mcp/client.py (1)
list_judges(223-230)
src/scorable_mcp/test/test_evaluator.py (2)
src/scorable_mcp/evaluator.py (2)
EvaluatorService(25-165)list_evaluators(71-82)src/scorable_mcp/root_api_client.py (4)
ResponseValidationError(40-51)ScorableAPIError(25-37)list_evaluators(218-276)run_evaluator(278-330)
🪛 markdownlint-cli2 (0.18.1)
README.md
11-11: Images should have alternate text (alt text)
(MD045, no-alt-text)
15-15: Images should have alternate text (alt text)
(MD045, no-alt-text)
19-19: Images should have alternate text (alt text)
(MD045, no-alt-text)
23-23: Images should have alternate text (alt text)
(MD045, no-alt-text)
55-55: Heading levels should only increment by one level at a time
Expected: h3; Actual: h4
(MD001, heading-increment)
🪛 Ruff (0.14.4)
src/scorable_mcp/__init__.py
6-6: Unused noqa directive (non-enabled: F401)
Remove unused noqa directive
(RUF100)
src/scorable_mcp/test/test_client.py
24-24: Unused function argument: compose_up_mcp_server
(ARG001)
src/scorable_mcp/test/test_sse_integration.py
32-32: Unused function argument: compose_up_mcp_server
(ARG001)
src/scorable_mcp/root_api_client.py
148-148: Use explicit conversion flag
Replace with conversion flag
(RUF010)
src/scorable_mcp/stdio_server.py
18-18: Unused noqa directive (non-enabled: E501)
Remove unused noqa directive
(RUF100)
src/scorable_mcp/evaluator.py
57-57: Consider moving this statement to an else block
(TRY300)
src/scorable_mcp/judge.py
54-54: Consider moving this statement to an else block
(TRY300)
🔇 Additional comments (37)
src/scorable_mcp/test/__init__.py (1)
1-1: LGTM!The package initializer is minimal and appropriate. The docstring is clear, uses the updated "Scorable" branding, and follows Python conventions for test package initialization.
src/__init__.py (1)
1-1: Docstring update looks goodDocstring accurately reflects the Scorable rebrand and keeps the module description clear and minimal. No further changes needed.
.env.example (1)
1-5: LGTM! Configuration properly rebranded.The header and environment variable have been consistently updated to reflect the Scorable branding.
Dockerfile (2)
2-2: LGTM! Maintainer email updated.The maintainer label has been properly updated to the Scorable domain.
26-26: LGTM! Module path updated.The CMD instruction has been properly updated to use the new
scorable_mcpnamespace.main.py (1)
1-3: LGTM! Entry point properly rebranded.The docstring and import path have been consistently updated to reflect the Scorable namespace.
.github/workflows/test.yml (3)
36-42: LGTM! Environment variable creation updated.The workflow properly uses the new
SCORABLE_API_KEYsecret for both the.envfile and the GitHub environment.
56-63: LGTM! API key check updated.The conditional check and error message properly reference the new
SCORABLE_API_KEYenvironment variable.
65-71: LGTM! Coverage path updated.The pytest coverage configuration properly uses the new
scorable_mcpnamespace.pyproject.toml (4)
5-12: LGTM! Project metadata updated.The project name, description, and authors have been comprehensively updated to reflect the Scorable branding.
47-54: LGTM! Test paths updated.The pytest test paths have been properly updated to use the new
scorable_mcpnamespace.
56-62: LGTM! Coverage configuration updated.The coverage source and omit paths have been properly updated to use the new
scorable_mcpnamespace.
74-104: LGTM! Entry points and tool configurations updated.The project scripts and tool configurations have been properly updated to use the new
scorable_mcpnamespace.src/scorable_mcp/test/test_settings.py (1)
5-5: LGTM! Import path updated.The import statement has been properly updated to use the new
scorable_mcpnamespace.src/scorable_mcp/__init__.py (1)
1-6: LGTM! Package initialization properly set up.The package docstring and re-export of
ScorableFastMCPare correctly implemented. Thenoqa: F401comment is appropriate for re-exports in__init__.pyfiles to document the intentional re-export pattern, even if the specific rule isn't currently enabled in your linter configuration.demonstrations/example_pydantic-ai.py (3)
1-31: LGTM! Documentation updated.The file header and acceptance criteria have been properly updated to reference Scorable branding.
55-56: LGTM! Variable renamed.The server variable has been properly renamed from
root_signals_servertoscorable_server.
72-78: LGTM! Agent configuration updated.The Agent initialization properly uses the renamed
scorable_servervariable.src/scorable_mcp/test/conftest.py (1)
15-18: SSE server import and logger rename look consistent with the rebrandImporting
SSEMCPServerfromscorable_mcp.sse_serverand using the"scorable_mcp_tests"logger aligns with the new namespace and other tests; no issues spotted here.src/scorable_mcp/test/test_evaluator.py (1)
9-35: Evaluator tests correctly updated to Scorable imports and error typesThe move to
scorable_mcp.*imports, the patchedScorableEvaluatorRepositorytarget, and the use ofScorableAPIErrorin side effects all match the updatedEvaluatorServicewiring and preserve the previous behavior and assertions.Also applies to: 56-61, 222-243
src/scorable_mcp/test/test_judge.py (1)
9-24: Judge tests correctly migrated to Scorable types and repositoryImports, the
ScorableJudgeRepositorypatch, and the use ofScorableAPIErrorare all aligned with the updatedJudgeServiceand root API client; test intent and coverage remain the same.Also applies to: 35-40, 82-83
src/scorable_mcp/test/test_client.py (1)
1-21: Integration test setup correctly rebranded to ScorableDocstring,
ScorableMCPClientimport,settings.scorable_api_key, skip reason, and logger name all match the new Scorable naming and configuration.src/scorable_mcp/sse_server.py (1)
1-5: SSE server rebrand and config wiring look consistentRenaming the docstring, logger, imports to
scorable_mcp.*, and startup logs (includingsettings.scorable_api_url) cleanly aligns this transport with the Scorable branding without altering the server’s public behavior.Also applies to: 21-23, 28-28, 106-108
src/scorable_mcp/client.py (1)
1-7: Client rename and Scorable-focused docstrings look goodThe class rename to
ScorableMCPClient, logger namespace, and updated evaluator/judge docstrings are coherent with the rest of the Scorable stack, and they don’t alter the client’s behavior or API surface.Also applies to: 17-23, 113-115, 130-131, 160-161, 185-186, 208-209, 224-225
src/scorable_mcp/test/test_sse_server.py (1)
10-16: LGTM! Rebranding updates are consistent.All import paths, class names, environment variable references, and logger names have been correctly updated from Root Signals to Scorable. The test logic remains unchanged.
Also applies to: 19-20, 26-26, 335-335, 346-346, 362-362, 370-370, 442-442
src/scorable_mcp/core.py (1)
1-1: LGTM! Core module rebranding is complete.All import paths, docstrings, logger names, and server descriptors have been correctly updated to reflect the Scorable branding.
Also applies to: 18-21, 34-34, 36-36, 46-46
src/scorable_mcp/test/test_root_client.py (1)
1-1: LGTM! Test file rebranding is thorough and consistent.All references to Root Signals have been successfully updated to Scorable, including:
- Import paths (
scorable_mcp.*)- Class names (
ScorableAPIError,ScorableEvaluatorRepository,ScorableJudgeRepository)- Environment variables (
SCORABLE_API_KEY)- Logger names and User-Agent strings
Test logic remains functionally unchanged.
Also applies to: 9-16, 20-21, 27-27, 32-32, 37-37, 51-51, 73-73, 96-96, 108-108, 134-134, 166-166, 182-182, 205-205, 213-213, 241-241, 273-274, 286-287, 322-323, 370-370, 379-379, 427-427, 438-438, 452-452, 471-471, 492-492, 506-506, 521-521
src/scorable_mcp/test/test_sse_integration.py (1)
1-1: LGTM! Integration test rebranding is complete.All references have been correctly updated:
- Import paths to
scorable_mcp.*- Client class to
ScorableMCPClient- Environment variables to
SCORABLE_API_KEY- Logger names to
scorable_mcp_testsTest functionality is preserved.
Also applies to: 8-10, 17-17, 21-22, 28-28, 35-35, 61-61, 78-78, 95-95, 128-128, 330-330, 370-370
src/scorable_mcp/tools.py (1)
1-1: LGTM! Tool catalog rebranding is complete.All tool descriptions have been updated to reference Scorable instead of Root Signals. Import paths are correctly updated to
scorable_mcp.schema.Also applies to: 7-14, 18-18, 23-23, 28-28, 33-33, 38-38, 43-43, 48-48
src/scorable_mcp/fastmcp_adapter.py (1)
1-1: LGTM! FastMCP adapter rebranding is complete.The adapter class has been renamed from
RootSignalsFastMCPtoScorableFastMCP, with all supporting changes (imports, docstrings, logger names) updated consistently.Also applies to: 7-7, 20-20, 22-22, 25-25, 51-51
src/scorable_mcp/settings.py (1)
1-1: Environment variable names have changed (breaking change).The settings field names have been updated as part of the rebranding:
ROOT_SIGNALS_API_KEY→SCORABLE_API_KEYROOT_SIGNALS_API_URL→SCORABLE_API_URL(default nowhttps://api.scorable.ai)ROOT_SIGNALS_API_TIMEOUT→SCORABLE_API_TIMEOUTUsers upgrading from the previous version will need to update their environment variables. Ensure that:
- Migration documentation exists
- Release notes highlight this breaking change
- The README and examples have been updated (confirmed in this PR)
Also applies to: 38-38, 43-50, 51-54, 74-74, 113-113
src/scorable_mcp/schema.py (1)
48-60: BaseScorableModel config looks consistent with usage across Scorable API response models
extra="ignore"plusstrict=Trueandvalidate_assignment=Trueis a reasonable combo here: it gives you forward‑compatible schema evolution while still failing fast if core fields are missing or of the wrong type. The downstream repositories (ScorableEvaluatorRepository/ScorableJudgeRepository) are correctly constructingEvaluationResponse,EvaluatorInfo,JudgeInfo,JudgesListResponse,JudgeEvaluatorResult, andRunJudgeResponsefrom raw API data, so adoptingBaseScorableModelfor all these keeps behavior consistent and centralized.No changes needed from my side in these model definitions.
Also applies to: 149-203, 214-237, 265-278
src/scorable_mcp/test/test_stdio_integration.py (1)
16-28: Env var and module rebrand in stdio tests is consistent
- Importing
settingsfromscorable_mcp.settingsand checkingsettings.scorable_api_key.get_secret_value()in theskipifcondition matches the rebranded configuration.- Using
server_env["SCORABLE_API_KEY"] = settings.scorable_api_key.get_secret_value()ensures the spawned stdio server sees the same key as the in‑process client.- Updating stdio entrypoints to
"scorable_mcp.stdio_server"and the logger name to"scorable_mcp_tests"keeps the tests aligned with the new package namespace.The continued use of
RootMCPServerCoreas the core class name looks intentional and consistent withscorable_mcp.core.Also applies to: 109-116, 141-148, 206-213, 278-285, 302-309
src/scorable_mcp/evaluator.py (1)
8-23: EvaluatorService wiring to ScorableEvaluatorRepository and error mapping looks correct
ScorableEvaluatorRepositoryis initialized withsettings.scorable_api_keyandsettings.scorable_api_url, matching the new base client defaults and keeping configuration explicit.fetch_evaluators/run_evaluation/run_evaluation_by_nameconsistently catchScorableAPIErrorandResponseValidationError, log withexc_info=settings.debug, and surfaceRuntimeErrorwith user‑oriented messages, which preserves a clean boundary between HTTP concerns and the rest of the MCP server.- The log messages have been rebranded to “Scorable API” everywhere, which should help when correlating logs across components.
From a behavior standpoint this looks solid.
Also applies to: 28-33, 47-69, 113-134, 145-165
src/scorable_mcp/root_api_client.py (2)
13-23: ScorableRepositoryBase rebrand and error handling are coherent
- The base client now pulls
api_key/base_urlfromsettings.scorable_api_key/settings.scorable_api_url, and sets a Scorable‑specific User‑Agent, which matches the rest of the rename._make_requestcorrectly:
- logs request/response details (guarded by
settings.debug),- raises
ScorableAPIErrorfor HTTP ≥ 400 and forhttpx.RequestError,- returns JSON bodies or
{}for 204 responses.- This aligns with how
EvaluatorService/JudgeServicecatchScorableAPIErrorandResponseValidationError, so the abstraction boundary is consistent.No behavioral concerns here.
Also applies to: 54-80, 82-103, 113-149
215-276: Evaluator and judge repositories correctly adapted to Scorable models
ScorableEvaluatorRepositoryandScorableJudgeRepositoryboth:
- use
_fetch_paginated_resultswith appropriateresource_typeand limits derived from Scorable settings,- map raw API data into
EvaluatorInfo,JudgeInfo, and nestedJudgeInfo.NestedEvaluatorInfoPydantic models,- propagate structural issues via
ResponseValidationErrorwith the offending payload attached.- Evaluation/judge execution methods (
run_evaluator,run_evaluator_by_name,run_judge) all:
- build payloads from the appropriate schema types (
RunJudgeRequest, etc.),- rely on
_make_requestfor HTTP concerns,- validate responses via
EvaluationResponse/RunJudgeResponse, surfacing validation problems viaResponseValidationError.This lines up cleanly with the service layers and preserves previous behavior under the new Scorable naming.
Also applies to: 332-389, 392-492
src/scorable_mcp/judge.py (1)
8-22: JudgeService Scorable wiring and error handling look consistent
ScorableJudgeRepositoryis instantiated withsettings.scorable_api_keyandsettings.scorable_api_url, mirroring the evaluator service.fetch_judgesandrun_judgeboth:
- log high‑level actions against the “Scorable API”,
- catch
ScorableAPIErrorandResponseValidationErrorand wrap them inRuntimeErrorwith clear messages,- optionally log full
response_datawhen present, gated bysettings.debug.list_judgescorrectly wraps the underlying list in aJudgesListResponse, matching the schema used by the core and client code.Implementation is consistent and appropriate; no changes needed.
Also applies to: 27-32, 46-66, 83-113
Summary by CodeRabbit
Documentation
Refactor
Chores
ROOT_SIGNALS_API_KEYtoSCORABLE_API_KEY.