Skip to content

Otter 3.2.0 fatals when Atomic_Wind_Blocks is unavailable to the generated autoloader #2954

Description

@pirate-bot

Summary

Otter Blocks can terminate a frontend request during initialization with Class "...Atomic_Wind_Blocks" not found.

Expected behavior: plugin initialization continues when the Atomic Wind module cannot be loaded, or the released package makes the module available before it is initialized.

Actual behavior: initialization attempts to create the unavailable class and produces a fatal error.

Impact: the affected frontend request cannot complete.

Customer context

  • Product / area: Otter Blocks frontend initialization
  • Version: 3.2.0
  • Environment: WordPress 7.0.2; PHP 8.4.23
  • Integration / third party: Themeisle SDK 3.3.58 was present; telemetry marks the crash as outside SDK code.
  • Reported error / symptom: Class "...Atomic_Wind_Blocks" not found at inc/class-main.php:97
  • Impact: One fatal occurrence across one site in the telemetry query window, first and last seen 2026-07-30 UTC.

Reproduction notes

  1. Install Otter Blocks 3.2.0 with a Composer autoload map that does not contain ThemeIsle\GutenbergBlocks\Plugins\Atomic_Wind_Blocks.
  2. Load a frontend request so WordPress runs the init callback registered by Otter.
  3. Observed production result: Main::autoload_classes() attempts to instantiate the class and the request fatals at inc/class-main.php:97.

Direct reproduction against the affected production package was not performed; its archive was not available in the workspace.

Diagnosis

Conclusion

Production telemetry provides a direct fatal-error report at the Otter initialization loop. In the v3.2.0 source, Atomic_Wind_Blocks is added to the initialization list and instantiated without an availability check. The class exists in the source tree, but Composer is configured to expose inc/ through a generated classmap and vendor/ is not versioned. The observed runtime class-not-found error is therefore consistent with the released installation having an incomplete or stale generated autoload map, and the unconditional initialization turns that packaging/runtime inconsistency into a frontend fatal.

Where this likely occurs

  • inc/class-main.phpThemeIsle\GutenbergBlocks\Main::autoload_classes() lines 63-101; line 91 lists Plugins\Atomic_Wind_Blocks, and line 97 instantiates each listed class without class_exists().
  • inc/plugins/class-atomic-wind-blocks.phpThemeIsle\GutenbergBlocks\Plugins\Atomic_Wind_Blocks line 16; the class is present in the v3.2.0 tag source.
  • composer.jsonautoload lines 61-65; inc/ is configured as a Composer classmap, so loading this class depends on generated vendor metadata.
  • .gitignore — line 7 excludes vendor; otter-blocks.php lines 35-42 loads vendor/autoload.php before resolving Main.
  • Git history attributes the added class-list entry to 75d2c9a2 (feat: adds atomic-wind blocks), which is included in v3.2.0. The crash was reported against v3.2.0; v3.2.1 retains the same initialization path in the inspected source.

Engineering notes

  • Telemetry identifies this as product code, not bundled Themeisle SDK code, so routing is Codeinwp/otter-blocks.
  • The failure occurs before Atomic_Wind_Blocks::instance() can evaluate its feature option, so a disabled Atomic Wind setting does not protect the reported path once the class cannot be autoloaded.
  • The inspected deployment workflow runs Composer before the distribution build, which suggests the exact cause of the affected package cannot be established from the repository alone. The production fatal nevertheless confirms the class was unavailable at runtime for this initialization path.
  • Evidence covers one reported site and one frontend request; broader affected-package scope is unknown.

Test coverage status

tests/test-atomic-wind-blocks.php exercises Atomic_Wind_Blocks directly, including construction at lines 34-39. No relevant coverage was found during inspection for a packaged Composer autoload map missing this class, or for Main::autoload_classes() encountering an unavailable listed class.

What to verify or explore next

  • Reproduce with a v3.2.0 release archive and inspect its generated Composer classmap for ThemeIsle\GutenbergBlocks\Plugins\Atomic_Wind_Blocks.
  • Run the PHP bootstrap path with an autoload map that omits the Atomic Wind class and confirm the reported frontend fatal at Main::autoload_classes().
  • Compare the generated vendor/composer metadata from the affected v3.2.0 package, if retained, with a clean build from tag v3.2.0.
  • Check whether the same failure can occur after updating to v3.2.1.

Unknowns / follow-up

  • The telemetry report has no structured stack trace beyond the shutdown-detected fatal and no retained plugin archive.
  • It is unknown whether the unavailable class resulted from a release artifact, a partial update, or an environmental modification on the affected site.

Confidence

Confidence: 88/100

Production telemetry records a frontend fatal in Otter Blocks 3.2.0. The tagged source unconditionally instantiates the reported class during init, while that class is supplied only through Composer's generated inc/ classmap; this makes a missing or stale generated map a site-fatal condition rather than a recoverable unavailable feature.

Crash telemetry

Occurrences 1
Distinct sites 1
First seen 2026-07-30 00:42 UTC
Last seen 2026-07-30 00:42 UTC
Crash location product:inc/class-main.php:97
Request context frontend
Inside Themeisle SDK no
Product versions 3.2.0
WP versions 7.0.2
PHP versions 8.4.23
SDK versions 3.3.58

Source: automated crash report — otter-blocks, fingerprint 0d21502f7613a96991ebeacf4aaccb73
Generated by bug-report-triage (ID: bug-report-triage_6a6edcfbb58e71.73561400)

Metadata

Metadata

Assignees

Type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions