Context
Spun out of #412. That issue consolidates the computation of automated-test completeness into a single predicate. This issue is about the separate, orthogonal problem: the three MCP status tools render that verdict into two different output schemas.
The divergence
get_status() → StatisticsService.to_status_dict():
- per-req:
completed, implementations, implementation_type, automated_tests:{total,passed,failed,skipped,missing,not_applicable}, manual_tests:{...}
get_requirement_status(id) / get_requirements_status(urn) → details.py:
- per-req:
id, urn, lifecycle_state, implementation, test_summary:{passed,failed,skipped,missing}, meets_requirements
Concrete mismatches an MCP client has to reconcile:
- verdict field name:
completed vs meets_requirements
- implementation field name:
implementation_type vs implementation
- test breakdown: a single flat
test_summary (automated only, no total, no not_applicable) vs split automated_tests + manual_tests objects carrying total and not_applicable
- manual-test results are absent entirely from the
test_summary shape
Why deferred from #412
Aligning the schemas is a breaking change to two live MCP tool contracts, independent of fixing the computation drift. #412 deliberately maps the unified predicate back into the existing test_summary/meets_requirements shape to avoid expanding scope.
To investigate
- Pick the canonical shape (likely the
to_status_dict() per-req shape, since it's the richer/more honest one) and migrate the two details.py-backed tools onto it.
- Decide on a deprecation/transition story for MCP clients depending on
meets_requirements / flat test_summary.
- Confirm whether
get_status's to_status_dict() and the per-id/scoped tools should literally share a serializer.
Blocked on / best done after #412 lands.
Context
Spun out of #412. That issue consolidates the computation of automated-test completeness into a single predicate. This issue is about the separate, orthogonal problem: the three MCP status tools render that verdict into two different output schemas.
The divergence
get_status()→StatisticsService.to_status_dict():completed,implementations,implementation_type,automated_tests:{total,passed,failed,skipped,missing,not_applicable},manual_tests:{...}get_requirement_status(id)/get_requirements_status(urn)→details.py:id,urn,lifecycle_state,implementation,test_summary:{passed,failed,skipped,missing},meets_requirementsConcrete mismatches an MCP client has to reconcile:
completedvsmeets_requirementsimplementation_typevsimplementationtest_summary(automated only, nototal, nonot_applicable) vs splitautomated_tests+manual_testsobjects carryingtotalandnot_applicabletest_summaryshapeWhy deferred from #412
Aligning the schemas is a breaking change to two live MCP tool contracts, independent of fixing the computation drift. #412 deliberately maps the unified predicate back into the existing
test_summary/meets_requirementsshape to avoid expanding scope.To investigate
to_status_dict()per-req shape, since it's the richer/more honest one) and migrate the twodetails.py-backed tools onto it.meets_requirements/ flattest_summary.get_status'sto_status_dict()and the per-id/scoped tools should literally share a serializer.Blocked on / best done after #412 lands.