Skip to main content

2026-09

v8.0.12 (2026-09-25)​

Catalyst v8.0.12

Release date: 2026-09-26

✅ No breaking changes and no database migrations or rake tasks are required for this release — it is a drop-in upgrade from v8.0.11.

🚀 Features​

  • ✨ Year-select dropdown for all Flatpickr date pickers — Every Flatpickr date picker across the admin panel now includes a year-select dropdown, letting users jump straight to a specific year instead of clicking through months one at a time. The dropdown is opt-out per field (e.g. birth dates that need free-form year entry can keep Flatpickr's native year navigation), and inputs support optional data-min-date / data-max-date attributes (ISO YYYY-MM-DD) for per-picker date ranges. Filter pickers initialize per element so each input's own data-* attributes are honored. #1576 (@austinjb32)

    Year-select dropdown open in a Catalyst date picker

    Year-select dropdown shown across multiple date pickers

🐛 Bug Fixes​

  • 🐛 CSV imports no longer fail on non-UTF-8 files — Imported CSVs that arrive in other encodings (e.g. Windows-1252) or contain BOM characters previously caused header and delimiter parsing errors. Incoming CSV content is now normalized to clean UTF-8 and BOM characters are stripped before parsing. #1621 (@Mahaveer1141)
  • 🐛 Failed imports no longer get stuck in in_progress — FileImportProcessorJob#perform now has a top-level rescue StandardError that marks the import as failed, sets completed_at, and notifies Airbrake, so unhandled exceptions no longer leave file imports hanging indefinitely. #1621 (@Mahaveer1141)
  • 🐛 Import error reporting format aligned — The rescue block's invalid_row_items payload now uses the same array-of-arrays structure produced by run_importer, so failed imports report invalid rows consistently with successful importer output. #1621 (@Mahaveer1141)

✨ Improvements​

  • ♻️ Simpler CSV encoding and delimiter detection — Dynamic csv_encoding detection was replaced with a BaseImporter::CSV_ENCODING constant plus a normalize_to_utf8 helper, and files are always read as UTF-8. This removes a source of parsing ambiguity and makes import behavior predictable. #1621 (@Mahaveer1141)
  • 🛡️ Broader failure visibility for imports — Unexpected failures during import processing and the completion-email step are now caught and surfaced through Airbrake. Note: the rescue StandardError is intentionally broad; if Airbrake.notify itself raises, the status update may be skipped. #1621 (@Mahaveer1141)

📚 Documentation​

  • 📚 Changelog updated for v8.0.11 — Added the v8.0.11 entry (including the Flatpickr year-select work from #1576 (@austinjb32)) to docs-site/docs/Changelog/2026-09.md and refreshed docs-site/static/releases.json so the docs site and release feed stay in sync. (52dacecd3)

v8.0.11 (2026-09-25)​

  • Merge pull request #1576 from commutatus/CT-317 (d94eeb984)

  • refactor(flatpickr): use date-fns for year bounds and px padding (079a66630)

  • fix(flatpickr): pass filter elements to yearSelectOptions for per-element data attributes (91a8ba034)

  • Merge branch 'main' of github.com:commutatus/cm-admin into CT-317 (9c2934114)

  • refactor(flatpickr): normalise data-min-date/data-max-date to dates (0b1fc4106)

  • fix(demo-forms): use a dedicated renewal_date column for the default year selector demo (7e41ae8b0)

  • fix(flatpickr): restore native year input for default year selector pickers (55a911cd4)

  • feat(flatpickr): add option to use default year selector via data attribute (78bf270de)

  • fix(flatpickr): add max-height to year-select dropdown (e0cf23814)

  • refactor(flatpickr): restore minDate/maxDate defaults with data-attribute overrides (e8f7ac59c)

  • fix(flatpickr): improve year-select plugin integration robustness (0698a056f)

v8.0.10 (2026-09-24)​

Catalyst v8.0.10

Release date: 2026-10-01
Gem: cm_admin v8.0.10
Compare: v8.0.9...v8.0.10

✅ No breaking changes. No migrations required. This release is a safe drop-in upgrade — no rake tasks, no database migrations, and no API changes to run. The bulk of the work hardens the release-automation pipeline so generated changelogs reliably reach main.


🚀 Features​

  • 🤖 AI-powered changelog generation and Slack notifications for releases — every gem release now automatically assembles release notes from CHANGELOG.md, the git log, merged PR bodies, and the docs diff via the OpenRouter API, publishes them to a monthly Docusaurus changelog page, and posts a rich Block Kit summary to Slack. No manual changelog writing required. #1580 (@austinjb32)
  • 🔗 PR links and embedded media in generated release notes — each generated change entry now links back to its source PR, and GitHub attachment URLs found in PR bodies are preserved and embedded as inline images rather than being dropped. #1580 (@austinjb32)
  • 📊 Release registry with breaking-change and migration tracking — a new releases.json registry records the version, date, and whether a release carries breaking changes or migrations, so downstream tooling can surface upgrade warnings programmatically. #1580 (@austinjb32)
  • 🌐 releases.json served as a static file via Docusaurus — the registry ships with the docs site and is available at a stable public URL. #1580 (@austinjb32)
  • ⚠️ Warning badges and migration commands in generated release notes — release notes now open with a prominent Breaking Changes / Migration Required badge and include the exact rake or migration commands to run when one applies. #1580 (@austinjb32)

🐛 Bug Fixes​

  • 🔁 Changelog commits no longer silently dropped on non-fast-forward push rejections — the docs push step now rebases on origin/main and retries up to 5 times with a 5s backoff. Previously a single git push origin main died whenever main advanced between checkout and push, so the September 2026 page and releases.json never landed on main. #1615 (@austinjb32)
  • ♻️ Docs-page updates are now idempotent — job re-runs no longer duplicate a version's release section, and legacy ./<month> index links are migrated in place so re-runs can't insert duplicate entries. #1615 (@austinjb32)
  • 🔗 Changelog index links corrected to ./Changelog/<month> — the previous relative links (./2026-09) resolved to /docs/2026-09, a missing page, because the index is served at /docs/Changelog without a trailing slash. #1615 (@austinjb32)
  • 🏷️ Release registry versions stored without the leading v — versions are now stored in a numerically comparable format, and dedup handles both v8.0.9 and 8.0.9 so re-runs can't create duplicate entries. #1615 (@austinjb32)
  • 🌐 docs_url now points at the live domain — registry and Slack links now use docs.cm-admin.commutatus.com; the previously used cm-admin-docs.commutatus.com has no DNS records and would 404 for users. #1615 (@austinjb32)

✨ Improvements​

  • 📦 Pipeline-generated v8.0.9 artifacts added — the September 2026 release-notes page and its releases.json registry entry are now committed, backfilling the release that the broken push step had dropped. #1615 (@austinjb32)
  • 🪶 Release registry simplified to track only version, date, breaking-change/migration flags, and docs URL, dropping redundant metadata. #1580 (@austinjb32)
  • 🧩 response_format extracted into a dedicated method in the release-notes generator for readability. #1580 (@austinjb32)
  • 📐 JSON schema moved into OpenRouter's response_format and the prompt template relocated to .github/prompts/prompt_template.txt. #1580 (@austinjb32)
  • 📏 max_tokens increased to 4000 to prevent JSON truncation — the model response was occasionally cut off mid-JSON, which caused changelog generation to silently fall back to raw git-log output. #1580 (@austinjb32)
  • 📦 Inline workflow scripts extracted out of YAML into .github/scripts and then relocated to .github/lib, making the workflows far easier to read and maintain. #1580 (@austinjb32)
  • 🧪 Release creation and push skipped during test runs; escape_md cleaned up — dry runs no longer create tags or push commits to main. #1580 (@austinjb32)
  • 🔧 workflow_dispatch and pr_number test inputs removed from the changelog workflow now that the pipeline is stable. #1580 (@austinjb32)
  • 🗑️ Obsolete notify_slack_release.sh script removed — superseded by notify_slack_release.rb. #1580 (@austinjb32)

⚠️ Breaking Changes​

None in this release. ✅

📚 Documentation​

  • 📘 ReleaseChangelog.md examples updated to match the new registry format and live domain — the sample releases.json entry now shows "version": "7.2.26" (no leading v) and "docs_url": "https://docs.cm-admin.commutatus.com/docs/Changelog/2026-09", so anyone following the docs copies a working configuration. #1615 (@austinjb32)
  • 📑 Changelog index link corrected in docs-site/docs/Changelog/index.md — the September 2026 entry now points at ./Changelog/2026-09, matching the served URL structure. #1615 (@austinjb32)
  • 🗓️ September 2026 release-notes page published (docs-site/docs/Changelog/2026-09.md) — documents the v8.0.9 release, including its feature, bug-fix, and improvement sections. #1615 (@austinjb32)
  • 🚀 "Releasing the Gem" (docs-site/docs/4. Deployment/ReleaseGem.md) — covers the stable release-cm-gem.yml workflow (trigger, bump_type input, build/release/changelog job graph, required secrets and variables) and the beta release-beta-gem.yml workflow, including how beta version numbers are derived from existing v<base>.beta* tags. Also notes that beta releases are pre-releases and do not trigger the changelog workflow. #1580 (@austinjb32)
  • 🤖 "Release Changelog & Notifications" (docs-site/docs/4. Deployment/ReleaseChangelog.md) — documents the reusable changelog-release.yml workflow and each of its components: collect_context.sh, generate_release_notes.rb (including the JSON response shape and fallback behaviour when OpenRouter is unavailable), update_docs_page.sh, update_release_registry.rb, and notify_slack_release.rb. Also documents the prompt template location and how to tune generated note structure and tone. #1580 (@austinjb32)
  • 📑 Changelog section index (docs-site/docs/Changelog/index.md) — a landing page for the Changelog docs section listing recent months, with each monthly page (<YYYY-MM>.md) holding that month's AI-generated release notes. #1580 (@austinjb32)

Release Notes — September 2026

v8.0.9 (2026-09-24)​

Catalyst v8.0.9

Release date: September 24, 2026
Gem: cm_admin v8.0.9
Compare: v8.0.8...v8.0.9

✅ No breaking changes. No migrations required. This release is a safe drop-in upgrade — no rake tasks, no database migrations, and no API changes to run. The bulk of the work is release-automation tooling plus two UI fixes.


🚀 Features​

  • 🤖 AI-powered changelog generation and Slack notifications for releases — every gem release now automatically assembles release notes from CHANGELOG.md, the git log, merged PR bodies, and the docs diff via the OpenRouter API, publishes them to a monthly Docusaurus changelog page, and posts a rich Block Kit summary to Slack. No manual changelog writing required. #1580 (@austinjb32)
  • 🔗 PR links and embedded media in generated release notes — each generated change entry now links back to its source PR, and GitHub attachment URLs found in PR bodies are preserved and embedded as inline images rather than being dropped. #1580 (@austinjb32)
  • 📊 Release registry with breaking-change and migration tracking — a new releases.json registry records the version, date, and whether a release carries breaking changes or migrations, so downstream tooling can surface upgrade warnings programmatically. #1580 (@austinjb32)
  • 🌐 releases.json served as a static file via Docusaurus — the registry ships with the docs site and is available at a stable public URL. #1580 (@austinjb32)
  • ⚠️ Warning badges and migration commands in generated release notes — release notes now open with a prominent Breaking Changes / Migration Required badge and include the exact rake or migration commands to run when one applies. #1580 (@austinjb32)

🐛 Bug Fixes​

  • 🔒 Custom form modal errors now render in shared alert banner markup, safely — custom_form_submit_controller.js renders submit errors using the standard alert-banner structure instead of ad-hoc d-flex markup, so modal errors match the alert styling used elsewhere in cm-admin (_alert_banner.html.slim, _default_import_notes.html.slim). The server-provided message is now assigned via textContent rather than interpolated into innerHTML, closing an XSS vector whenever a server error message reflects user input. errorContainer is also null-guarded on both the submit and error paths, removing a latent TypeError when the container is absent. New spacing styles for ul, p, and li inside .alert-banner-text keep list-based alert content readable. #1614 (@BrijeshSajeev)
  • 🏷️ Catalyst branding in release notes and Slack notifications — generated notes and Slack messages no longer leak internal project naming. #1580 (@austinjb32)
  • 📏 max_tokens increased to 4000 to prevent JSON truncation — the model response was occasionally cut off mid-JSON, which caused changelog generation to silently fall back to raw git-log output. #1580 (@austinjb32)
  • 🧪 Release creation and push skipped during test runs; escape_md cleaned up — dry runs no longer create tags or push commits to main. #1580 (@austinjb32)
  • 🧹 Code review findings on the release automation addressed — follow-up fixes from review of the changelog pipeline. #1580 (@austinjb32)

✨ Improvements​

  • 🎨 Export modal secondary button styling moved to SCSS @extend — the modal footer now carries a [type="button"], .btn-secondary rule extending .btn, .btn-outline-dark, .btn-sm, .btn-icon-spacing, mirroring the existing primary-action rule. This fixes the export modal's Close button rendering as Bootstrap's solid btn-secondary instead of the cm-admin design-system outline style, which happened because the export modal renders outside the .cm-admin wrapper and never picked up .cm-admin .btn-secondary. The export modal's class list was simplified from btn btn-secondary to btn-secondary. #1613 (@BrijeshSajeev)
  • 🧩 response_format extracted into a dedicated method in the release-notes generator for readability. #1580 (@austinjb32)
  • 🪶 Release registry simplified to track only version, date, breaking-change/migration flags, and docs URL, dropping redundant metadata. #1580 (@austinjb32)
  • 🔧 workflow_dispatch and pr_number test inputs removed from the changelog workflow now that the pipeline is stable. #1580 (@austinjb32)
  • 📦 Inline workflow scripts extracted out of YAML into .github/scripts and then relocated to .github/lib, making the workflows far easier to read and maintain. #1580 (@austinjb32)
  • 📐 JSON schema moved into OpenRouter's response_format and the prompt template relocated to .github/prompts/prompt_template.txt. #1580 (@austinjb32)
  • 💅 Hash shorthand used for response_format and a redundant comment dropped. #1580 (@austinjb32)
  • 🗑️ Obsolete notify_slack_release.sh script removed — superseded by notify_slack_release.rb. #1580 (@austinjb32)

⚠️ Breaking Changes​

None in this release. ✅

📚 Documentation​

Three new pages were added to the docs site (182 insertions across 3 files), documenting the release pipeline end to end:

  • 🚀 "Releasing the Gem" (docs-site/docs/4. Deployment/ReleaseGem.md) — covers the stable release-cm-gem.yml workflow (trigger, bump_type input, build/release/changelog job graph, required secrets and variables) and the beta release-beta-gem.yml workflow, including how beta version numbers are derived from existing v<base>.beta* tags. Also notes that beta releases are pre-releases and do not trigger the changelog workflow. #1580 (@austinjb32)
  • 🤖 "Release Changelog & Notifications" (docs-site/docs/4. Deployment/ReleaseChangelog.md) — documents the reusable changelog-release.yml workflow and each of its components: collect_context.sh, generate_release_notes.rb (including the JSON response shape and fallback behaviour when OpenRouter is unavailable), update_docs_page.sh, update_release_registry.rb, and notify_slack_release.rb. Also documents the prompt template location and how to tune generated note structure and tone. #1580 (@austinjb32)
  • 📑 Changelog section index (docs-site/docs/Changelog/index.md) — a new landing page for the Changelog docs section listing recent months, with each monthly page (<YYYY-MM>.md) holding that month's AI-generated release notes. #1580 (@austinjb32)