From 3063801a3aa265a20d33ecb2a128403feac3cdb2 Mon Sep 17 00:00:00 2001 From: Brian Neumann-Fopiano Date: Thu, 11 Jun 2026 14:30:54 -0400 Subject: [PATCH] Purity Ratchet --- core/build.gradle | 39 ++++++ core/purity-allowlist.txt | 259 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 298 insertions(+) create mode 100644 core/purity-allowlist.txt diff --git a/core/build.gradle b/core/build.gradle index eb7053511..aefb0a295 100644 --- a/core/build.gradle +++ b/core/build.gradle @@ -303,3 +303,42 @@ sourceSets { } } } + +tasks.register('bukkitPurityRatchet') { + group = 'verification' + description = 'Fails if files outside core/purity-allowlist.txt import org.bukkit (the allowlist only shrinks).' + File allowlistFile = project.file('purity-allowlist.txt') + File sourceRoot = project.file('src/main/java') + inputs.file(allowlistFile) + inputs.dir(sourceRoot) + doLast { + Set allowed = allowlistFile.readLines().findAll { String line -> !line.isBlank() }.toSet() + List offenders = new ArrayList<>() + List coupled = new ArrayList<>() + sourceRoot.eachFileRecurse { File f -> + if (!f.name.endsWith('.java')) { + return + } + if (f.text.contains('org.bukkit')) { + String rel = sourceRoot.toPath().relativize(f.toPath()).toString() + coupled.add(rel) + if (!allowed.contains(rel)) { + offenders.add(rel) + } + } + } + if (!offenders.isEmpty()) { + throw new GradleException("Bukkit purity ratchet violated - new org.bukkit coupling in:\n " + offenders.join('\n ') + "\nDecouple these files or (only with strong justification) add them to core/purity-allowlist.txt") + } + int shrunk = allowed.size() - coupled.size() + if (shrunk > 0) { + println("Purity ratchet: " + coupled.size() + " coupled files (" + shrunk + " fewer than allowlist - consider tightening core/purity-allowlist.txt)") + } else { + println("Purity ratchet: " + coupled.size() + " coupled files (at allowlist ceiling)") + } + } +} + +tasks.named('check').configure { + dependsOn('bukkitPurityRatchet') +} diff --git a/core/purity-allowlist.txt b/core/purity-allowlist.txt new file mode 100644 index 000000000..f1846d039 --- /dev/null +++ b/core/purity-allowlist.txt @@ -0,0 +1,259 @@ +art/arcane/iris/core/commands/CommandDeveloper.java +art/arcane/iris/core/commands/CommandFind.java +art/arcane/iris/core/commands/CommandIris.java +art/arcane/iris/core/commands/CommandObject.java +art/arcane/iris/core/commands/CommandPregen.java +art/arcane/iris/core/commands/CommandStructure.java +art/arcane/iris/core/commands/CommandStudio.java +art/arcane/iris/core/commands/CommandWhat.java +art/arcane/iris/core/datapack/DatapackIngestService.java +art/arcane/iris/core/edit/BlockEditor.java +art/arcane/iris/core/edit/BlockSignal.java +art/arcane/iris/core/edit/BukkitBlockEditor.java +art/arcane/iris/core/edit/DustRevealer.java +art/arcane/iris/core/events/IrisEngineEvent.java +art/arcane/iris/core/events/IrisEngineHotloadEvent.java +art/arcane/iris/core/events/IrisLootEvent.java +art/arcane/iris/core/gui/NoiseExplorerGUI.java +art/arcane/iris/core/gui/PregeneratorJob.java +art/arcane/iris/core/gui/VisionGUI.java +art/arcane/iris/core/IrisRuntimeSchedulerMode.java +art/arcane/iris/core/IrisWorlds.java +art/arcane/iris/core/lifecycle/BukkitPublicBackend.java +art/arcane/iris/core/lifecycle/CapabilitySnapshot.java +art/arcane/iris/core/lifecycle/PaperLibBootstrap.java +art/arcane/iris/core/lifecycle/PaperLikeRuntimeBackend.java +art/arcane/iris/core/lifecycle/WorldLifecycleBackend.java +art/arcane/iris/core/lifecycle/WorldLifecycleRequest.java +art/arcane/iris/core/lifecycle/WorldLifecycleService.java +art/arcane/iris/core/lifecycle/WorldLifecycleStaging.java +art/arcane/iris/core/lifecycle/WorldLifecycleSupport.java +art/arcane/iris/core/lifecycle/WorldsProviderBackend.java +art/arcane/iris/core/link/CustomItemsDataProvider.java +art/arcane/iris/core/link/data/CraftEngineDataProvider.java +art/arcane/iris/core/link/data/EcoItemsDataProvider.java +art/arcane/iris/core/link/data/ExecutableItemsDataProvider.java +art/arcane/iris/core/link/data/HMCLeavesDataProvider.java +art/arcane/iris/core/link/data/ItemAdderDataProvider.java +art/arcane/iris/core/link/data/KGeneratorsDataProvider.java +art/arcane/iris/core/link/data/MMOItemsDataProvider.java +art/arcane/iris/core/link/data/MythicCrucibleDataProvider.java +art/arcane/iris/core/link/data/MythicMobsDataProvider.java +art/arcane/iris/core/link/data/NexoDataProvider.java +art/arcane/iris/core/link/ExternalDataProvider.java +art/arcane/iris/core/link/Identifier.java +art/arcane/iris/core/link/IrisPapiExpansion.java +art/arcane/iris/core/link/MultiverseCoreLink.java +art/arcane/iris/core/link/WorldEditLink.java +art/arcane/iris/core/nms/datapack/v1206/DataFixerV1206.java +art/arcane/iris/core/nms/INMS.java +art/arcane/iris/core/nms/INMSBinding.java +art/arcane/iris/core/nms/MinecraftVersion.java +art/arcane/iris/core/nms/v1X/NMSBinding1X.java +art/arcane/iris/core/pack/IrisPack.java +art/arcane/iris/core/pregenerator/DeepSearchPregenerator.java +art/arcane/iris/core/pregenerator/methods/AsyncOrMedievalPregenMethod.java +art/arcane/iris/core/pregenerator/methods/AsyncPregenMethod.java +art/arcane/iris/core/pregenerator/methods/HybridPregenMethod.java +art/arcane/iris/core/pregenerator/methods/MedievalPregenMethod.java +art/arcane/iris/core/project/IrisProject.java +art/arcane/iris/core/project/SchemaBuilder.java +art/arcane/iris/core/runtime/BukkitPublicRuntimeControlBackend.java +art/arcane/iris/core/runtime/ChunkClearer.java +art/arcane/iris/core/runtime/ChunkJobReporter.java +art/arcane/iris/core/runtime/GoldenHashScanner.java +art/arcane/iris/core/runtime/InPlaceChunkRegenerator.java +art/arcane/iris/core/runtime/ObjectStudioLayout.java +art/arcane/iris/core/runtime/PaperLikeRuntimeControlBackend.java +art/arcane/iris/core/runtime/StudioOpenCoordinator.java +art/arcane/iris/core/runtime/WorldRuntimeControlBackend.java +art/arcane/iris/core/runtime/WorldRuntimeControlService.java +art/arcane/iris/core/safeguard/Mode.java +art/arcane/iris/core/safeguard/task/Tasks.java +art/arcane/iris/core/ServerConfigurator.java +art/arcane/iris/core/service/BoardSVC.java +art/arcane/iris/core/service/CommandSVC.java +art/arcane/iris/core/service/EditSVC.java +art/arcane/iris/core/service/ExternalDataSVC.java +art/arcane/iris/core/service/GlobalCacheSVC.java +art/arcane/iris/core/service/IrisEngineSVC.java +art/arcane/iris/core/service/IrisIntegrationService.java +art/arcane/iris/core/service/ObjectStudioSaveService.java +art/arcane/iris/core/service/ObjectSVC.java +art/arcane/iris/core/service/StudioSVC.java +art/arcane/iris/core/service/TreeSVC.java +art/arcane/iris/core/service/WandSVC.java +art/arcane/iris/core/structure/BulkStructureImporter.java +art/arcane/iris/core/structure/FeatureImporter.java +art/arcane/iris/core/structure/StructureCaptureImporter.java +art/arcane/iris/core/structure/StructureImporter.java +art/arcane/iris/core/structure/VillageImporter.java +art/arcane/iris/core/tools/IrisConverter.java +art/arcane/iris/core/tools/IrisCreator.java +art/arcane/iris/core/tools/IrisPackBenchmarking.java +art/arcane/iris/core/tools/IrisReflectiveAPI.java +art/arcane/iris/core/tools/IrisToolbelt.java +art/arcane/iris/core/tools/IrisWorldCreator.java +art/arcane/iris/core/tools/TreePlausibilizer.java +art/arcane/iris/core/wand/WandSelection.java +art/arcane/iris/engine/actuator/IrisBiomeActuator.java +art/arcane/iris/engine/actuator/IrisDecorantActuator.java +art/arcane/iris/engine/actuator/IrisTerrainNormalActuator.java +art/arcane/iris/engine/data/cache/Cache.java +art/arcane/iris/engine/data/chunk/LinkedTerrainChunk.java +art/arcane/iris/engine/data/chunk/TerrainChunk.java +art/arcane/iris/engine/decorator/DecoratorCore.java +art/arcane/iris/engine/decorator/IrisCeilingDecorator.java +art/arcane/iris/engine/framework/BlockUpdater.java +art/arcane/iris/engine/framework/Engine.java +art/arcane/iris/engine/framework/EngineAssignedWorldManager.java +art/arcane/iris/engine/framework/EngineComponent.java +art/arcane/iris/engine/framework/EngineDecorator.java +art/arcane/iris/engine/framework/EngineMode.java +art/arcane/iris/engine/framework/EnginePlayer.java +art/arcane/iris/engine/framework/EngineWorldManager.java +art/arcane/iris/engine/framework/Locator.java +art/arcane/iris/engine/framework/LootProvider.java +art/arcane/iris/engine/framework/placer/WorldObjectPlacer.java +art/arcane/iris/engine/framework/PregeneratedData.java +art/arcane/iris/engine/framework/StructureAssembler.java +art/arcane/iris/engine/IrisComplex.java +art/arcane/iris/engine/IrisEngine.java +art/arcane/iris/engine/IrisEngineEffects.java +art/arcane/iris/engine/IrisEngineMantle.java +art/arcane/iris/engine/IrisWorldManager.java +art/arcane/iris/engine/mantle/components/MantleFloatingObjectComponent.java +art/arcane/iris/engine/mantle/components/MantleObjectComponent.java +art/arcane/iris/engine/mantle/EngineMantle.java +art/arcane/iris/engine/mantle/MantleWriter.java +art/arcane/iris/engine/mode/ModeOverworld.java +art/arcane/iris/engine/modifier/IrisCarveModifier.java +art/arcane/iris/engine/modifier/IrisDepositModifier.java +art/arcane/iris/engine/modifier/IrisFloatingChildBiomeModifier.java +art/arcane/iris/engine/modifier/IrisPerfectionModifier.java +art/arcane/iris/engine/modifier/IrisPostModifier.java +art/arcane/iris/engine/object/annotations/functions/LootTableKeyFunction.java +art/arcane/iris/engine/object/BlockDataMergeSupport.java +art/arcane/iris/engine/object/coral/CoralGenerator.java +art/arcane/iris/engine/object/crystal/CrystalGenerator.java +art/arcane/iris/engine/object/FloatingObjectFootprint.java +art/arcane/iris/engine/object/formation/FormationBlockResolver.java +art/arcane/iris/engine/object/formation/FormationGenerator.java +art/arcane/iris/engine/object/fungi/FungusGenerator.java +art/arcane/iris/engine/object/fungi/FungusStemBuilder.java +art/arcane/iris/engine/object/IPostBlockAccess.java +art/arcane/iris/engine/object/IrisAttributeModifier.java +art/arcane/iris/engine/object/IrisBiome.java +art/arcane/iris/engine/object/IrisBiomeCustom.java +art/arcane/iris/engine/object/IrisBiomeCustomParticle.java +art/arcane/iris/engine/object/IrisBiomeCustomSpawn.java +art/arcane/iris/engine/object/IrisBlockData.java +art/arcane/iris/engine/object/IrisBlockDrops.java +art/arcane/iris/engine/object/IrisCaveShape.java +art/arcane/iris/engine/object/IrisColor.java +art/arcane/iris/engine/object/IrisCommandRegistry.java +art/arcane/iris/engine/object/IrisCompat.java +art/arcane/iris/engine/object/IrisCompatabilityBlockFilter.java +art/arcane/iris/engine/object/IrisCompatabilityItemFilter.java +art/arcane/iris/engine/object/IrisDepositVariant.java +art/arcane/iris/engine/object/IrisDimension.java +art/arcane/iris/engine/object/IrisDirection.java +art/arcane/iris/engine/object/IrisEffect.java +art/arcane/iris/engine/object/IrisEnchantment.java +art/arcane/iris/engine/object/IrisEntity.java +art/arcane/iris/engine/object/IrisEntitySpawn.java +art/arcane/iris/engine/object/IrisLoot.java +art/arcane/iris/engine/object/IrisLootTable.java +art/arcane/iris/engine/object/IrisObject.java +art/arcane/iris/engine/object/IrisObjectLoot.java +art/arcane/iris/engine/object/IrisObjectPlacement.java +art/arcane/iris/engine/object/IrisObjectRotation.java +art/arcane/iris/engine/object/IrisObjectTranslate.java +art/arcane/iris/engine/object/IrisPosition.java +art/arcane/iris/engine/object/IrisPotionEffect.java +art/arcane/iris/engine/object/IrisProceduralBlocks.java +art/arcane/iris/engine/object/IrisSpawner.java +art/arcane/iris/engine/object/IrisSurface.java +art/arcane/iris/engine/object/IrisTree.java +art/arcane/iris/engine/object/IrisVanillaLootTable.java +art/arcane/iris/engine/object/IrisVillagerOverride.java +art/arcane/iris/engine/object/IrisVillagerTrade.java +art/arcane/iris/engine/object/IrisWorld.java +art/arcane/iris/engine/object/LegacyTileData.java +art/arcane/iris/engine/object/PotionEffectTypes.java +art/arcane/iris/engine/object/ruin/RuinBlockCanvas.java +art/arcane/iris/engine/object/ruin/RuinDecoratorApplier.java +art/arcane/iris/engine/object/ruin/RuinGenerator.java +art/arcane/iris/engine/object/TileData.java +art/arcane/iris/engine/object/tree/ProceduralTreeGenerator.java +art/arcane/iris/engine/object/tree/TreeBlockResolver.java +art/arcane/iris/engine/object/tree/TreePlausibility.java +art/arcane/iris/engine/platform/BukkitChunkGenerator.java +art/arcane/iris/engine/platform/DummyBiomeProvider.java +art/arcane/iris/engine/platform/DummyChunkGenerator.java +art/arcane/iris/engine/platform/PlatformChunkGenerator.java +art/arcane/iris/engine/platform/studio/generators/BiomeBuffetGenerator.java +art/arcane/iris/engine/platform/studio/generators/ObjectStudioGenerator.java +art/arcane/iris/Iris.java +art/arcane/iris/platform/bukkit/BukkitBiome.java +art/arcane/iris/platform/bukkit/BukkitBlockState.java +art/arcane/iris/platform/bukkit/BukkitEntityType.java +art/arcane/iris/platform/bukkit/BukkitItem.java +art/arcane/iris/platform/bukkit/BukkitPlatform.java +art/arcane/iris/platform/bukkit/BukkitRegistries.java +art/arcane/iris/platform/bukkit/BukkitScheduler.java +art/arcane/iris/platform/bukkit/BukkitWorld.java +art/arcane/iris/util/common/data/B.java +art/arcane/iris/util/common/data/IrisCustomData.java +art/arcane/iris/util/common/data/registry/Attributes.java +art/arcane/iris/util/common/data/registry/KeyedRegistry.java +art/arcane/iris/util/common/data/registry/Materials.java +art/arcane/iris/util/common/data/registry/Particles.java +art/arcane/iris/util/common/data/registry/RegistryTypeAdapter.java +art/arcane/iris/util/common/data/registry/RegistryUtil.java +art/arcane/iris/util/common/data/VectorMap.java +art/arcane/iris/util/common/director/context/VectorContextHandler.java +art/arcane/iris/util/common/director/context/WorldContextHandler.java +art/arcane/iris/util/common/director/DirectorExecutor.java +art/arcane/iris/util/common/director/handlers/BlockVectorHandler.java +art/arcane/iris/util/common/director/handlers/PlayerHandler.java +art/arcane/iris/util/common/director/handlers/VectorHandler.java +art/arcane/iris/util/common/director/handlers/WorldHandler.java +art/arcane/iris/util/common/director/specialhandlers/NullablePlayerHandler.java +art/arcane/iris/util/common/format/C.java +art/arcane/iris/util/common/inventorygui/UIStaticDecorator.java +art/arcane/iris/util/common/inventorygui/Window.java +art/arcane/iris/util/common/inventorygui/WindowResolution.java +art/arcane/iris/util/common/math/AxisAlignedBB.java +art/arcane/iris/util/common/math/Direction.java +art/arcane/iris/util/common/math/Vector3i.java +art/arcane/iris/util/common/math/VectorMath.java +art/arcane/iris/util/common/misc/Bindings.java +art/arcane/iris/util/common/nbt/mca/Chunk.java +art/arcane/iris/util/common/nbt/mca/NBTWorld.java +art/arcane/iris/util/common/plugin/chunk/ChunkTickets.java +art/arcane/iris/util/common/plugin/chunk/TicketHolder.java +art/arcane/iris/util/common/plugin/Chunks.java +art/arcane/iris/util/common/plugin/CommandDummy.java +art/arcane/iris/util/common/plugin/IController.java +art/arcane/iris/util/common/plugin/IrisService.java +art/arcane/iris/util/common/plugin/MortarCommand.java +art/arcane/iris/util/common/plugin/MortarPermission.java +art/arcane/iris/util/common/plugin/RouterCommand.java +art/arcane/iris/util/common/plugin/VirtualCommand.java +art/arcane/iris/util/common/plugin/VolmitPlugin.java +art/arcane/iris/util/common/plugin/VolmitSender.java +art/arcane/iris/util/common/reflect/KeyedType.java +art/arcane/iris/util/common/reflect/OldEnum.java +art/arcane/iris/util/common/scheduling/J.java +art/arcane/iris/util/project/hunk/Hunk.java +art/arcane/iris/util/project/hunk/view/ChunkBiomeHunkView.java +art/arcane/iris/util/project/hunk/view/ChunkDataHunkHolder.java +art/arcane/iris/util/project/hunk/view/ChunkDataHunkView.java +art/arcane/iris/util/project/hunk/view/ChunkHunkView.java +art/arcane/iris/util/project/matter/IrisMatterSupport.java +art/arcane/iris/util/project/matter/slices/EntityMatter.java +art/arcane/iris/util/project/matter/slices/TileMatter.java +art/arcane/iris/util/project/matter/WorldMatter.java +art/arcane/iris/util/project/sentry/Attachments.java +art/arcane/iris/util/project/sentry/ServerID.java