Invoke when adding or changing ACF/ACFE Gutenberg blocks: block.php render callback, blocks.* Blade under resources/views/blocks/, underscore slugs (like flexible), Composers/Blocks, JSON-first block-types, tests/Blocks. Triggers: new block, ACF block, Gutenberg block, block editor block.
Rule: .cursor/rules/12-acf-blocks.mdc (includes “When asked to add a new block” checklist). Flexible counterpart: skill acf-flexible (flexible.php, resources/views/flexible/).
app/Integrations/acf/json/ — block name → acf/{underscore_slug}.block.php.resources/views/blocks/{slug}.blade.phpApp\View\Composers\Blocks/{Name}.php → $views = ['blocks.{slug}']tests/Blocks/ + composer testblock.php with $block, $post_id, $is_preview.$slug = str_replace('acf/', '', $block['name']) → view name blocks.{slug}.resources/views/blocks/{slug}.blade.php.hero_banner) so it matches hero_banner.blade.php — same convention as flexible layouts.block-types/ etc.), Blade, protected static $views on the composer, and tests aligned on that slug.App\View\Composers\Blocks/{BlockName}.php extending Roots\Acorn\View\Composer.protected static $views = ['blocks.{slug}'];block.php and Blade thin.@php. See 05-theme-php-blade-acf.mdc / 09-blade-laravel-components.mdc.tests/Blocks/ — minimal/empty $block, preview, missing view (non-fatal). Run composer test before done (10-testing-mandatory.mdc).app/Integrations/acf/json/ — no duplicating JSON schema in PHP.