{"record":{"id":"26f4b68ce6a1c0ec","repo":"apache/shardingsphere","slug":"target-status-is-required-for-readwrite-splitting","errorCode":null,"errorMessage":"target_status is required for readwrite-splitting status.","messagePattern":"target_status is required for readwrite-splitting status\\.","errorType":"validation","errorClass":"MCPInvalidRequestException","httpStatus":null,"severity":"error","filePath":"mcp/features/readwrite-splitting/src/main/java/org/apache/shardingsphere/mcp/feature/readwritesplitting/tool/service/ReadwriteSplittingStatusDistSQLPlanningService.java","lineNumber":42,"sourceCode":"\nimport java.util.Locale;\n\n/**\n * Readwrite-splitting status DistSQL planning service.\n */\npublic final class ReadwriteSplittingStatusDistSQLPlanningService {\n    \n    /**\n     * Plan readwrite-splitting storage-unit status artifact.\n     *\n     * @param request status workflow request\n     * @return rule artifact\n     * @throws MCPInvalidRequestException when no status operation can be resolved\n     */\n    public RuleArtifact planStatus(final ReadwriteSplittingStatusWorkflowRequest request) {\n        String operation = resolveStatusOperation(request);\n        if (operation.isEmpty()) {\n            throw new MCPInvalidRequestException(\"target_status is required for readwrite-splitting status.\");\n        }\n        return new RuleArtifact(operation.toLowerCase(Locale.ENGLISH), String.format(\"ALTER READWRITE_SPLITTING RULE %s %s %s FROM %s\",\n                WorkflowSQLUtils.formatGeneratedRuleDistSQLIdentifier(request.getRuleName()), operation,\n                WorkflowSQLUtils.formatGeneratedRuleDistSQLIdentifier(request.getStorageUnit()), WorkflowSQLUtils.formatGeneratedRuleDistSQLIdentifier(request.getDatabase())));\n    }\n    \n    /**\n     * Resolve ENABLE or DISABLE operation from request fields.\n     *\n     * @param request status workflow request\n     * @return DistSQL status operation\n     */\n    public String resolveStatusOperation(final ReadwriteSplittingStatusWorkflowRequest request) {\n        return normalizeStatusOperation(request.getTargetStatus());\n    }\n    \n    private String normalizeStatusOperation(final String status) {\n        String actualStatus = status.trim().toLowerCase(Locale.ENGLISH);","sourceCodeStart":24,"sourceCodeEnd":60,"githubUrl":"https://github.com/apache/shardingsphere/blob/e952770a215630a3659c75d64369168cd3e26b82/mcp/features/readwrite-splitting/src/main/java/org/apache/shardingsphere/mcp/feature/readwritesplitting/tool/service/ReadwriteSplittingStatusDistSQLPlanningService.java#L24-L60","documentation":"Thrown by ReadwriteSplittingStatusDistSQLPlanningService.planStatus when resolveStatusOperation cannot resolve an ENABLE or DISABLE operation from the request, so no ALTER READWRITE_SPLITTING RULE ... ENABLE/DISABLE ... statement can be generated. It is an MCPInvalidRequestException: the request shape is incomplete for the status workflow.","triggerScenarios":"Invoking the readwrite-splitting status tool without target_status (or with a value that maps to neither ENABLE nor DISABLE) while providing rule/storage unit/database fields — the planner resolves the operation from the request fields and gets an empty string.","commonSituations":"Agents omitting target_status assuming the tool defaults to DISABLE, passing \"status\": \"disabled\" or a boolean instead of the expected field, or schema drift after the status tool's request type changed.","solutions":["Set target_status to ENABLE or DISABLE (exact tokens the resolver accepts) on the status workflow request.","Run the tool's schema/descriptor first and populate every required field, especially target_status, before invoking.","Check the request class (ReadwriteSplittingStatusWorkflowRequest) field names in your version and match them exactly."],"exampleFix":"// before\nrequest.setTargetStatus(\"\");\n// after\nrequest.setTargetStatus(\"DISABLE\");","handlingStrategy":"validation","validationCode":"String op = resolveStatusOperationLocally(request); // \"ENABLE\", \"DISABLE\" or \"\"\nif (op.isEmpty()) { throw new IllegalArgumentException(\"target_status must be ENABLE or DISABLE\"); }","typeGuard":"const hasTargetStatus = r => [\"ENABLE\", \"DISABLE\"].includes((r?.target_status ?? \"\").toUpperCase());","tryCatchPattern":"try {\n    planningService.planStatus(request);\n} catch (final MCPInvalidRequestException ex) {\n    // 'target_status is required...' -> set request.setTargetStatus(\"ENABLE\"|\"DISABLE\") and retry\n}","preventionTips":["Treat target_status as mandatory for status workflows, not optional","Validate against the request class fields of the exact deployed version","Build requests through typed builders rather than raw maps"],"tags":["mcp","readwrite-splitting","distsql","validation"],"backgroundTag":null,"analyzedSha":"e952770a215630a3659c75d64369168cd3e26b82","analyzedAt":"2026-08-14T13:54:53.392Z","schemaVersion":2},"datasetVersion":"2026-08-15T17:31:12.345Z"}