Repository navigation
0.6.0
Wave 0a of docs/spec/17: the one finding of the audits with irreversible consequences (a staging copy with the
production key submits real URLs while check says nothing), plus what bc.md allows in a minor. Additive; the
only behaviour change is a red check in the case described first. Adapters of this wave: symfony-bundle 0.7.0,
laravel 0.8.0, yii2 0.6.0, doctrine 0.4.0, sitemap 0.2.0.
Added
checkfails outside production when a key is configured anddry_runwas left unset:environment "staging" is not in production_environments but dry_run is off: changes WILL be sent to search engines under key ab12****. Set INDEXNOW_DRY_RUN=1 or INDEXNOW_ENABLED=0 outside production, or set dry_run: false explicitly if this environment submits on purpose.A preview environment that submits on purpose says so with an explicit
dry_run: false(the line becomes a warning); without an environment name (plain PHP withoutAPP_ENV/
INDEXNOW_ENV) nothing is judged. Anenvironment: …line is printed whenever the name is known. If a
pipeline runscheckon a staging copy that submits on purpose, it turns red after this upgrade: add
dry_run: falseto that environment's configuration (Laravel:INDEXNOW_DRY_RUN=0).Config::$dryRunExplicit: whetherdry_runcame from the configuration (fromArray()saw the key with a non-null
value; the constructor defaults to true;with(dryRun:)/withDryRun()set it, otherwith()changes keep it).Engine::InternetArchive(internetarchive) andEngine::Amazon(amazon), from the IndexNow registry
(searchengines.json, snapshot 2026-09-05; the direct Internet Archive host had no DNS record that day — it is
reached throughapi). docs/spec/01-protocol.md lists the registry.Config::fromEnv()readsINDEXNOW_PREVIOUS_KEY.checkends withNext: annotate a class with #[IndexNow(...)], or send one URL now: <cli> <submit> https://….Check\Checker: a mismatching key file body is printed (its first 60 bytes) with the usual cause, a catch-all
route answering 200 with HTML.
Fixed
- Debounce with several engines: a URL accepted by one engine and answered 429/5xx (or a transport failure) by
another was marked as submitted, so the retry of the failed engine hit the window and never left. The marked set
is now the successful URLs minusResult::retryableUrls(); a permanent refusal (403, 422) at one engine still
marks.engines: ['api'], dry_run and invalid URLs are unchanged. - Error texts say the fact, what is allowed and how to fix it: the
resolver.*andretry.*bounds (one message per
option, with the value),debounce.key_prefix(which characters PSR-6 reserves), the unknown-engine message
(mentionsengine_aliases),Console\ClassNameResolver(the namespaces searched; what the command needs the
class for),ParamExtractor(the accepted param kinds; the method and property names tried and the registered
readers).Retry\RetryingSubmitter's docblock states the sync/CLI path and points queue workers to
WorkerOutcome.
Documentation
- README: "Why this over X", "Notification, not indexing" (where to see the result, 410/404/301 for deleted and moved
pages, Bing URL Submission API and Google Indexing API are other protocols), Internet Archive and Amazon among the
notified engines, the issues link to the monorepo,key_file.enabledinstead ofserve_key_filein the table.