Skip to content

1.41.0 - Lumen

Latest

Choose a tag to compare

@github-actions github-actions released this 31 Aug 10:27
· 3 commits to main since this release
367929b
vortex-1410-lumen_1

1.41.0 - Lumen

This release replaces several in-house mechanisms with the ecosystem equivalents and fixes a set of mechanisms that had been running without doing anything: mail interception in CI moves to Drupal core's mail collector, large database dumps import without hand-tuning, the front-end toolchain moves from Yarn to npm, and security scanning gets its own workflow. The documentation is restructured into a single Development section, and the administration interface switches to Drupal core's Navigation module.


πŸ” Highlights

  • Mail interception in CI moved from a custom mechanism to core's mail collector
    The custom suspend_mail_send flag lived in the scaffold module consumers are invited to edit, so deleting that hook silently re-enabled mail in ci. It is replaced by two independent layers that a project cannot switch off by accident: Drupal core's mail collector as a settings override, and SSMTP_MAILHUB pointed at a closed port so delivery fails at the transport regardless of which mail plugin produced the message.

  • Yarn replaced by npm across the template
    Module scripts and theme compilation now run on npm. The ahoy commands are unchanged (ahoy fei, ahoy fe, ahoy lint-fe, ahoy test-js), but the lock file changes from yarn.lock to package-lock.json.

  • Large database dumps import reliably
    The shipped database configuration raises the InnoDB redo log capacity to 1 GB, the default Drush memory_limit goes from 512M to 1G, and cache table data is dropped from exported dumps. Together these remove the three most common causes of a failed import on a big site.

  • Standalone Security audit workflow
    Gitleaks secret scanning and composer audit moved out of the build workflow into their own Security audit workflow, with composer audit running first and every check running regardless of earlier failures - so one finding no longer hides the rest.

  • Core Navigation replaces Admin Toolbar
    The administration interface is now Drupal core's Navigation module plus navigation_extra_tools, and drupal/admin_toolbar is no longer shipped.

  • Search and migration handling in provisioning
    A new search re-index provision step runs for development environments, and the Solr search server is disabled while migrations run so indexing does not compete with the migration.

  • Deployment logs and stale branch cleanup
    Notifications can now carry the deployment log, and artifact deployments can prune stale deployment branches on a pattern and age.

  • Documentation restructured
    Content is reorganised into a single Development section with per-topic subsections and canonical tool pages, and both documentation majors are now served from one combined site built on every branch.


πŸ’₯ Breaking changes

These changes are applied when you update to 1.41.0.

  • Yarn replaced by npm. Delete yarn.lock from the repository root and from your custom theme, run npm install in both to generate package-lock.json, and commit the result. Any custom scripts or CI steps calling yarn must call npm instead. The ahoy front-end commands keep their names.

  • drupal/admin_toolbar replaced by the core Navigation module. Uninstall admin_toolbar on existing sites; navigation and navigation_extra_tools are installed by the development modules provision script. If your project depends on Admin Toolbar, add it back to your own composer.json.

  • .gitignore, .dockerignore and .gitignore.artifact are now deny lists. They previously ignored everything under web/ and un-ignored selected paths; now everything not listed is tracked. Review git status after updating - files that were silently ignored before may now be picked up.

  • VR_DIFFY_AUTO_BRANCHES renamed to VR_DIFFY_PR_SKIP_BRANCHES. Rename the repository variable if you set it. The default is unchanged (deps/*).

  • The installer removes unmodified template-owned paths. A .vortex-manifest.json records checksums for files the template ships, so an update deletes template-owned files you never modified when the template stops shipping them. Files you edited are left alone.

  • The provision task completion marker changed from < to +. Any log parsing that matched the old marker needs updating.

  • Versioned Drupal Rector sets replaced by the composer-based set. Rector now derives the Drupal rule set from the installed core version instead of a pinned set. Custom rector.php files that reference a versioned DrupalSetList constant need updating.


What's new since 1.40.2

πŸŒ€ Template

  • ✨ New

    • [#3039] Replaced 'suspend_mail_send' with a mail collector and a closed mail transport in CI. @AlexSkrypnyk (#3050)
      What it does: Installs Drupal's mail collector as a settings override in the ci environment and points SSMTP_MAILHUB at a closed port, so no automated test run can deliver a message to a real recipient. Reroute Email is disabled in ci so each stored message keeps its intended recipient.
      How to use it: Applies automatically in ci. Tag a scenario @email to assert on captured messages with the EmailTrait steps; untagged scenarios are still covered by the default collector.

    • [#2814] Added search re-index provision script for development environments. @AlexSkrypnyk (#2815)
      What it does: Adds scripts/provision-30-search-index.sh, which re-indexes the search backend after provisioning.
      How to use it: Runs automatically in development environments. Set DRUPAL_SEARCH_INDEX_SKIP=1 (default 0) to skip it.

    • [#2985] Added generated content provisioning to the development modules script. @AlexSkrypnyk (#2997)
      What it does: Creates placeholder content through drupal/generated_content as part of the development modules provision step.
      How to use it: Runs automatically in development environments. Set DRUPAL_GENERATED_CONTENT_SKIP=1 (default 0) to skip it.

    • [#3001] Disabled the Solr search server while migrations run. @AlexSkrypnyk (#3006)
      What it does: Disables the Search API Solr server for the duration of a migration and re-enables it afterwards, so indexing does not compete with the migration.
      How to use it: On by default. Set DRUPAL_MIGRATION_SEARCH_DISABLE=0 (default 1) to leave the server enabled.

    • [#2885] Split Gitleaks and composer audit into a standalone 'Security audit' workflow. @AlexSkrypnyk (#2886)
      What it does: Moves secret scanning and dependency auditing out of the build workflow into a dedicated Security audit workflow on both CI providers.
      How to use it: Runs automatically; no configuration needed. Security findings no longer block or hide build results.

    • [#2808] Added opt-in deployment log collection to notifications. @AlexSkrypnyk (#2818)
      What it does: Collects the deployment log and attaches it to the outgoing notification for every channel that supports it.
      How to use it: Set VORTEX_NOTIFY_LOG=1 (default 0). The log directory is VORTEX_NOTIFY_LOG_DIR, which the notify script defaults for you.

    • [#2696] Bumped git-artifact to 1.7.0 and added an option for stale deployment branch cleanup. @AlexSkrypnyk (#2827)
      What it does: Lets an artifact deployment delete deployment branches that match a pattern and are older than a given age.
      How to use it: Set VORTEX_DEPLOY_ARTIFACT_CLEANUP_PATTERN (default empty, which disables cleanup) and optionally VORTEX_DEPLOY_ARTIFACT_CLEANUP_AGE (default 7 days).

    • [#2863] Added opt-in for visual regression on non-PR deployments. @AlexSkrypnyk (#2864)
      What it does: Allows visual regression runs on branches outside pull requests.
      How to use it: Set the VR_DIFFY_BRANCHES repository variable to the branches to cover. VR_DIFFY_PR_SKIP_BRANCHES (default deps/*) still excludes branches from PR runs.

    • [#3035] Added a Behat profile offset to decouple the profile from the runner index. @AlexSkrypnyk (#3037)
      What it does: Lets the Behat profile number be offset from the CI runner index, so Behat runners need not start at index 0.
      How to use it: Set VORTEX_CI_BEHAT_PROFILE_OFFSET (default 0) in the CI configuration.

    • [#3010] Freed preinstalled runner toolchains in the GitHub Actions build and database jobs. @AlexSkrypnyk (#3011)
      What it does: Removes preinstalled toolchains from the GitHub Actions runner to reclaim disk space before the build.
      How to use it: Set the VORTEX_CI_FREE_DISK_SPACE repository variable to 1 (opt-in). Leave it unset to keep the default runner image intact.

    • [#3042] Tracked '.claude/skills/' in consumer projects by default. @AlexSkrypnyk (#3048)
      What it does: Keeps .claude/ as an allow list but un-ignores .claude/skills/, so skills shared with the team are committed while machine-local Claude state stays ignored.
      How to use it: Applies automatically; commit your project skills under .claude/skills/.

    • [#2984] Excluded cache table data from the exported database dump. @AlexSkrypnyk (#2994)
      What it does: Exports cache tables with their structure but without their data, since Drupal rebuilds them on demand.
      How to use it: On by default. VORTEX_EXPORT_DB_FILE_STRUCTURE_TABLES (default cache*) takes a comma-separated list of table names, each of which may use *; set it empty to export every table's data.

  • πŸ›  Changed

    • [#3040] Switched the template from Yarn to npm for module scripts and theme compilation. @AlexSkrypnyk (#3046)
      What it does: Replaces Yarn with npm throughout the template: npm ci for installs, npm run for build, watch and lint targets, and npm test for Jest.
      How to use it: Delete yarn.lock from the root and the custom theme, run npm install in both, and commit package-lock.json. See Breaking changes.

    • [#3041] Namespaced the CI runner-role variables under the 'VORTEX_CI_' prefix. @AlexSkrypnyk (#3045)
      What it does: Settles the seven runner-role and profile variables introduced in this release on the VORTEX_CI_ prefix, matching the rest of the template.
      How to use it: No action needed on update. These variables are new in 1.41.0 and did not exist in 1.40.2 under any name, so there is nothing in an existing project to rename.

    • [#2711] Replaced Admin Toolbar default with the core Navigation module. @AlexSkrypnyk (#2806)
      What it does: Installs Drupal core's Navigation module plus navigation_extra_tools as the administration interface and drops drupal/admin_toolbar.
      How to use it: Uninstall admin_toolbar on existing sites. See Breaking changes.

    • [#2703] Turned '.dockerignore', '.gitignore' and '.gitignore.artifact' into deny lists. @AlexSkrypnyk (#2780)
      What it does: Inverts the ignore files from an allow list of un-ignored paths to a deny list of generated, downloaded and local-only files.
      How to use it: Review git status after updating. See Breaking changes.

    • [#2986] Raised the default Drush 'memory_limit' to 1G. @AlexSkrypnyk (#2993)
      What it does: Raises the shipped Drush memory_limit from 512M to 1G so long-running commands do not exhaust memory.
      How to use it: Applies automatically. For a one-off larger limit, run ahoy cli php -d memory_limit=2G vendor/bin/drush <command>.

    • [#2980] Raised the InnoDB redo log capacity so large database dumps import. @AlexSkrypnyk (#2990)
      What it does: Sets the InnoDB redo log capacity to 1 GB in the shipped database configuration.
      How to use it: Applies automatically on the next container rebuild; no configuration needed.

    • [#3002] Ran 'composer audit' first and every audit check regardless of failures. @AlexSkrypnyk (#3004)
      What it does: Reorders the audit job to run composer audit first and continues through every check even after one fails, so a single finding does not mask the others.
      How to use it: Applies automatically in CI.

    • Replaced per-step CI runner conditions with declared runner roles. @AlexSkrypnyk (#3033)
      What it does: Replaces ad-hoc per-step runner index comparisons with explicit runner-role variables declared once per job.
      How to use it: Applies automatically.

    • [#2975] Replaced versioned Drupal Rector sets with the composer-based set. @AlexSkrypnyk (#2978)
      What it does: Derives the Drupal Rector rule set from the installed core version rather than a pinned versioned set.
      How to use it: Applies automatically. Update custom rector.php files that name a versioned DrupalSetList constant. See Breaking changes.

    • [#2987] Raised the Prettier 'printWidth' default to 160 and pinned doc comments to 80. @AlexSkrypnyk (#2995)
      What it does: Widens the Prettier line limit to 160 characters for code while holding documentation comments at 80.
      How to use it: Applies automatically; run ahoy lint-fix to reformat.

    • [#3059] Adopted the Drupal core ESLint 9 configuration and updated the front-end toolchain. @AlexSkrypnyk (#3047)
      What it does: Moves the theme to Drupal core's ESLint 9 flat configuration and refreshes the front-end toolchain around it.
      How to use it: Applies automatically. Custom ESLint rules must move to the flat config format.

    • Replaced the provision task completion marker '<' with '+'. @AlexSkrypnyk (#3061)
      What it does: Changes the character that marks a completed provision task in the log output.
      How to use it: Update any log parsing that matched the old marker. See Breaking changes.

    • [#2891] Split CircleCI deploy branch filter into per-pattern list. @AlexSkrypnyk (#2893)
      What it does: Replaces a single combined deploy branch regex with an explicit per-pattern list.
      How to use it: Applies automatically; adjust the list if you customised the filter.

    • [#2829] Reduced CI runner disk pressure during provisioning. @AlexSkrypnyk (#2837)
      What it does: Frees disk space during provisioning so large builds do not exhaust the runner.
      How to use it: Applies automatically in CI.

    • [#3053] Suppressed 'docker compose cp' progress output in CI. @AlexSkrypnyk (#3054)
      What it does: Silences the per-file progress output of docker compose cp so CI logs stay readable.
      How to use it: Applies automatically in CI.

    • [#2849] Anchored environment name matching in provision scripts. @AlexSkrypnyk (#2854)
      What it does: Anchors environment name comparisons so a partial name cannot match the wrong environment.
      How to use it: Applies automatically on provision.

    • [#2848] Split provision example into demo, development module and example scripts. @AlexSkrypnyk (#2859)
      What it does: Separates the single provision example into distinct demo, development module and example scripts.
      How to use it: Applies automatically; the scripts live under scripts/.

    • [#3017] Installed 'testmode' from the development modules provision script. @AlexSkrypnyk (#3018)
      What it does: Installs the testmode module as part of the development modules provision step.
      How to use it: Applies automatically in development environments.

    • [#2843] Suppressed Composer output of the initial tooling install and adopted the standard progress helpers. @AlexSkrypnyk (#2858)
      What it does: Quiets the bootstrap tooling install and routes its output through the standard task/pass helpers.
      How to use it: Applies automatically on first run.

    • [#3007] Closed every 'task' with a 'pass' or a 'fail' in shipped scripts. @AlexSkrypnyk (#3008)
      What it does: Ensures every announced task reports an outcome, so no step leaves the reader unsure whether it succeeded.
      How to use it: Applies automatically; output only.

    • [#2967] Moved 'exit 1' into the 'fail()' helper across the shell tooling. @AlexSkrypnyk (#2971)
      What it does: Makes fail() itself terminate, removing the repeated exit 1 at every call site.
      How to use it: Applies automatically. Custom scripts that call fail() and then exit 1 can drop the explicit exit.

    • [#2896] Skipped database image fetch when the image already exists on the host. @AlexSkrypnyk (#2951)
      What it does: Avoids re-pulling the database image when it is already present locally.
      How to use it: Applies automatically; speeds up repeat builds.

    • Updated demo and test DBs. @AlexSkrypnyk (#2812)
      What it does: Regenerates the demo and test databases and points the demo database URL at the 1.40.0 release asset.
      How to use it: Applies automatically for demo installs.

    • [#2851] Removed the 'page' content model when the demo and search modules are deselected. @AlexSkrypnyk (#2862)
      What it does: Drops the sample page content type from an install that opts out of both the demo content and the search modules.
      How to use it: Affects new installs only.

    • [#2852] Made 'dclint' and 'hadolint' optional development tools. @AlexSkrypnyk (#2855)
      What it does: Turns the Docker Compose and Dockerfile linters into individually selectable tools.
      How to use it: Choose them during installation; existing projects keep both.

    • Skipped Behat animated screenshots in CI on 'drevops/behat-screenshot' 2.6.0. @AlexSkrypnyk (#3032)
      What it does: Disables animated failure screenshots in CI, where they cost time without adding signal over the still capture.
      How to use it: Applies automatically in CI; local runs are unchanged.

    • [#2795] Added 'issues: write' permission to the Renovate dependency updates job. @AlexSkrypnyk (#2802)
      What it does: Grants the Renovate job the permission it needs to manage the dependency dashboard issue.
      How to use it: Applies automatically to GitHub Actions projects.

    • [#2794] Added 'pull-requests: read' permission to CI deploy job for 'gh pr view'. @AlexSkrypnyk (#2797)
      What it does: Grants the deploy job the permission needed to read pull request metadata.
      How to use it: Applies automatically to GitHub Actions projects.

    • [#3012] Migrated release drafter's default version resolver to a 'version-resolver' category. @AlexSkrypnyk (#3013)
      What it does: Moves the release drafter configuration onto the supported version-resolver key.
      How to use it: Applies automatically.

    • [#2784] Added Drupal logo to the Drupal version shield. @AlexSkrypnyk (#2801)
      What it does: Adds the Drupal logo to the README version badge.
      How to use it: Cosmetic; no action needed.

    • Added the visual regression report to the GitHub Actions run summary. @AlexSkrypnyk (#2865)
      What it does: Publishes the visual regression result into the workflow run summary.
      How to use it: Applies automatically to GitHub Actions projects.

    • [#2868] Pinned Hadolint to v2.15.0 and replaced its global ignores with justified per-line ones. @AlexSkrypnyk (#2867)
      What it does: Pins the Hadolint image and replaces file-wide ignores with per-line suppressions.
      How to use it: Applies automatically in CI.

    • [#2870, #2871, #2872] Pinned the seed script, 'asciinema' and 'sharp-cli' versions. @AlexSkrypnyk (#2874)
      What it does: Pins the remaining unpinned tool versions used by the seed and documentation pipelines.
      How to use it: Maintainer-facing; no consumer action needed.

    • Converged naming, structure, API conventions and source comments across the codebase. @AlexSkrypnyk (#2952, #2895, #2890)
      What it does: Aligns naming, visibility, API shapes and comment register across the template, installer, tooling and test harness.
      How to use it: Internal consistency work; no consumer action needed.

  • 🐞 Fixed

    • [#3070] Restored Drupal Rector sets and added a guard against them silently unloading. @AlexSkrypnyk (#3071)
      What it does: Fixes the Drupal Rector rule sets being dropped when PHPUnit is deselected, and adds a canary that fails the lint run if the sets ever stop loading.
      How to use it: Applies automatically; ahoy lint now fails loudly instead of passing with no Drupal rules active.

    • [#3019] Fixed 'getProtectedValue()' reading the property from the reflection class instead of the object. @AlexSkrypnyk (#3020)
      What it does: Corrects a test helper that read a protected property off the reflection class rather than the instance.
      How to use it: Test-infrastructure fix; no consumer action needed.

    • [#3023] Anchored environment variable prefixes forwarded by 'ahoy cli'. @AlexSkrypnyk (#3024)
      What it does: Anchors the prefix match so ahoy cli no longer forwards variables that merely contain a matching substring.
      How to use it: Applies automatically.

    • Fixed 'vortex-tooling.sh' aborting when an older tooling package directory is present. @AlexSkrypnyk (#2811)
      What it does: Lets the tooling bootstrap proceed when a previous tooling package directory is left behind.
      How to use it: Applies automatically on update.

    • [#2816] Fixed Docker build check warnings in the CLI Dockerfile. @AlexSkrypnyk (#2817)
      What it does: Clears the build check warnings reported for the CLI image.
      How to use it: Applies automatically on the next image build.

    • [#2821] Fixed database fetch skip message to name the indexed force variable. @AlexSkrypnyk (#2824)
      What it does: Corrects the skip message so it names the indexed force variable actually consulted.
      How to use it: Output only.

    • [#2835] Surfaced the Lagoon CLI error on a failed deploy without debug mode. @AlexSkrypnyk (#2836)
      What it does: Prints the Lagoon CLI error on a failed deployment without requiring debug mode.
      How to use it: Applies automatically to Lagoon deployments.

    • [#2820] Surfaced Lagoon deploy output in debug mode and per-task status. @AlexSkrypnyk (#2822)
      What it does: Adds per-task status and full deploy output under debug mode for Lagoon.
      How to use it: Set VORTEX_DEBUG=1 to see the full output.

    • [#2966] Restored the Lagoon database override flag to the state it was discovered in. @AlexSkrypnyk (#2969)
      What it does: Restores the database override flag after use instead of leaving it changed.
      How to use it: Applies automatically to Lagoon deployments.

    • [#2796] Covered 'ENVIRONMENT_TYPE' in test isolation and container runtime. @AlexSkrypnyk (#2803)
      What it does: Includes ENVIRONMENT_TYPE in test isolation and the container runtime so tests do not inherit a stale value.
      How to use it: Applies automatically.

    • Updated Drupal scaffold files for Drupal 11.4 and added scaffold drift guards to tests. @AlexSkrypnyk (#2810)
      What it does: Refreshes the scaffold files to Drupal 11.4 and adds tests that fail when they drift from core.
      How to use it: Applies automatically on update.

    • [#2981] Completed the Rector rename-skip family and audited the skip list. @AlexSkrypnyk (#2991)
      What it does: Adds the missing rename-skip rules and audits the full Rector skip list.
      How to use it: Applies automatically; run ahoy lint-fix.

    • Fixed docs workflows building the v2 binary from the removed '.vortex/installer' path. @AlexSkrypnyk (#2861)
      What it does: Points the documentation workflows at the correct installer path.
      How to use it: Maintainer-facing.

    • Triggered 'Vortex - Test docs' from both per-major test workflows. @AlexSkrypnyk (#2880)
      What it does: Runs the documentation test workflow from both major-line test workflows.
      How to use it: Maintainer-facing.

  • ⬆️ Updated


πŸŽ› Installer

  • ✨ New

    • [#2988] Removed unmodified template-owned paths the install no longer ships. @AlexSkrypnyk (#2999)
      What it does: Records a .vortex-manifest.json of checksums for template-owned files, so a later update can delete files the template stopped shipping - but only where the file is byte-identical to what was installed.
      How to use it: Applies automatically on update. Files you modified are never removed.

    • [#2782] Added installer selection for Twig CS Fixer in the Tools multiselect. @AlexSkrypnyk (#2783)
      What it does: Adds Twig CS Fixer as an individually selectable tool during installation.
      How to use it: Choose it in the Tools multiselect; existing projects keep their current setup.

    • [#2852] Made 'dclint' and 'hadolint' optional development tools. @AlexSkrypnyk (#2855)
      What it does: Adds the Docker Compose and Dockerfile linters to the Tools multiselect.
      How to use it: Choose them during installation.

  • πŸ›  Changed

    • [#3040] Updated the installer Tools handler for the npm toolchain. @AlexSkrypnyk (#3046)
      What it does: Teaches the installer's Tools handler about npm rather than Yarn when stripping deselected front-end tools.
      How to use it: Reflected automatically in newly installed projects.

    • [#2851] Removed the 'page' content model when the demo and search modules are deselected. @AlexSkrypnyk (#2862)
      What it does: Drops the sample page content type from installs that opt out of both demo content and search.
      How to use it: Affects new installs only.

    • Converged naming, visibility, and idiom conventions across the installer and '.vortex/tests' harness. @AlexSkrypnyk (#2890, #2895, #2952)
      What it does: Aligns naming, property visibility and idiom across the installer and the integration test harness.
      How to use it: Internal consistency work; no consumer action needed.

  • 🐞 Fixed

    • [#3060] Synchronised npm lock files when the installer removes front-end tools. @AlexSkrypnyk (#3062)
      What it does: Regenerates package-lock.json after a deselected front-end tool is stripped, so the lock matches package.json.
      How to use it: Affects new installs only.

πŸ“– Documentation

  • ✨ New

    • Restructured the documentation into a single 'Development' section with per-topic subsections and canonical tool pages. @AlexSkrypnyk (#3038)
      What it does: Reorganises the documentation around a single Development section, with one canonical page per tool instead of content split across task, config and concept pages.
      How to use it: Browse https://www.vortextemplate.com/docs.

    • Served both documentation majors from one combined site built on every branch. @AlexSkrypnyk (#3052)
      What it does: Builds and serves both major documentation lines from a single site, on every branch rather than only on main.
      How to use it: Use the version selector on the docs site.

    • [#3000] Refreshed the contrib module documentation and added a Modules reference page. @AlexSkrypnyk (#3005)
      What it does: Documents every shipped contributed module on a single reference page.
      How to use it: See the Modules reference page in the docs.

    • [#2996] Published the shipped tooling script variables in the generated docs table. @AlexSkrypnyk (#2998)
      What it does: Extends the generated variables table to cover the variables read by the shipped tooling scripts, not only those in .env.
      How to use it: See the Variables page; regenerate with ahoy update-docs.

  • πŸ›  Changed

    • Reconciled the Vortex documentation for coherence and corrected stale facts across all sections. @AlexSkrypnyk (#3034)
      What it does: Audits every section against the code and corrects statements that had drifted.
      How to use it: No action needed.

    • Recorded the demos at a 10:6 screen ratio and sized the home page to them. @AlexSkrypnyk (#3056)
      What it does: Standardises the terminal demo aspect ratio and matches the home page layout to it.
      How to use it: Cosmetic.

    • [#3057] Refused to render a demo video whose recorded output reports an issue. @AlexSkrypnyk (#3063)
      What it does: Checks each recorded transcript for errors, warnings and failures, and declines to render the video when any are present - so a published demo is a claim the command runs clean.
      How to use it: Maintainer-facing. Read the offending lines in the decoded transcript, fix the command, and record again.

    • Disabled JetBrains Mono ligatures so code samples render '->' and '=>' literally. @AlexSkrypnyk (#3003)
      What it does: Turns off font ligatures so arrow operators appear as written.
      How to use it: Cosmetic.

    • Refreshed .vortex dev dependencies for August 2026. @AlexSkrypnyk (#2950, #2832)
      What it does: Refreshes the lock files for the docs, installer and tests subsystems.
      How to use it: Maintainer-facing.

  • 🐞 Fixed

    • [#2875] Quoted the documentation lint and spellcheck globs so every page is checked. @AlexSkrypnyk (#2876)
      What it does: Quotes the globs so the shell does not expand them, restoring coverage of every documentation page.
      How to use it: Maintainer-facing.

    • Fixed 'window.gtag is not a function' in the docs dev server after a build. @AlexSkrypnyk (#3044)
      What it does: Stops the analytics stub erroring in the development server after a production build.
      How to use it: Maintainer-facing.


πŸ“‹ Release checklist

  • Updated all dependencies outside of the schedule (Renovate) - pending: run renovate --schedule= --force-cli=true drevops/vortex manually. No Renovate PRs were open at prep time and the last batch merged 2026-08-29.
  • Updated container images and checked @see links - uselagoon/* all at 26.8.1 (php-cli-drupal, php-fpm, nginx-drupal, solr-9-drupal, commons, mysql-8.4, valkey-8); selenium/standalone-chromium:151.0; drevops/ci-runner:26.8.0 (latest); drevops/docker-wait-for-dependencies:26.6.1 (latest). Solr luceneMatchVersion stays 9.12.3 - the Solr image did not change major this cycle.
  • CI tool images verified and consistent across both providers - hadolint/hadolint:v2.15.1 (also pinned in .vortex/tests/lint.dockerfiles.sh), zavoloklom/dclint:3.1.0, ghcr.io/gitleaks/gitleaks:v8.30.1, rhysd/actionlint:1.7.12. No untagged references.
  • Bumped drevops/mariadb-drupal-data from 26.6.0 to 26.8.1 in .circleci/config.yml - this pin is invisible to Renovate: it is a plain VORTEX_DB_IMAGE_BASE: assignment, matching neither customManagers regex (docker run ... or IMAGE: "${...}"). It had rotted two minors behind and missed the arm64 seeding fix released in 26.7.0.
  • Updated PHP version in composer.json for config.platform - 8.4.23, matches container.
  • Updated PHP version in phpcs.xml for testVersion - 8.4, matches.
  • Updated PHP version in phpstan.neon for phpVersion - 80423, matches the container's PHP_VERSION_ID. Verified directly against uselagoon/php-8.4-cli-drupal:26.8.1.
  • Tagged drevops/vortex-tooling before the Vortex tag - not required for this release. .vortex/tooling/ changed this cycle (80 files, +3881/-1110), but no new tooling tag is being cut, so the requirement stays on the published 1.4.0 tag. The pin is unchanged at ~1.4.0 in the root composer.json require, and 1.4.0 in the root path-repo versions override, scripts/vortex-tooling.sh (VORTEX_DEV bootstrap) and .vortex/tests/phpunit/Traits/SutTrait.php. The tooling changes ship to consumers with the next drevops/vortex-tooling release.
  • Updated minor version of all packages in composer.json (composer update -W) - bumped drevops/behat-steps ^3.14.1β†’^3.14.2 (bump-after-update).
  • Updated theme dependencies - npm, not Yarn (the template switched this cycle). Refreshed both package-lock.json files via npm update; in-range transitive bumps including Jest 30.4.xβ†’30.5.0. 0 vulnerabilities in either tree.
  • drevops/ci-runner version in CI configs - 26.8.0, confirmed latest on Docker Hub.
  • Incremented the CI database cache version - v26.8.0β†’v26.8.1, consistent across .circleci/config.yml, .circleci/vortex-test-common.yml, .github/workflows/build-test-deploy.yml. Tracks the uselagoon/* bump to 26.8.1.
  • Updated documentation (ahoy update-docs) - produced no changes; the generated variables table was already current. It did not revert the cache version bump.
  • Regenerated installer and test snapshots (ahoy update-snapshots) - 152 scenarios, Updated: 0. Expected: fixtures mask container tags, cache versions and dependency versions as __VERSION__.
  • Regenerated demo videos (ahoy update-videos) - not run this cycle. build and lint were last recorded in #3063 and correctly show the npm toolchain; the other seven date from #3056. One is known stale: provision records the old < completion marker, which changed in #3061 after that recording. Requires Docker and ~15-20 minutes.
  • Tagged the Vortex release - pending. No tooling tag is needed first this cycle.
  • Pending deprecations checked - none due. The only two @deprecated markers are in .vortex/installer/src/Prompts/Handlers/HostingProjectName.php (lines 79 and 135) and are open-ended Acquia backward-compatibility shims that name no removal version.
  • Demo database URL - left at the 1.40.0 release asset. It is bumped only when the demo databases are regenerated (last done in #2812), not on every release.

Full Changelog: 1.40.2...1.41.0

@AlexSkrypnyk, @renovate[bot] and renovate[bot]