#84142 is introducing an assertion which verifies that the cluster state we write to disk can be loaded again. This build failure shows that this assertion currently does not hold due to an undeclared field called `task_name`.

NB doesn't fail on `master` directly you need to check the PR branch, but it represents a genuine bug on `master`: if a node crashed after writing this state then it would not be able to restart.

**Build scan:**
https://gradle-enterprise.elastic.co/s/zne65f5ti7kfo/tests/:x-pack:plugin:shutdown:internalClusterTest/org.elasticsearch.xpack.shutdown.NodeShutdownTasksIT/testTasksAreNotAssignedToShuttingDownNode

**Reproduction line:**
`./gradlew ':x-pack:plugin:shutdown:internalClusterTest' --tests "org.elasticsearch.xpack.shutdown.NodeShutdownTasksIT.testTasksAreNotAssignedToShuttingDownNode" -Dtests.seed=E2D8712A01541857 -Dtests.locale=es-PY -Dtests.timezone=Africa/Kinshasa -Druntime.java=17`

**Applicable branches:**
~master~ https://github.com/elastic/elasticsearch/pull/84142/commits/3eb6089edb1ead5e33f4a081c4b5a2719d9c4217

**Reproduces locally?:**
Yes

**Failure history:**
https://gradle-enterprise.elastic.co/scans/tests?tests.container=org.elasticsearch.xpack.shutdown.NodeShutdownTasksIT&tests.test=testTasksAreNotAssignedToShuttingDownNode

**Failure excerpt:**

<details>
<summary>Expand for stack trace</summary>

```
WARNING: Uncaught exception in thread: Thread[elasticsearch[node_t0][cluster_coordination][T#1],5,TGRP-NodeShutdownTasksIT] |  
-- | --
  | java.lang.AssertionError: org.elasticsearch.gateway.CorruptStateException: org.elasticsearch.xcontent.XContentParseException: [-1:358] [persistent_tasks] failed to parse field [tasks] |  
  | at __randomizedtesting.SeedInfo.seed([E2D8712A01541857]:0) |  
  | at org.elasticsearch.gateway.PersistedClusterStateService$Writer.assertOnCommit(PersistedClusterStateService.java:1020) |  
  | at org.elasticsearch.gateway.PersistedClusterStateService$Writer.commit(PersistedClusterStateService.java:1007) |  
  | at org.elasticsearch.gateway.PersistedClusterStateService$Writer.writeIncrementalStateAndCommit(PersistedClusterStateService.java:823) |  
  | at org.elasticsearch.gateway.GatewayMetaState$LucenePersistedState.setLastAcceptedState(GatewayMetaState.java:507) |  
  | at org.elasticsearch.cluster.coordination.CoordinationState.handlePublishRequest(CoordinationState.java:392) |  
  | at org.elasticsearch.cluster.coordination.Coordinator.handlePublishRequest(Coordinator.java:418) |  
  | at org.elasticsearch.cluster.coordination.PublicationTransportHandler.acceptState(PublicationTransportHandler.java:200) |  
  | at org.elasticsearch.cluster.coordination.PublicationTransportHandler.handleIncomingPublishRequest(PublicationTransportHandler.java:183) |  
  | at org.elasticsearch.cluster.coordination.PublicationTransportHandler.lambda$new$0(PublicationTransportHandler.java:103) |  
  | at org.elasticsearch.transport.RequestHandlerRegistry.processMessageReceived(RequestHandlerRegistry.java:67) |  
  | at org.elasticsearch.transport.TransportService$6.doRun(TransportService.java:917) |  
  | at org.elasticsearch.common.util.concurrent.ThreadContext$ContextPreservingAbstractRunnable.doRun(ThreadContext.java:776) |  
  | at org.elasticsearch.common.util.concurrent.AbstractRunnable.run(AbstractRunnable.java:26) |  
  | at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) |  
  | at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) |  
  | at java.base/java.lang.Thread.run(Thread.java:833) |  
  | Caused by: org.elasticsearch.gateway.CorruptStateException: org.elasticsearch.xcontent.XContentParseException: [-1:358] [persistent_tasks] failed to parse field [tasks] |  
  | at org.elasticsearch.gateway.PersistedClusterStateService.readXContent(PersistedClusterStateService.java:539) |  
  | at org.elasticsearch.gateway.PersistedClusterStateService.lambda$loadOnDiskState$2(PersistedClusterStateService.java:493) |  
  | at org.elasticsearch.gateway.PersistedClusterStateService.consumeFromType(PersistedClusterStateService.java:580) |  
  | at org.elasticsearch.gateway.PersistedClusterStateService.loadOnDiskState(PersistedClusterStateService.java:492) |  
  | at org.elasticsearch.gateway.PersistedClusterStateService$Writer.assertOnCommit(PersistedClusterStateService.java:1016) |  
  | ... 15 more |  
  | Caused by: org.elasticsearch.xcontent.XContentParseException: [-1:358] [persistent_tasks] failed to parse field [tasks] |  
  | at org.elasticsearch.xcontent.ObjectParser.throwFailedToParse(ObjectParser.java:626) |  
  | at org.elasticsearch.xcontent.ObjectParser.parseValue(ObjectParser.java:621) |  
  | at org.elasticsearch.xcontent.ObjectParser.parseArray(ObjectParser.java:614) |  
  | at org.elasticsearch.xcontent.ObjectParser.parseSub(ObjectParser.java:647) |  
  | at org.elasticsearch.xcontent.ObjectParser.parse(ObjectParser.java:319) |  
  | at org.elasticsearch.xcontent.ObjectParser.parse(ObjectParser.java:258) |  
  | at org.elasticsearch.xcontent.ObjectParser.apply(ObjectParser.java:392) |  
  | at org.elasticsearch.persistent.PersistentTasksCustomMetadata.fromXContent(PersistentTasksCustomMetadata.java:208) |  
  | at org.elasticsearch.xcontent.NamedXContentRegistry$Entry.lambda$new$0(NamedXContentRegistry.java:54) |  
  | at org.elasticsearch.xcontent.NamedXContentRegistry.parseNamedObject(NamedXContentRegistry.java:147) |  
  | at org.elasticsearch.xcontent.support.AbstractXContentParser.namedObject(AbstractXContentParser.java:416) |  
  | at org.elasticsearch.cluster.metadata.Metadata$Builder.fromXContent(Metadata.java:2188) |  
  | at org.elasticsearch.gateway.PersistedClusterStateService.readXContent(PersistedClusterStateService.java:537) |  
  | ... 19 more |  
  | Caused by: org.elasticsearch.xcontent.XContentParseException: [-1:358] [tasks] failed to parse field [task] |  
  | at org.elasticsearch.xcontent.ObjectParser.throwFailedToParse(ObjectParser.java:626) |  
  | at org.elasticsearch.xcontent.ObjectParser.parseValue(ObjectParser.java:621) |  
  | at org.elasticsearch.xcontent.ObjectParser.parseSub(ObjectParser.java:633) |  
  | at org.elasticsearch.xcontent.ObjectParser.parse(ObjectParser.java:319) |  
  | at org.elasticsearch.xcontent.ObjectParser.parse(ObjectParser.java:258) |  
  | at org.elasticsearch.xcontent.AbstractObjectParser.lambda$declareFieldArray$20(AbstractObjectParser.java:336) |  
  | at org.elasticsearch.xcontent.AbstractObjectParser.parseArray(AbstractObjectParser.java:418) |  
  | at org.elasticsearch.xcontent.AbstractObjectParser.lambda$declareFieldArray$21(AbstractObjectParser.java:336) |  
  | at org.elasticsearch.xcontent.ObjectParser.lambda$declareField$10(ObjectParser.java:441) |  
  | at org.elasticsearch.xcontent.ObjectParser.parseValue(ObjectParser.java:619) |  
  | ... 30 more |  
  | Caused by: org.elasticsearch.xcontent.XContentParseException: [-1:358] [task] failed to parse field [task_name] |  
  | at org.elasticsearch.xcontent.ObjectParser.rethrowFieldParseFailure(ObjectParser.java:564) |  
  | at org.elasticsearch.xcontent.ObjectParser.lambda$declareNamedObjects$14(ObjectParser.java:504) |  
  | at org.elasticsearch.xcontent.ObjectParser.lambda$declareNamedObjects$15(ObjectParser.java:515) |  
  | at org.elasticsearch.xcontent.ObjectParser.parseValue(ObjectParser.java:619) |  
  | ... 38 more |  
  | Caused by: org.elasticsearch.xcontent.XContentParseException: [-1:358] [named] failed to parse field [params] |  
  | at org.elasticsearch.xcontent.ObjectParser.throwFailedToParse(ObjectParser.java:626) |  
  | at org.elasticsearch.xcontent.ObjectParser.parseValue(ObjectParser.java:621) |  
  | at org.elasticsearch.xcontent.ObjectParser.parseSub(ObjectParser.java:633) |  
  | at org.elasticsearch.xcontent.ObjectParser.parse(ObjectParser.java:319) |  
  | at org.elasticsearch.persistent.PersistentTasksCustomMetadata.lambda$static$3(PersistentTasksCustomMetadata.java:97) |  
  | at org.elasticsearch.xcontent.ObjectParser.lambda$declareNamedObjects$14(ObjectParser.java:502) |  
  | ... 40 more |  
  | Caused by: org.elasticsearch.xcontent.NamedObjectNotFoundException: [-1:358] unknown field [task_name] |  
  | at org.elasticsearch.xcontent.NamedXContentRegistry.lookupParser(NamedXContentRegistry.java:162) |  
  | at org.elasticsearch.xcontent.NamedXContentRegistry.parseNamedObject(NamedXContentRegistry.java:146) |  
  | at org.elasticsearch.xcontent.support.AbstractXContentParser.namedObject(AbstractXContentParser.java:416) |  
  | at org.elasticsearch.persistent.PersistentTasksCustomMetadata.lambda$static$1(PersistentTasksCustomMetadata.java:89) |  
  | at org.elasticsearch.xcontent.ObjectParser.lambda$declareField$10(ObjectParser.java:441) |  
  | at org.elasticsearch.xcontent.ObjectParser.parseValue(ObjectParser.java:619) |  
  | ... 44 more |  
```
</details>
x-pack/plugin/shutdown/src/internalClusterTest/java/org/elasticsearch/xpack/shutdown/NodeShutdownTasksIT.java
private final PersistentTasksService persistentTasksService;
        protected TaskExecutor(Client client, ClusterService clusterService, ThreadPool threadPool) {
            super("task_name", ThreadPool.Names.GENERIC);
            persistentTasksService = new PersistentTasksService(clusterService, threadPool, client);
            clusterService.addListener(this);
        }
        @Override
        public PersistentTasksCustomMetadata.Assignment getAssignment(
            TestTaskParams params,
            Collection<DiscoveryNode> candidateNodes,
            ClusterState clusterState
        ) {
            candidates.set(candidateNodes);
            return super.getAssignment(params, candidateNodes, clusterState);
        }
        @Override
        protected void nodeOperation(AllocatedPersistentTask task, TestTaskParams params, PersistentTaskState state) {
            logger.info("--> executing the task");
            taskCompleted.compareAndSet(false, true);
        }
        private void startTask() {
            logger.info("--> sending start request");
            persistentTasksService.sendStartRequest("task_id", "task_name", new TestTaskParams(), ActionListener.wrap(r -> {}, e -> {
                if (e instanceof ResourceAlreadyExistsException == false) {
                    logger.error("failed to create task", e);
                    fail("failed to create task");
                }
            }));
        }
        @Override