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-dateattributes (ISOYYYY-MM-DD) for per-picker date ranges. Filter pickers initialize per element so each input's owndata-*attributes are honored. #1576 (@austinjb32)
🐛 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#performnow has a top-levelrescue StandardErrorthat marks the import asfailed, setscompleted_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_itemspayload now uses the same array-of-arrays structure produced byrun_importer, so failed imports report invalid rows consistently with successful importer output. #1621 (@Mahaveer1141)
✨ Improvements
- ♻️ Simpler CSV encoding and delimiter detection — Dynamic
csv_encodingdetection was replaced with aBaseImporter::CSV_ENCODINGconstant plus anormalize_to_utf8helper, 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 StandardErroris intentionally broad; ifAirbrake.notifyitself 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.mdand refresheddocs-site/static/releases.jsonso 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.jsonregistry records the version, date, and whether a release carries breaking changes or migrations, so downstream tooling can surface upgrade warnings programmatically. #1580 (@austinjb32) - 🌐
releases.jsonserved 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/mainand retries up to 5 times with a 5s backoff. Previously a singlegit push origin maindied whenevermainadvanced between checkout and push, so the September 2026 page andreleases.jsonnever 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/Changelogwithout 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 bothv8.0.9and8.0.9so re-runs can't create duplicate entries. #1615 (@austinjb32) - 🌐
docs_urlnow points at the live domain — registry and Slack links now usedocs.cm-admin.commutatus.com; the previously usedcm-admin-docs.commutatus.comhas 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.jsonregistry 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_formatextracted into a dedicated method in the release-notes generator for readability. #1580 (@austinjb32) - 📐 JSON schema moved into OpenRouter's
response_formatand the prompt template relocated to.github/prompts/prompt_template.txt. #1580 (@austinjb32) - 📏
max_tokensincreased 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/scriptsand 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_mdcleaned up — dry runs no longer create tags or push commits tomain. #1580 (@austinjb32) - 🔧
workflow_dispatchandpr_numbertest inputs removed from the changelog workflow now that the pipeline is stable. #1580 (@austinjb32) - 🗑️ Obsolete
notify_slack_release.shscript removed — superseded bynotify_slack_release.rb. #1580 (@austinjb32)
⚠️ Breaking Changes
None in this release. ✅
📚 Documentation
- 📘
ReleaseChangelog.mdexamples updated to match the new registry format and live domain — the samplereleases.jsonentry now shows"version": "7.2.26"(no leadingv) 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 stablerelease-cm-gem.ymlworkflow (trigger,bump_typeinput, build/release/changelog job graph, required secrets and variables) and the betarelease-beta-gem.ymlworkflow, including how beta version numbers are derived from existingv<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 reusablechangelog-release.ymlworkflow 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, andnotify_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)
sidebar_position: 202609
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.jsonregistry records the version, date, and whether a release carries breaking changes or migrations, so downstream tooling can surface upgrade warnings programmatically. #1580 (@austinjb32) - 🌐
releases.jsonserved 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.jsrenders submit errors using the standardalert-bannerstructure instead of ad-hocd-flexmarkup, 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 viatextContentrather than interpolated intoinnerHTML, closing an XSS vector whenever a server error message reflects user input.errorContaineris also null-guarded on both the submit and error paths, removing a latentTypeErrorwhen the container is absent. New spacing styles forul,p, andliinside.alert-banner-textkeep 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_tokensincreased 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_mdcleaned up — dry runs no longer create tags or push commits tomain. #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-secondaryrule 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 solidbtn-secondaryinstead of the cm-admin design-system outline style, which happened because the export modal renders outside the.cm-adminwrapper and never picked up.cm-admin .btn-secondary. The export modal's class list was simplified frombtn btn-secondarytobtn-secondary. #1613 (@BrijeshSajeev) - 🧩
response_formatextracted 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_dispatchandpr_numbertest inputs removed from the changelog workflow now that the pipeline is stable. #1580 (@austinjb32) - 📦 Inline workflow scripts extracted out of YAML into
.github/scriptsand then relocated to.github/lib, making the workflows far easier to read and maintain. #1580 (@austinjb32) - 📐 JSON schema moved into OpenRouter's
response_formatand the prompt template relocated to.github/prompts/prompt_template.txt. #1580 (@austinjb32) - 💅 Hash shorthand used for
response_formatand a redundant comment dropped. #1580 (@austinjb32) - 🗑️ Obsolete
notify_slack_release.shscript removed — superseded bynotify_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 stablerelease-cm-gem.ymlworkflow (trigger,bump_typeinput, build/release/changelog job graph, required secrets and variables) and the betarelease-beta-gem.ymlworkflow, including how beta version numbers are derived from existingv<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 reusablechangelog-release.ymlworkflow 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, andnotify_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)