Skip to content

Commit 654f078

Browse files
author
Zvi Fried
committed
worflow enhancements
1 parent 7b7ac0c commit 654f078

File tree

4 files changed

+87
-8
lines changed

4 files changed

+87
-8
lines changed

src/mcp_as_a_judge/models.py

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -259,6 +259,28 @@ class JudgeCodingPlanUserVars(BaseModel):
259259
description="Previous conversation history as JSON array with timestamps",
260260
)
261261

262+
# Domain focus and reuse/dependency planning (explicit inputs so plans don't get rejected)
263+
problem_domain: str = Field(
264+
default="",
265+
description="Concise statement of the problem domain being solved",
266+
)
267+
problem_non_goals: list[str] = Field(
268+
default_factory=list,
269+
description="Explicit non-goals/out-of-scope items to prevent scope creep",
270+
)
271+
# Library selection map and internal reuse map are free-form lists of objects
272+
# Using list[dict] to keep input flexible for different ecosystems
273+
library_plan: list[dict] = Field(
274+
default_factory=list,
275+
description=(
276+
"List of {purpose, selection, source: internal|external|custom, justification}"
277+
),
278+
)
279+
internal_reuse_components: list[dict] = Field(
280+
default_factory=list,
281+
description="List of {path, purpose, notes} for reusable repo components",
282+
)
283+
262284
# Conditional research fields
263285
research_required: bool = Field(
264286
default=False, description="Whether external research is required for this task"

src/mcp_as_a_judge/prompts/tool_descriptions/judge_coding_plan.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,10 @@ Validate a proposed plan and design against requirements, research needs, and ri
2121
- `research`: string — Findings and rationale (provide if available)
2222
- `research_urls`: list[string] — URLs for external research (if required)
2323
- `context`: string — Additional project context
24+
- `problem_domain`: string — Concise problem domain statement (optional but recommended)
25+
- `problem_non_goals`: list[string] — Non-goals/out-of-scope items (optional)
26+
- `library_plan`: list[object] — Library Selection Map entries: {purpose, selection, source: internal|external|custom, justification}
27+
- `internal_reuse_components`: list[object] — Internal Reuse Map entries: {path, purpose, notes}
2428

2529
## Returns
2630
- Response JSON schema (JudgeResponse):

src/mcp_as_a_judge/prompts/user/judge_coding_plan.md

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,32 @@ Please evaluate the following coding plan:
1919

2020
{{ design }}
2121

22+
## Problem Domain Statement
23+
24+
{{ problem_domain or "" }}
25+
26+
{% if problem_non_goals %}
27+
### Non-Goals
28+
{% for item in problem_non_goals %}- {{ item }}
29+
{% endfor %}
30+
{% endif %}
31+
32+
{% if library_plan %}
33+
## Library Selection Map (Purpose → Selection)
34+
35+
```
36+
{{ library_plan }}
37+
```
38+
{% endif %}
39+
40+
{% if internal_reuse_components %}
41+
## Internal Reuse Map (Repo Components)
42+
43+
```
44+
{{ internal_reuse_components }}
45+
```
46+
{% endif %}
47+
2248
## Research
2349

2450
{{ research|default("") }}

src/mcp_as_a_judge/server.py

Lines changed: 35 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1178,6 +1178,10 @@ async def _evaluate_coding_plan(
11781178
conversation_history: list[dict],
11791179
task_metadata: TaskMetadata,
11801180
ctx: Context,
1181+
problem_domain: str | None = None,
1182+
problem_non_goals: list[str] | None = None,
1183+
library_plan: list[dict] | None = None,
1184+
internal_reuse_components: list[dict] | None = None,
11811185
) -> JudgeResponse:
11821186
"""Evaluate coding plan using AI judge.
11831187
@@ -1216,6 +1220,11 @@ async def _evaluate_coding_plan(
12161220
else False,
12171221
identified_risks=task_metadata.identified_risks or [],
12181222
risk_mitigation_strategies=task_metadata.risk_mitigation_strategies or [],
1223+
# Domain focus and reuse maps (optional explicit inputs)
1224+
problem_domain=problem_domain or "",
1225+
problem_non_goals=problem_non_goals or [],
1226+
library_plan=library_plan or [],
1227+
internal_reuse_components=internal_reuse_components or [],
12191228
)
12201229
messages = create_separate_messages(
12211230
"system/judge_coding_plan.md",
@@ -1252,6 +1261,11 @@ async def judge_coding_plan(
12521261
context: str = "",
12531262
# OPTIONAL override
12541263
user_requirements: str | None = None,
1264+
# OPTIONAL explicit inputs to avoid rejection on missing deliverables
1265+
problem_domain: str | None = None,
1266+
problem_non_goals: list[str] | None = None,
1267+
library_plan: list[dict] | None = None,
1268+
internal_reuse_components: list[dict] | None = None,
12551269
) -> JudgeResponse:
12561270
"""Coding plan evaluation tool - description loaded from tool_description_provider."""
12571271
# Log tool execution start
@@ -1265,6 +1279,10 @@ async def judge_coding_plan(
12651279
"research": research,
12661280
"context": context,
12671281
"research_urls": research_urls,
1282+
"problem_domain": problem_domain,
1283+
"problem_non_goals": problem_non_goals,
1284+
"library_plan": library_plan,
1285+
"internal_reuse_components": internal_reuse_components,
12681286
}
12691287

12701288
try:
@@ -1522,6 +1540,10 @@ async def judge_coding_plan(
15221540
history_json_array,
15231541
task_metadata, # Pass task metadata for conditional features
15241542
ctx,
1543+
problem_domain=problem_domain,
1544+
problem_non_goals=problem_non_goals,
1545+
library_plan=library_plan,
1546+
internal_reuse_components=internal_reuse_components,
15251547
)
15261548

15271549
# Additional research validation if approved
@@ -1556,17 +1578,22 @@ async def judge_coding_plan(
15561578
# If missing but the plan was approved, convert to required improvements
15571579
missing_deliverables: list[str] = []
15581580
try:
1581+
# Fill from explicit inputs if LLM omitted them in metadata
1582+
if problem_domain and not getattr(updated_task_metadata, "problem_domain", "").strip():
1583+
updated_task_metadata.problem_domain = problem_domain # type: ignore[attr-defined]
1584+
if problem_non_goals and not getattr(updated_task_metadata, "problem_non_goals", None):
1585+
updated_task_metadata.problem_non_goals = problem_non_goals # type: ignore[attr-defined]
1586+
if library_plan and (not getattr(updated_task_metadata, "library_plan", None) or len(getattr(updated_task_metadata, "library_plan", [])) == 0):
1587+
updated_task_metadata.library_plan = library_plan # type: ignore[attr-defined]
1588+
if internal_reuse_components and (not getattr(updated_task_metadata, "internal_reuse_components", None) or len(getattr(updated_task_metadata, "internal_reuse_components", [])) == 0):
1589+
updated_task_metadata.internal_reuse_components = internal_reuse_components # type: ignore[attr-defined]
1590+
1591+
# Now check for missing deliverables
15591592
if not getattr(updated_task_metadata, "problem_domain", "").strip():
15601593
missing_deliverables.append("Add a clear Problem Domain Statement with explicit non-goals")
1561-
# library_plan is a list of LibraryPlanItem entries
1562-
if not getattr(updated_task_metadata, "library_plan", []) or len(
1563-
getattr(updated_task_metadata, "library_plan", [])
1564-
) == 0:
1565-
missing_deliverables.append(
1566-
"Provide a Library Selection Map (purpose → internal/external library with justification)"
1567-
)
1594+
if not getattr(updated_task_metadata, "library_plan", []) or len(getattr(updated_task_metadata, "library_plan", [])) == 0:
1595+
missing_deliverables.append("Provide a Library Selection Map (purpose → internal/external library with justification)")
15681596
except Exception:
1569-
# Be resilient; do not crash on schema variations
15701597
pass
15711598

15721599
effective_approved = evaluation_result.approved and not missing_deliverables

0 commit comments

Comments
 (0)