This matrix defines where evo-ui behavior is tested.
Rule of thumb:
- generic UI/runtime behavior is tested in the
evo-uipackage; - module-specific business behavior is tested in the consumer module;
- smoke checks prove real manager integration after package and consumer tests pass.
Run from the evo-ui package root:
composer testRun PHP syntax checks before release or when PHP files changed:
find src config lang tests -name '*.php' -print0 | xargs -0 -n1 php -lRun the consumer drift report when changing shared UI contracts:
composer driftRun the four-module release gate before releasing evo-ui, sSeo, sLang or
sSettings:
composer release-gateUse strict mode only after known consumer drift has been cleaned or explicitly allowlisted:
php tests/consumer-drift.php --strictPackage tests should cover:
- composer identity and package type;
- service provider registration;
- Blade namespace and Livewire component registration;
- manager shell and asset markers;
- theme list and design tokens;
- no legacy manager asset leakage in evo-ui-owned screens;
- module table config/rendering contracts;
- form and field contracts;
- issue workspace provider/UI contracts;
- CSS token and JavaScript public API markers;
- existence of consumer CSS/JS drift guard tooling.
Consumer modules test their own configuration, providers and business behavior.
Exact commands may differ per local demo checkout; release tasks should keep the
current commands in docs/en/guide/release-checklist.md.
Consumer-owned scope:
- table presets and article provider hooks;
- settings form and article type config-map;
- article modal config;
- builder block schema;
- relation options;
- publish, duplicate and delete semantics;
- sSeo and sLang integration boundaries.
Generic rendering, modal shell, choices, editor sync and file picker behavior
must still be covered by evo-ui package tests.
Consumer-owned scope:
- workflow schema and migrations;
- local issue providers;
- taxonomy persistence;
- board workflow rules;
- comments, transition history and assignment persistence;
- external provider settings and sync boundaries.
Generic workspace rendering, filters, state, drag/drop contract and issue UI
markers belong in evo-ui package tests.
Known local unit command shape:
cd /Users/dmi3yy/PhpstormProjects/Extras/sArticles/demo/core
./vendor/bin/phpunit /Users/dmi3yy/PhpstormProjects/Extras/dIssues/tests/UnitConsumer-owned scope:
- dictionary persistence;
- dynamic language columns;
- settings choices;
- translation sync/runtime rules;
- legacy-compatible resource tab boundary.
Generic inline editing and table mechanics belong in evo-ui.
Consumer-owned scope:
- redirects provider behavior;
- settings and analytics config;
- server protocol custom field;
- robots/meta template persistence;
- resource SEO save path;
- legacy route compatibility.
Generic form/table/custom-field rendering belongs in evo-ui.
Use smoke checks when a task touches runtime UI or release readiness.
| Surface | Owner | Expected proof |
|---|---|---|
Module shell loads with data-evo-ui-root |
evo-ui + consumer | browser/manual note or smoke script |
| No legacy assets in evo-ui screen | evo-ui | package marker test plus browser source check |
| Tab dirty-state prompt | evo-ui + consumer panel | browser/manual note |
| Table/list state survives refresh | evo-ui | package state test plus manager smoke |
| Modal create/edit/delete | evo-ui + consumer provider | focused consumer smoke |
| Rich editor sync | evo-ui + consumer editor setting | browser/manual note |
| Image/file picker | evo-ui + consumer field | browser/manual note |
| dIssues Kanban drag/drop | dIssues | provider persistence smoke |
| sLang inline save | sLang | regression/unit or browser smoke |
| sSeo resource SEO save | sSeo | resource form smoke |
The release gate is documented in
Four-Module Release Gate. It treats sSeo as
green when only documented site-content/editor adapters remain. It treats
sLang as green only when module inline UI is gone and the resource bridge has
exact allowlist reasons. For the first sSettings release, visually accepted
manager config and dirty-field modal bridge code may remain only with exact
allowlist reasons and follow-up cleanup tasks; new module-local manager drift
still blocks release.
A task should not move to ready_to_test when:
- package tests fail for generic behavior touched by the task;
- a changed consumer contract has no consumer-side proof;
- a browser-only behavior is claimed green without a smoke note;
- a task moves business logic from a consumer module into
evo-ui; - new shared UI behavior is implemented without docs and package tests.
If an exact consumer command is unknown, document it as an owner/TODO slot instead of inventing a command.