Issue #3619137 by deviantintegral: Allow the DubBot integration to be switched off
Environments DubBot cannot crawl, such as local development sites and per branch previews, gain nothing from asking DubBot about their URLs and should not wait on the requests. Sites have been patching the link generator to detect their local environment, which no module can do portably.
Adds an 'enabled' setting instead, so the environment tells the module rather than the module guessing. It is checked in ClientInterface::isEnabled(), ahead of the remembered embed key validation, so a config override takes effect without invalidating a validation the environment may have no way to perform again. LinkGenerator checks it in ::generate() and ::build() as well, so the guarantee does not depend on how the link is reached, and a switched off site neither builds a placeholder nor has its choice mistaken for the DubBot outage that ::lazyBuild() retries after five minutes.
The status report and the settings form validate the embed key by asking DubBot, which a switched off site must not do, so both now skip that request. The settings form reports a configuration override rather than appearing to ignore it, since ConfigFormBase edits the stored value the override hides.
Client::$enabled becomes $hasValidEmbedKey, because isEnabled() now has two inputs and the property only ever memoised one of them. The name of CLIENT_CACHE_ENABLED_CID is left alone, since its value is a live cache key, but it gains a docblock saying what it actually holds.
dubbot_update_10001()'s backfill moves into a helper that dubbot_update_10002() reuses, because a site that has already run 10001 is never offered it again and would otherwise never receive 'enabled'.
Co-Authored-By: Claude Opus 5 (1M context) noreply@anthropic.com Claude-Session: https://claude.ai/code/session_01JJfLtaHxmKn9CxxpjrcVXc
Closes #3619137