Skip to content

Autoloader fatals when mapped changelog handler file is absent #4576

Description

@pirate-bot

Summary

A cron request can terminate with require(): Failed opening required .../changelog_handler.php when Neve attempts to load its dashboard changelog handler and the mapped PHP file is unavailable.

Expected behavior: an unavailable mapped class file is handled as an autoload miss without terminating the request.

Actual behavior: the request reaches a fatal error during theme bootstrap.

Impact: the affected site's cron execution is interrupted until the deployment or filesystem discrepancy is resolved.

Customer context

  • Product / area: Neve theme bootstrap and dashboard changelog autoloading
  • Version: 4.2.10
  • Environment: WordPress 6.9.6, PHP 7.4.33, cron request
  • Integration / third party: Not applicable
  • Reported error / symptom: require(): Failed opening required .../changelog_handler.php
  • Impact: One production crash occurrence on one distinct site in the telemetry query window.

Reproduction notes

Reported production sequence:

  1. WordPress loads Neve during a cron request on version 4.2.10.
  2. Theme bootstrap reaches construction of the dashboard main module.
  3. Autoloading maps Changelog_Handler to inc/admin/dashboard/changelog_handler.php.
  4. That file is unavailable on the installation, and the unconditional require produces the reported fatal.

Runtime reproduction was not performed. The missing-file condition is established by telemetry; the mapped file is present in the inspected v4.2.10 Git tree.

Diagnosis

Conclusion

Production telemetry identifies a fatal at autoloader.php:148 while loading changelog_handler.php. In v4.2.10, Neve\Autoloader::require_file() performs an unconditional require, so an unavailable mapped PHP file terminates the request. The handler exists in the inspected v4.2.10 release tree; its absence on the affected installation is anomalous, but the unguarded autoload path is confirmed to turn that condition into a fatal.

Where this likely occurs

  • autoloader.php — lines 114-150, Neve\Autoloader::load_mapped_file() and Neve\Autoloader::require_file() construct mapped filenames and unconditionally require them at line 148.
  • inc/admin/dashboard/main.php — lines 44-47, Neve\Admin\Dashboard\Main::__construct() instantiates Changelog_Handler, reaching the mapped file inc/admin/dashboard/changelog_handler.php.
  • v4.2.10 (ba9965943) contains inc/admin/dashboard/changelog_handler.php, confirming it is part of that release rather than an optional source file.
  • Commit 395e4b5dd (fix: improve autoloader and file inclusion handling) later adds file-readability handling in this area; it is outside the reported 4.2.10 release.

Engineering notes

The reported request was WordPress cron, not a dashboard page. The inspected bootstrap path constructs the dashboard main module before its init() method registers admin hooks, so dashboard-related class loading can occur during this request type. The exact production filesystem condition that made the tracked handler unavailable is unknown. WordPress core loading behavior was not inspected locally.

Test coverage status

tests/test-neve-loaders.php lines 18-36 (TestNeveLoaders::testAutoloader() and testFactory()) covers existing-class autoloading and factory construction, not missing mapped files. e2e-tests/cypress/integration/dashboard/changelog.spec.ts lines 1-28 covers dashboard changelog rendering only. No relevant coverage was found during inspection for a missing autoload target during cron bootstrap.

What to verify or explore next

  • May be worth reproducing a cron bootstrap with the mapped changelog handler unavailable in a v4.2.10 package.
  • Check whether the guarded autoload behavior from 395e4b5dd is included in a released version after 4.2.10.
  • If reproducible, inspect deployment packaging and filesystem conditions associated with the missing tracked file.

Unknowns / follow-up

  • The telemetry report has no structured stack trace beyond the fatal location.
  • The affected site's package integrity, permissions, and deployment history are unavailable.
  • Occurrence data covers one site and does not establish wider prevalence.

Confidence

Confidence: 93/100

The telemetry fatal maps exactly to Neve's unchecked autoloader require in v4.2.10. The requested handler is present in the release tree, so the production file absence is anomalous, but the theme converts that filesystem discrepancy into a cron-blocking fatal; later history contains a guarded-autoload change.

Crash telemetry

Occurrences 1
Distinct sites 1
First seen 2026-08-09 13:11 UTC
Last seen 2026-08-09 13:11 UTC
Crash location product:autoloader.php:148
Request context cron
Inside Themeisle SDK no
Product versions 4.2.10
WP versions 6.9.6
PHP versions 7.4.33
SDK versions 3.3.59

Source: automated crash report — neve, fingerprint 5db4c0008a5fcd5e4fd959176b5ae87d
Generated by bug-report-triage (ID: bug-report-triage_6a7aba86767174.99916375)

Metadata

Metadata

Type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions