Concerns: pushword/admin, pushword/conversation, pushword/core, pushword/flat, pushword/newsletter, pushword/page-scanner, pushword/quiz, pushword/repurpose, pushword/snippet, pushword/static-generator
Remove the unused Twig argument from Pushword\Core\Twig\AppExtension, the router argument from Pushword\Core\Twig\PageExtension, and the image-cache manager argument from Pushword\Admin\Controller\MediaCrudController if constructing them manually.
Remove calls to AdminFormFieldManager::getEntityManager() (use its public em property), getMessagePrefix()/setMessagePrefix(), and FormFieldReplacer::count(). The CRUD controllers' MESSAGE_PREFIX constants and MediaCrudController::getThumbnailUrl() are gone; use Thumb::PLACEHOLDER_DATA_URI instead of Thumb::$thumb for the placeholder.
Remove references to Pushword\Core\DependencyInjection\AppsConfigParser and Pushword\Core\Site\SiteAssets. FilterRegistry::hasFilter() is replaced by checking getFilter() for null; configure image filters through image_filter_sets instead of ImageCacheManager::setFilters(). Unused repository helpers LoginTokenRepository::deleteExpiredTokens(), MediaRepository::getAllMedia() and PageRepository::getPagesWithoutParent() are gone; use Doctrine queries for these operations.
Use RequestContext::setRequestContext() instead of SiteRegistry::setRequestContextData(). Use Symfony’s UserAuthenticatorInterface::authenticateUser() for programmatic login; MagicLinkAuthenticator::createPassport() and HtmlBeautifer::removeHtmlComments() are gone.
TranslationUsageTracker::getRemainingCharacters() is gone. Use getCurrentMonthUsage() and the configured limit when displaying a remaining quota, or isWithinLimit() when checking it.
Check AdminNotification::getType() against its type constants instead of isConflict(), isSyncError() or isLockInfo(). Use MediaImporter::getMissingFiles() instead of the MediaSync wrapper. Unused ConflictResolver::setCurrentHost(), resolveMediaConflict() and recordCsvConflict() are gone; custom integrations must handle their own additional conflict reporting.
Compare CampaignRecipient::$state with RecipientState::Pending instead of isPending(). Read Enrollment::$status->value instead of getStatusLabel(), and use EnrollmentRepository::findOneBy() instead of findOneFor().
The unused LinkedDocsScanner::disableCollectMode(), disableCheckUnpublished() and getLinksCheckedCounter() helpers are gone. Use separate scanner instances if a custom integration needs both enabled and default modes in the same process.
Decode the schema providers' json() output instead of calling toArray(). Unused LaidOutText::maxWidth(), BackgroundEffectRegistry::all(), ChromiumRasterizer::available() and FontResolver::bodyFamily() are gone; use the existing rendering and font-resolution APIs.
Use SnippetRepository::findOneBy() with a normalized slug and host instead of findOneBySlugAndHost().
Subscribe to StaticPreGenerateEvent and StaticPostGenerateEvent by class name instead of the unused PushwordEvents::STATIC_PRE_GENERATE/STATIC_POST_GENERATE constants. Use Configuration::DEFAULT_ASSETS instead of DEFAULT_COPY. Unused GenerationStateManager::getPageState()/ clearHost(), AbstractGenerator::copy(), KernelTrait::$kernel and StaticAppGenerator::isIncremental() are gone.