Captured from a real `junit-platform-console-standalone --details=tree` run against SharedMutableArgumentAntiPatternTest, compiled and executed for real (badSharedConfigAccumulatesTouches stays @Disabled here so the module's build remains green; see docs/output/09-shared-mutable-argument-failure.txt for what it produces when that annotation is removed). ╷ ├─ JUnit Platform Suite ✔ ├─ JUnit Jupiter ✔ │ └─ SharedMutableArgumentAntiPatternTest ✔ │ ├─ badSharedConfigAccumulatesTouches(Config) ↷ Kept disabled so the module's build stays green -- see docs/output/09-shared-mutable-argument-failure.txt for the real failure this produces on its second invocation when the @Disabled annotation is removed. │ └─ goodFreshConfigIsAlwaysTouchedOnce(Config) ✔ │ ├─ [1] Config[callCount=0] ✔ │ └─ [2] Config[callCount=0] ✔ └─ JUnit Vintage ✔ Test run finished after 161 ms [ 2 tests successful ] [ 0 tests failed ] freshProvider() builds a new Config() inside the Stream for each Arguments.of(...) call, so each invocation gets its own isolated instance -- the whole fix is that simple. Both display names read Config[callCount=0], which is correct and not a bug: JUnit resolves each invocation's display name from the argument's toString() at argument-resolution time, before the test method body (and its config.touch() call) has run, so callCount is still 0 at the moment the name is built even though the assertion afterwards confirms it becomes 1.