setAiProvider() in GlobalConfigurationImpl lacks @DataBoundSetter. JCasC can't configure the aiProvider nested property, reports the
whole explainError block as invalid, and causes a ConfigurationAsCodeBootFailure → Docker restart loop
Docker start sucessfully.
2026-03-31 12:05:07.048+0000 [id=88] INFO jenkins.InitReactorRunner$1#onAttained: Listed all plugins
2026-03-31 12:05:08.703+0000 [id=90] INFO jenkins.InitReactorRunner$1#onAttained: Prepared all plugins
2026-03-31 12:05:08.715+0000 [id=92] INFO jenkins.InitReactorRunner$1#onAttained: Started all plugins
2026-03-31 12:05:08.717+0000 [id=100] INFO jenkins.InitReactorRunner$1#onAttained: Augmented all extensions
2026-03-31 12:05:09.452+0000 [id=100] INFO jenkins.InitReactorRunner$1#onAttained: System config loaded
2026-03-31 12:05:10.074+0000 [id=100] SEVERE jenkins.InitReactorRunner$1#onTaskFailed: Failed ConfigurationAsCode.init
io.jenkins.plugins.casc.UnknownAttributesException: unclassified: Invalid configuration elements for type: class jenkins.model.GlobalConfigurationCategory$Unclassified : explainError.
[LF]> Available attributes : administrativeMonitorsConfiguration, artifactManager, buildDiscarders, casCGlobalConfig, computerRetentionCheckInterval, defaultDisplayUrlProvider, defaultFolderConfiguration, defaultView, envVarsFilter, fingerprints, globalDefaultFlowDurabilityLevel, globalLibraries, globalUntrustedLibraries, location, mailer, myView, nodeProperties, plugin, pollSCM, projectNamingStrategy, proxyConfigurationManager, quietPeriod, resourceRoot, scmGit, scmRetryCount, shell, usageStatistics, viewsTabBar
at PluginClassLoader for configuration-as-code//io.jenkins.plugins.casc.BaseConfigurator.handleUnknown(BaseConfigurator.java:404)
at PluginClassLoader for configuration-as-code//io.jenkins.plugins.casc.BaseConfigurator.configure(BaseConfigurator.java:389)
at PluginClassLoader for configuration-as-code//io.jenkins.plugins.casc.BaseConfigurator.check(BaseConfigurator.java:293)
at PluginClassLoader for configuration-as-code//io.jenkins.plugins.casc.ConfigurationAsCode.lambda$checkWith$8(ConfigurationAsCode.java:894)
at PluginClassLoader for configuration-as-code//io.jenkins.plugins.casc.ConfigurationAsCode.invokeWith(ConfigurationAsCode.java:837)
at PluginClassLoader for configuration-as-code//io.jenkins.plugins.casc.ConfigurationAsCode.checkWith(ConfigurationAsCode.java:894)
at PluginClassLoader for configuration-as-code//io.jenkins.plugins.casc.ConfigurationAsCode.configureWith(ConfigurationAsCode.java:880)
at PluginClassLoader for configuration-as-code//io.jenkins.plugins.casc.ConfigurationAsCode.configureWith(ConfigurationAsCode.java:759)
at PluginClassLoader for configuration-as-code//io.jenkins.plugins.casc.ConfigurationAsCode.configure(ConfigurationAsCode.java:369)
at PluginClassLoader for configuration-as-code//io.jenkins.plugins.casc.ConfigurationAsCode.init(ConfigurationAsCode.java:358)
Caused: io.jenkins.plugins.casc.ConfigurationAsCodeBootFailure
at PluginClassLoader for configuration-as-code//io.jenkins.plugins.casc.ConfigurationAsCode.init(ConfigurationAsCode.java:360)
Caused: java.lang.reflect.InvocationTargetException
at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(Unknown Source)
at java.base/java.lang.reflect.Method.invoke(Unknown Source)
at hudson.init.TaskMethodFinder.invoke(TaskMethodFinder.java:109)
Caused: java.lang.Error
at hudson.init.TaskMethodFinder.invoke(TaskMethodFinder.java:115)
at hudson.init.TaskMethodFinder$TaskImpl.run(TaskMethodFinder.java:185)
at org.jvnet.hudson.reactor.Reactor.runTask(Reactor.java:304)
at jenkins.model.Jenkins$5.runTask(Jenkins.java:1152)
at org.jvnet.hudson.reactor.Reactor$2.run(Reactor.java:221)
at org.jvnet.hudson.reactor.Reactor$Node.run(Reactor.java:120)
at jenkins.security.ImpersonatingExecutorService$1.run(ImpersonatingExecutorService.java:68)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.base/java.lang.Thread.run(Unknown Source)
2026-03-31 12:05:10.082+0000 [id=56] SEVERE hudson.util.BootFailure#publish: Failed to initialize Jenkins
io.jenkins.plugins.casc.UnknownAttributesException: unclassified: Invalid configuration elements for type: class jenkins.model.GlobalConfigurationCategory$Unclassified : explainError.
[LF]> Available attributes : administrativeMonitorsConfiguration, artifactManager, buildDiscarders, casCGlobalConfig, computerRetentionCheckInterval, defaultDisplayUrlProvider, defaultFolderConfiguration, defaultView, envVarsFilter, fingerprints, globalDefaultFlowDurabilityLevel, globalLibraries, globalUntrustedLibraries, location, mailer, myView, nodeProperties, plugin, pollSCM, projectNamingStrategy, proxyConfigurationManager, quietPeriod, resourceRoot, scmGit, scmRetryCount, shell, usageStatistics, viewsTabBar
at PluginClassLoader for configuration-as-code//io.jenkins.plugins.casc.BaseConfigurator.handleUnknown(BaseConfigurator.java:404)
at PluginClassLoader for configuration-as-code//io.jenkins.plugins.casc.BaseConfigurator.configure(BaseConfigurator.java:389)
at PluginClassLoader for configuration-as-code//io.jenkins.plugins.casc.BaseConfigurator.check(BaseConfigurator.java:293)
at PluginClassLoader for configuration-as-code//io.jenkins.plugins.casc.ConfigurationAsCode.lambda$checkWith$8(ConfigurationAsCode.java:894)
at PluginClassLoader for configuration-as-code//io.jenkins.plugins.casc.ConfigurationAsCode.invokeWith(ConfigurationAsCode.java:837)
at PluginClassLoader for configuration-as-code//io.jenkins.plugins.casc.ConfigurationAsCode.checkWith(ConfigurationAsCode.java:894)
at PluginClassLoader for configuration-as-code//io.jenkins.plugins.casc.ConfigurationAsCode.configureWith(ConfigurationAsCode.java:880)
at PluginClassLoader for configuration-as-code//io.jenkins.plugins.casc.ConfigurationAsCode.configureWith(ConfigurationAsCode.java:759)
at PluginClassLoader for configuration-as-code//io.jenkins.plugins.casc.ConfigurationAsCode.configure(ConfigurationAsCode.java:369)
at PluginClassLoader for configuration-as-code//io.jenkins.plugins.casc.ConfigurationAsCode.init(ConfigurationAsCode.java:358)
Caused: io.jenkins.plugins.casc.ConfigurationAsCodeBootFailure
at PluginClassLoader for configuration-as-code//io.jenkins.plugins.casc.ConfigurationAsCode.init(ConfigurationAsCode.java:360)
Environment
Steps to Reproduce
explainError: aiProvider: openai: apiKey: "${AI_API_KEY}" model: "gpt-4.1" enableExplanation: true customContext: | Global context: This Jenkins instance is used to test the explain-error plugin. If the error is a simulated one, explain what the underlying real-world cause would be.The root cause is:
setAiProvider() in GlobalConfigurationImpl lacks @DataBoundSetter. JCasC can't configure the aiProvider nested property, reports the
whole explainError block as invalid, and causes a ConfigurationAsCodeBootFailure → Docker restart loop
Expected Behavior
Docker start sucessfully.
Actual Behavior
Docker restart loop
Logs