{"record":{"id":"a0d695449b692799","repo":"github/copilot-sdk","slug":"unknown-tooldefer-value-value","errorCode":null,"errorMessage":"Unknown ToolDefer value: + value","messagePattern":"Unknown ToolDefer value: \\+ value","errorType":"validation","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"java/sdk/src/main/java/com/github/copilot/rpc/ToolDefer.java","lineNumber":94,"sourceCode":"     *\n     * @param value\n     *            the JSON string value\n     * @return the matching {@code ToolDefer}, or {@code null} if value is\n     *         {@code null}\n     * @throws IllegalArgumentException\n     *             if the value does not match any known deferral mode\n     */\n    @JsonCreator\n    public static ToolDefer fromValue(String value) {\n        if (value == null) {\n            return null;\n        }\n        for (ToolDefer mode : values()) {\n            if (mode.value.equals(value)) {\n                return mode;\n            }\n        }\n        throw new IllegalArgumentException(\"Unknown ToolDefer value: \" + value);\n    }\n}\n","sourceCodeStart":76,"sourceCodeEnd":97,"githubUrl":"https://github.com/github/copilot-sdk/blob/cd8cf15dc3f9e762615790aaed0a771a0f392755/java/sdk/src/main/java/com/github/copilot/rpc/ToolDefer.java#L76-L97","documentation":"Thrown by ToolDefer.fromValue when a string does not match any registered ToolDefer enum constant's value. The enum is looked up by its wire value; anything unrecognized is rejected with this IllegalArgumentException rather than silently defaulting.","triggerScenarios":"Calling ToolDefer.fromValue(\"...\") with a typo, different casing, or a value from an older/newer protocol version not present in this library version.","commonSituations":"Client and SDK protocol version skew; config files carrying defer mode strings that predate a rename; hand-written constants instead of referencing the enum.","solutions":["Use one of the enum's known values — check ToolDefer.values() / the constant definitions in ToolDefer.java","Reference ToolDefer.X.value instead of a raw string literal in calling code","Align client/server protocol versions so both sides know the same defer values","Handle unknown values gracefully at the boundary: try fromValue, fall back to a default mode for forward compatibility"],"exampleFix":"// before\nToolDefer mode = ToolDefer.fromValue(\"always\"); // unknown\n// after\nToolDefer mode = ToolDefer.fromValue(\"never\"); // a registered value\n// or: ToolDefer mode = Stream.of(ToolDefer.values()).filter(m -> m.value.equals(v)).findFirst().orElse(ToolDefer.NONE);","handlingStrategy":"fallback","validationCode":"boolean known = Arrays.stream(ToolDefer.values()).anyMatch(m -> m.value.equals(value));","typeGuard":"boolean isKnownToolDefer(String v) { return Arrays.stream(ToolDefer.values()).anyMatch(m -> m.value.equals(v)); }","tryCatchPattern":"ToolDefer mode; try { mode = ToolDefer.fromValue(v); } catch (IllegalArgumentException e) { mode = ToolDefer.NONE; /* log unknown value */ }","preventionTips":["Reference ToolDefer.X.value constants instead of string literals","Keep protocol versions aligned between client and SDK","Centralize defer-mode parsing with a tolerant fallback for forward compatibility"],"tags":["java","enum","rpc","protocol"],"backgroundTag":"invalid-enum-value","analyzedSha":"cd8cf15dc3f9e762615790aaed0a771a0f392755","analyzedAt":"2026-09-09T18:32:31.973Z","contentChangedAt":"2026-09-09T18:32:31.973Z","schemaVersion":2},"datasetVersion":"2026-09-15T23:17:13.987Z"}