All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
1.6.7 - 2026-08-26
- REQ-UI-001:
CssFramework/IconSetPHP enums for config validation; CDN assets extracted to_framework_assets.css.twig/_framework_assets.js.twig; optional layout bridge@NowoWorkflowBundle/layout_integrate_base.html.twig.
- Demo layout uses semantic
nowo-ui-*hooks and loads framework CSS/JS via the extracted partials (Bootstrap 4 keeps its own CDN). - Docs: CONTRIBUTING notes phpstan-frankenphp as maintainer-only (REQ-CS-005).
- No API or configuration changes for integrators unless noted above.
1.6.6 - 2026-08-24
- QA: add
phpstan-frankenphpextension (REQ-CS-005). - Docs: PHP-FIG PSR evaluation (REQ-CS-007).
- No API or configuration changes for integrators unless noted above.
- Flex recipe: ship
security_nowo_workflow.yamlaccess rules (REQ-SEC-004). Prefer^1.6.5overv1.6.4.
- Flex recipe:
security.access_controlfor workflow routes (REQ-SEC-004).
1.6.3 - 2026-08-19
- CI: run
composer audit --lockedafter dependency install (REQ-SEC / P3).
1.6.2 - 2026-08-18
- Demos: pin
nowo-tech/hot-reload-bundleto^1.4with FrankenPHP Mercure/hot_reload(dev/testonly).
1.6.1 - 2026-08-07
- CI / Composer: regenerate
composer.lockcontent-hash after the v1.6.0composer.jsonchanges (FormKit, UiKit, Twig Extra, Twig-CS-Fixer).composer validate --stricton the default branch is green again (REQ-CI-003).
- Cover
prependFormKitDefaults/prependUiKitDefaults(seed, host override, non-array UiKit config bags) so line coverage stays at 100%.
1.6.0 - 2026-08-04
- FormKitBundle: depend on
nowo-tech/form-kit-bundle^2.0. Admin form types useFormOptionsTrait+ profileworkflow(#[FormKitConfig]). Extension prepends that profile when missing; form types are taggedform.typesoFormOptionsMergeris injected.
- REQ-TWIG-004: require
twig/extra-bundle+twig/string-extra;make check-twig-extrainrelease-check; demos registerTwigExtraBundle. - Twig-CS-Fixer:
vincentlanglet/twig-cs-fixer,.twig-cs-fixer.php,composer twig:lint/twig:fix.
- REQ-UI-001-kit: Import
@NowoUiKitBundle/macros/ui.html.twig; removed local_ui_macros.html.twig. Requiresnowo-tech/ui-kit-bundle^1.4. Extension seedsnowo_ui_kitfromui.css_framework/icon_setwhen the host has not configured UiKit.
make coverage-check(100% clover gate) andscripts/check-coverage.php(REQ-TEST-006).docs/SECURITY.md12.4.1 row for REQ-SEC-004 Pass (conditional).
release-checkno longer runscs-fix; usescoverage-check.- PHPStan:
ignoreErrors: [](REQ-CS-006); Form paths excluded for generics noise. - Packagist homepage + keywords (
php,frankenphp,symfony-bundle). - Root
docker-compose.ymlfixed IPAM subnet (Docker address-pool exhaustion on dense hosts). SchemaSyncService::listExistingSequenceNamesmaps DoctrineSequenceobjects only (DBAL 4).
- REQ-MAKE-003: demo aggregate Makefile aliases
up/down/update-bundle - REQ-REL-003:
make check-open-prs(included inrelease-check) - REQ-DEMO-001: Symfony DebugBundle in the FrankenPHP demo (
require-dev) - Demo
release-verifyHTTP smoke (boot → HTTP 2xx/3xx → down)
- RELEASE.md: open-PR gate and demo smoke in the pre-release pipeline
- UPGRADING.md: notes for 1.5.1
- Web UI private by default (REQ-UI-002): the CRUD UI is no longer open by default. Without
symfony/security-bundle, container compilation fails unless you setnowo_workflow.security.allow_unauthenticated: true(local demos/tests only) or providesecurity.access_checker. With SecurityBundle,RoleBasedWorkflowUiAccessCheckeris auto-wired fromsecurity.access_roles(defaultROLE_ADMIN). - Empty
security.access_roles/ui.required_rolesnow means no bundle-level role check (previously denied all access).
ui.layout_template,ui.css_framework,ui.icon_set(REQ-UI-001) with Twig globals and multi-framework_ui_macros.html.twigui.list_page_size(default20) pagination for dashboard and definition index (?page=); list queries eager-load associations (REQ-PERF-001)- Root
securityconfig:access_roles,access_checker,allow_unauthenticated WorkflowUiSecurityPasscompile-time SecurityBundle guard@NowoWorkflowBundle/base.html.twigpage shell with{{ parent() }}asset stacking and stablenowo_ui_*blocks- Semantic
nowo-ui-*CSS hooks on admin markup - FrankenPHP PHPStan rules (
nowo-tech/phpstan-frankenphp) and README worker-mode banner (REQ-CS-005 / REQ-DOCS-017) .scrutinizer.yml(REQ-CI-002)make demo-smoke,make down-dev; demosetup/verifytargets
- Pages extend configurable layout via
base.html.twiginstead of hard-coding the demo layout alone - Flex recipe documents security defaults; Symfony 8 demo sets
allow_unauthenticated: true - README: Documentation link order (REQ-DOCS-002); Symfony badge
7.4 | 8.0 | 8.1+ - PHPUnit / CI:
SYMFONY_DEPRECATIONS_HELPER=max[direct]=0(REQ-SF-005) - Spec Kit baseline + code inventory updated for UI/security/pagination
- Demo FrankenPHP entrypoint extracted to
demo/symfony8/docker/entrypoint.sh; runtime mode selected viaFRANKENPHP_MODE(classic|worker, defaultworker) - PHP-CS-Fixer:
fully_qualified_strict_types.import_symbolsenabled (FQCN →useimports) - GitHub Actions:
actions/checkoutv6 → v7 - Lockfile synced (
doctrine/dbal,doctrine/doctrine-bundle)
- REQ-GIT-001 verification uses
git --no-replace-objectsso localgit replacerefs cannot hide Cursor co-author trailers from CI - History rewrite script refuses a dirty working tree before rewriting
- REQ-GITIGNORE-002: ignore
.php-cs-fixer.cacheas a file (stop tracking the cache)
- GITHUB_CI.md: expanded REQ-GIT-001 operator guide (scope, why CI enforces it, replace-refs pitfall)
- DEMO-FRANKENPHP.md: document
FRANKENPHP_MODEand standalone entrypoint
- Renamed CI requirements doc
docs/GITLAB_CI.md→docs/GITHUB_CI.mdand aligned content with GitHub Actions (REQ-GIT-001)
- GITHUB_CI.md: GitHub Actions CI requirements for REQ-GIT-001
- README.md, CONTRIBUTING.md: updated links to
GITHUB_CI.md
- Contributor Covenant Code of Conduct (
CODE_OF_CONDUCT.md) - REQ-GIT-001: verification script, history cleanup script, and
commit-msghook to block CursorCo-authored-bytrailers - CI job
git-hygieneenforcing REQ-GIT-001 on push and pull requests - Makefile targets
check-no-cursor-coauthorandstrip-cursor-coauthor-from-history;release-checknow includes co-author verification
- GitHub Actions:
actions/cachev5 → v6 - Dev lockfiles synced (
friendsofphp/php-cs-fixer,rector/rector)
- CI requirements doc for REQ-GIT-001 (shipped as
GITLAB_CI.md; renamed toGITHUB_CI.mdin 1.4.2) - CONTRIBUTING.md: Code of Conduct reference and git hooks workflow
- RELEASE.md: post-tag co-author check reminder before push
- README.md: links to Code of Conduct and CI requirements
.gitignore: ignore.cursor/sandbox.json(machine-specific local file)
- GitHub Spec Kit integration (
.specify/, Cursor Agent skills in.cursor/skills/speckit-*) - Baseline specification and code inventory under
specs/001-baseline/(100% coverage of production code insrc/) - SPEC-KIT.md — operator manual for Spec Kit install, initialization, and maintainer workflow
- SPEC-DRIVEN-DEVELOPMENT.md: three-layer SDD model (Spec Kit baseline, product behavior,
REQ-*traceability) and contributor workflow - README.md: link to Spec Kit documentation
- Integration tests on PHP 8.4+: enable Doctrine native lazy objects in
IntegrationEntityManagerFactory
RoleBasedWorkflowUiAccessChecker— built-inWorkflowUiAccessCheckerInterfaceusing SymfonyAuthorizationCheckerInterface(grant if the user has any configured role)- Translation catalogs for German (
de), Dutch (nl), and Portuguese (pt) - Configuration key
ui.required_roles(defaultROLE_ADMIN) — documents expected roles for Flex/recipe wiring - Flex recipe snippet
config/services/nowo_workflow_security.yaml(commented) to alias the role-based checker whensymfony/security-bundleis installed
- French UI translations refined (labels for workflow type, transitions, and form fields)
- Demo
symfony8Makefile: defineCOMPOSEandSERVICE_PHPsomake update-depsresolves the correct Docker Compose service
- CONFIGURATION.md:
ui.required_rolesand shipped locale catalogs - SECURITY.md: built-in
RoleBasedWorkflowUiAccessCheckerand Flex recipe wiring - UPGRADING.md: notes for upgrading to 1.3.0
- PHP minimum raised to 8.2 (was 8.1)
- Symfony support narrowed to 7.x and 8.x (Symfony 6.4 removed)
doctrine/doctrine-bundleconstraint updated to^2.13 || ^3.2.4(3.2.4+required for Symfony 8; needs PHP 8.4+)
- CI matrix: Symfony 8 jobs use
doctrine-bundle^3.2.4 and--devfor test-only Symfony packages - CI excludes Symfony 8 on PHP 8.2/8.3 (Doctrine Bundle 3.2.4 requires PHP 8.4+)
- README.md, UPGRADING.md, CONTRIBUTING.md: updated compatibility matrix
- Configurable
table_prefixfor Doctrine table and constraint names (defaultworkflow_) WorkflowUiAccessCheckerInterfaceandAllowAllWorkflowUiAccessCheckerto protect the CRUD UI without Symfonyaccess_control(open access when no custom checker is registered)WorkflowRegistryInterfaceas extension point for workflow resolution (DatabaseWorkflowRegistryimplements it)SchemaSyncService::executeStatements()for idempotent schema SQL execution with duplicate-object tolerance- Integration tests for schema sync and the workflow definition repository
- Unit test suite expanded to ~100% PHP coverage
WorkflowApplicatornow type-hintsWorkflowRegistryInterfaceinstead ofDatabaseWorkflowRegistry- Translation catalog files renamed to
NowoWorkflowBundle.<locale>.yaml(translation domain unchanged)
- SECURITY.md: CRUD UI protection guide with
WorkflowUiAccessCheckerInterface - CONFIGURATION.md:
table_prefixand UI locale options - UPGRADING.md: notes for upgrading to 1.1.0
Initial stable release.
- Database-driven Symfony Workflow definitions with CRUD UI
WorkflowResolver,WorkflowApplicator, andDatabaseWorkflowRegistry- Match rules with multi-parameter resolution
- Demo application (Symfony 8, FrankenPHP, PostgreSQL)
- Flex recipe under
.symfony/recipe/nowo-tech/workflow-bundle/ - Twig override support (
@NowoWorkflowBundle/...) and translation domainNowoWorkflowBundle
- Full Nowo bundle standards alignment (Docker, CI, security, spec-driven docs)