{"record":{"id":"34940fddc4c88369","repo":"elastic/elasticsearch","slug":"script-context-not-found","errorCode":null,"errorMessage":"script context [{}] not found","messagePattern":"script context \\[(.+?)\\] not found","errorType":"validation","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"modules/lang-painless/src/main/java/org/elasticsearch/painless/action/PainlessContextAction.java","lineNumber":174,"sourceCode":"                    .stream()\n                    .map(v -> v.name)\n                    .collect(Collectors.toList());\n                painlessContextInfo = null;\n            } else {\n                ScriptContext<?> scriptContext = null;\n                PainlessLookup painlessLookup = null;\n\n                for (Map.Entry<ScriptContext<?>, PainlessLookup> contextLookupEntry : painlessScriptEngine.getContextsToLookups()\n                    .entrySet()) {\n                    if (contextLookupEntry.getKey().name.equals(request.getScriptContextName())) {\n                        scriptContext = contextLookupEntry.getKey();\n                        painlessLookup = contextLookupEntry.getValue();\n                        break;\n                    }\n                }\n\n                if (scriptContext == null || painlessLookup == null) {\n                    throw new IllegalArgumentException(\"script context [\" + request.getScriptContextName() + \"] not found\");\n                }\n\n                scriptContextNames = Collections.emptyList();\n                painlessContextInfo = new PainlessContextInfo(scriptContext, painlessLookup);\n            }\n\n            listener.onResponse(new Response(scriptContextNames, painlessContextInfo));\n        }\n    }\n\n    public static class RestAction extends BaseRestHandler {\n\n        @Override\n        public List<Route> routes() {\n            return List.of(new Route(GET, \"/_scripts/painless/_context\"));\n        }\n\n        @Override","sourceCodeStart":156,"sourceCodeEnd":192,"githubUrl":"https://github.com/elastic/elasticsearch/blob/db6a809a667c081ca1dc7500389d26975573215f/modules/lang-painless/src/main/java/org/elasticsearch/painless/action/PainlessContextAction.java#L156-L192","documentation":"PainlessContextAction handles GET /_scripts/painless/_context. When a specific context name is requested (request.scriptContextName != null), it iterates the engine's registered contexts and if none matches, throws IllegalArgumentException 'script context [name] not found'. The name is interpolated from the request.","triggerScenarios":"Calling the painless _context API with a context name that is not registered with the PainlessScriptEngine — e.g. a typo, a context provided by a plugin that is not installed, or a context name from a newer/older ES version.","commonSituations":"Querying documentation for a context name; plugin not loaded due to deployment issue; version skew between client and server context names; casing/typo in the request.","solutions":["Call GET /_scripts/painless/_context with no context name to list all available context names, then use one from that list.","Install/enable the plugin that provides the desired context.","Verify ES version matches the documented context name."],"exampleFix":"// before\nGET /_scripts/painless/_context\n{ \"script_context\": \"filteer\" } // typo -> 1350\n// after\nGET /_scripts/painless/_context\n{ \"script_context\": \"filter\" }","handlingStrategy":"validation","validationCode":"// Before calling _context with a name, fetch the list of valid names:\n// GET /_scripts/painless/_context  (no name) -> Response.scriptContextNames contains valid values.\nSet<String> valid = new HashSet<>(response.scriptContextNames);\nif (!valid.contains(requestedName)) throw new IllegalArgumentException(\"unknown context\");","typeGuard":null,"tryCatchPattern":"try {\n    client.execute(PainlessContextAction.INSTANCE, request);\n} catch (IllegalArgumentException e) {\n    if (e.getMessage().startsWith(\"script context [\") && e.getMessage().endsWith(\"not found\")) {\n        // re-fetch available contexts and retry with a corrected name\n    }\n    throw e;\n}","preventionTips":["Discover valid context names with the no-arg _context call before using one.","Treat context names as version-dependent; re-validate after upgrades.","Ensure any plugin providing a context is installed and enabled."],"tags":["painless","scripting","rest-api","script-context","elasticsearch"],"analyzedSha":"db6a809a667c081ca1dc7500389d26975573215f","analyzedAt":"2026-08-12T01:39:14.192Z","schemaVersion":2},"datasetVersion":"2026-08-12T06:17:24.410Z"}