feat(gateway): substantive-plan gate — approach >=150 + real sub_task descriptions (#171)

Plans were vague because the gate accepted the bare minimum: PM
approach >=20 chars and title-only sub_tasks. minimax wrote exactly
the minimum.

- IWillPlanRequest.approach min_length 20 -> 150 (kept in sync with
  _PM_APPROACH_MIN_LEN; the gate enforces it at the choreographer
  layer too so direct/MCP callers can't bypass the HTTP boundary).
- New _thin_subtask_hint: every PM sub_task must have a title and a
  description >= _PM_SUBTASK_DESC_MIN_LEN (60) saying what the step
  does — each sub_task is both a delegate target AND a
  progress-checklist item, so a title alone is not a plan.
- cell_pm/main_pm role prompts: explicit "the gate REJECTS thin plans"
  framing + concrete sub_task example + the new minimums.
- Updated all affected test fixtures across the suite to use
  substantive approaches/descriptions; added thin-sub_task rejection
  coverage.

Commit 1 of 3 for the plan/progress quality work (#171/#172/#173).
This commit is contained in:
Renn F
2026-05-16 10:14:45 +02:00
parent e94159dce8
commit ed828a719b
14 changed files with 415 additions and 82 deletions
+19 -4
View File
@@ -208,12 +208,27 @@ async def test_i_will_plan_dispatches_to_choreographer() -> None:
"task_id": _TASK_ID,
"plan": "split into backend, frontend, ux cells",
"approach": (
"Three-cell decomposition: backend handles API, frontend "
"handles UI integration, ux-ui handles design."
"Three-cell decomposition: backend handles the API, frontend "
"handles UI integration, ux-ui handles design. Sequenced so "
"backend lands first, QA reviews each PR after it opens, "
"documentation follows, then complete and submit up. No "
"cross-cell dependencies beyond the stated ordering."
),
"sub_tasks": [
{"title": "Backend cell", "description": "API implementation"},
{"title": "Frontend cell", "description": "UI integration"},
{
"title": "Backend cell",
"description": (
"be-dev-1 implements the API endpoint and migration "
"with tests, opens the leaf PR for QA."
),
},
{
"title": "Frontend cell",
"description": (
"fe-dev-1 wires the panel to the new endpoint with "
"loading and error states, opens the leaf PR."
),
},
],
},
headers=_HEADERS,