=== Demo 4: Executor/ExecutorService/AsyncTaskExecutor wrapping on a pooled platform thread === A) raw ThreadPoolExecutor, no wrapper: NO AUTHENTICATION (lost) B) DelegatingSecurityContextExecutorService.execute(...): authenticated as bob B2) DelegatingSecurityContextExecutorService.submit(Callable): authenticated as bob EDGE) task 1 on possibly-reused worker: authenticated as carol-task1 EDGE) task 2, same pool, different caller context: authenticated as dave-task2 <-- correct, NOT stale, unlike plain InheritableThreadLocal on a reused worker C) DelegatingSecurityContextExecutor + CompletableFuture.supplyAsync: authenticated as erin C2) default CompletableFuture executor (common ForkJoinPool), no wrapper: NO AUTHENTICATION (lost) D) DelegatingSecurityContextAsyncTaskExecutor wrapping ThreadPoolTaskExecutor: authenticated as grace