Version 2026.3.0

Release Notes 2026.3.0

Version 2026.3.0 is the first major release using Calendar Versioning (CalVer). Below is the full summary of changes.

Calendar Versioning (CalVer)

Starting from this version, iSPA CMS adopts the CalVer format: YYYY.MM.PATCH.

  • The VERSION file at the project root is the single source of truth for the system-wide version.
  • Two new artisan commands: cms:version and cms:bump.
  • All 18 modules synchronized to version 2026.03.0 in both module.json and composer.json.
# Display current version
php artisan cms:version

# Output as JSON
php artisan cms:version --json

# Bump patch version
php artisan cms:bump patch

# Dry run (no file writes)
php artisan cms:bump patch --dry-run

Laravel 12 Upgrade

The core framework was upgraded from Laravel 11.48.0 to Laravel 12.55.0.

Dependency Changes

PackageBeforeAfter
laravel/framework11.48.012.55.0
openai-php/laravel0.10.20.19.1
laravel/sanctum^4.0
laravel/telescope^5.0

Bugs Fixed During Upgrade

  • GuuXeCrawler: Deduplicated route names in v5 API group.
  • Education: Deduplicated route names in v5 group.
  • routes/api.php: Removed duplicate ->name('login') from API fallback.

Verification Results

  • Build pipeline: config:cache, route:cache, view:cache, event:cache, pnpm build — all pass.
  • Tests: 188 passed, 110 failed (same baseline as L11, zero regressions).

PostgreSQL Support

This release adds PostgreSQL 16 support alongside MySQL/MariaDB.

Dual Database Architecture

  • MySQL/MariaDB — default for CMS legacy (DB_CONNECTION=mysql).
  • PostgreSQL — for the Game system (GAME_DB_CONNECTION=pgsql).

Docker Configuration

services:
  pgsql:
    image: 'postgres:16'
    profiles:
      - pgsql
    ports:
      - '${FORWARD_PGSQL_PORT:-5432}:5432'

Activate with: COMPOSE_PROFILES=pgsql docker-compose up

18 Modules

The complete modular system includes 18 modules, all synchronized to version 2026.03.0.

Core CMS Modules

ModuleAliasDescription
CorecoreEssential CMS functionalities
ContentcontentArticles, pages, media stories
EcommerceecommerceOrders, carts, payments
EducationeducationStudents, instructors, evaluations
ProductproductCatalog, SKUs, brands
RealEstatereal-estateProperty listings, projects
CmsManagementcmsmanagementDomain management
GuuXeCrawlerguuxescraplingWeb data crawling pipeline

Game Modules

ModuleAliasDescription
GameAdmingameadminGame administration
GameAuthgameauthGame authentication
GameCoregamecoreCore game systems
GameEconomygameeconomyEconomy, wallets, currencies
GameInventorygameinventoryPlayer inventory
GameLeaderboardgameleaderboardLeaderboards
GameLiveOpsgameliveopsLive operations
GameMarketplacegamemarketplaceP2P marketplace
GamePlayergameplayerPlayer profiles
GameRungamerunGame sessions

New Artisan Commands

Versioning

cms:version [--json]              # Display CalVer version
cms:bump {patch|minor|major}      # Bump system-wide version

Core

core:admin-i18n:audit             # Audit admin translation keys
core:agentic:run:schedules        # Run scheduled agent tasks
core:agentic:preflight            # Agent system preflight check
core:agentic:sync:tools           # Sync tool definitions
core:deploy:preflight             # Pre-deployment checks
core:status:scan                  # System health scan

Game

gameadmin:ledger:drift:check      # Ledger drift detection
gameeconomy:reconcile:balances    # Balance reconciliation
gameleaderboard:auto:promote      # Auto-promotion

New API Endpoints

Agentic Subsystem

GET    /v2/admin/agentic/health
GET    /v2/admin/agentic/tool-definitions
GET    /v2/admin/agentic/profiles
GET    /v2/admin/agentic/runs
POST   /v2/admin/agentic/runs/{run}/stop
POST   /v2/admin/agentic/approvals/{approval}/approve
GET    /v2/admin/agentic/schedules
POST   /v2/admin/agentic/schedules

Account Security (MFA)

POST   /v2/admin/account/mfa/authenticator/start
POST   /v2/admin/account/mfa/authenticator/confirm
DELETE /v2/admin/account/mfa/authenticator
POST   /v2/admin/account/mfa/recovery-codes/regenerate
GET    /v2/admin/account/activities

Admin UI: Settings Hub Restructuring

The settings module was restructured from a flat list to a categorized hub layout.

What Changed

  • Settings entry point is now a hub landing page with a category grid.
  • Each category (General, Content, Server, etc.) opens in a dedicated sidebar layout.
  • Old flat URLs (e.g., /setting/basic) redirect to new nested paths (e.g., /setting/general/basic).

New Components

ComponentPurpose
setting-hub.vueHub landing page with category grid
setting-category-layout.vueCategory sidebar wrapper

URL migration

All legacy /setting/* routes have backwards-compatible redirects. Bookmarks and integrations using old URLs will continue to work.

Admin UI: CMS Management Module

A complete CMS Management admin module was added with 12 pages covering domain, customer, and payment management.

Pages

  • Dashboard — domain stats, upcoming expiries, recent registrations.
  • Domains — list (with filters and bulk actions), create, and detail page (tabs: info, payments, activity, reminders).
  • Customers — list, create (with contact CRUD), and detail page (tabs: info, contacts, domains).
  • Payments — list with verify action for pending manual payments.
  • Reminders — list with send-now action.
  • Activity Logs — global log viewer with date range filtering.
  • Settings — pricing, reminders, Stripe config, notification channels.

See the CMS Management guide for details.

Admin UI: Active Modules

Navigation now dynamically filters based on which modules are active on the backend.

  • A new useActiveModules composable fetches the active module list from /modules and caches it in localStorage.
  • Navigation items annotated with a module field are hidden when the corresponding module is inactive.
  • Module lookup is case-insensitive with O(1) performance.

See the Active Modules developer guide for details.

Admin UI: i18n Namespace Migration

All i18n keys were migrated to canonical namespaces. Legacy single-letter aliases have been removed.

Old PrefixNew PrefixExample
n.*nav.*n.a.subjectnav.a.subject
e.*enum.*e.dateenum.date
t.*text.*t.page_titletext.page_title

The backwards-compatibility alias layer (applyLegacyAliases) has been removed. All new code must use canonical namespaces.

See the i18n Migration developer guide for details.

Admin UI: UUID Routing

Entity routes now use uuid instead of numeric id for user, post, product, and customer pages.

EntityOld ParamNew Param
User:id:uuid
Post:id:uuid
Product:id:uuid
Customer:id:uuid
Order:id:order_code

Breaking change

Any custom links or integrations using numeric :id parameters must be updated to use :uuid (or :order_code for orders).

Admin UI: Dependency Optimization

  • Lodash migrated from CJS lodash to ESM lodash-es across 47 files (~90 KB bundle savings).
  • ESLint: Removed @babel/eslint-parser and eslint-plugin-jsx-a11y (197 transitive packages pruned).
  • Environment: Hardcoded production URL replaced with VITE_CMS_API_URL env variable.
  • Console cleanup: Debug console.log() statements removed; error/warning cases converted to console.error()/console.warn().

DocBlock Documentation

All 1,405 PHP files now have 100% coverage:

  • Class-level docblocks: 100% (1,405/1,405)
  • Method-level docblocks: 100% (3,694/3,694)
  • @param/@return completeness: 100%
  • @see cross-references: 1,109 tags validated
  • @package PSR-4 compliance: 100%
  • Language: 100% English (39 Vietnamese comments translated)