Features New: Forms — A form is a structured document used to collect and store data in a consistent way. Each form is created from a published form template and inherits its schema — the set of fields, their types, and their layout. Forms make it easy to capture experimental parameters, sample metadata, or observations in a repeatable format, so the data you collect stays uniform and comparable across your data lab (1c9fc877, f9bc6c8a) Form templates & versioning — Create form templates with draft/publish/archive lifecycle, optional template version, and the ability to unarchive a template version (1c9fc877, f9bc6c8a) ComputedParam — New computed parameter type with @ variable references and outer-variable references; validation runs on submit and on version publish (51f3890d, 1c9fc877, f9bc6c8a) AI-assisted filling — Fill a form from free text and generate computed-field expressions with AI (c18dafa2, 1c9fc877) Note integration — Embed forms in notes and note templates; convert FormBlock when creating a note template from a note; filter notes and note templates by form / form template in the search builder; sync notes containing forms with Space (0c98cab2, 6d3bbefb, e5d866bc, 1c9fc877) New: Entity actions — Custom action buttons and links can now be added to the menu of lab entities (resources, scenarios, notes, forms, and their templates) — for example to open a custom viewer, trigger an analysis, or jump to a related page (9982cca6) New: Scenario export / import — Possibility to export and import a scenario to a compressed file (1c9fc877) Update: App — Possibility to switch Auto stop policy for App to Manual. In Manual, the app are not automatically stopped. Technical Features Switch from pip to uv — gws post-install and BrickSettings now use uv instead of pip; remaining pip references migrated (1c9fc877) New SelectParam type — Replaces the deprecated allowed_values argument on StrParam / IntParam / FloatParam with a dedicated param type supporting {label, value} options and Enum classes. allowed_valuesstill works in 0.22 with a deprecation warning and will be removed in 0.24. A migration codemod is shipped — run it on a brick with:gws brick code-migrate <brick_path> --version 0.22.0 Use --dry-run to preview the diff or --yes to apply without prompting (1c9fc877, f9bc6c8a) New DateParam type — New param type for date fields, with proper typing and min/max value checks (f9bc6c8a, e28d2b71) Test suite overhaul — Significant rework of the test infrastructure: Parallel execution — Tests can now run in parallel via pytest-xdist; each worker gets its own test DB schema. Use --parallel (with optional --workers <N> or auto):gws server test all --parallel gws server test all --parallel --workers 4 Multi-brick test runs — New gws server test-all command runs the suite across multiple bricks in one call, with per-brick JUnit XML reports BrickTestRunner task — New task at src/gws_core/test/brick_test_runner.py that installs a configurable set of bricks inside a fresh glab test container and runs gws server test-all against them, producing a JUnit XML folder and an aggregated summary. Useful for running a brick's tests in an isolated, reproducible environment Faster local runs — Simplified before/after hooks and skipped DB migrations in test mode (1c9fc877) Entity action plugin system — New EntityActionPlugin API to contribute menu actions on lab entities from any brick (9982cca6): Plugin definition — Subclass EntityActionPlugin, set entity_action_type (one of RESOURCE, SCENARIO, NOTE, FORM, SCENARIO_TEMPLATE, NOTE_TEMPLATE, FORM_TEMPLATE), and register it with the @entity_action_plugin("<name>") decorator get_actions(entity) — Return the list of actions to show for the given entity, using the EntityAction.button(...) / EntityAction.link(...) helpers (with icons, colors, dividers, and nested sub-menus) execute_action(entity, action_name) — Handle button clicks; can return a navigation instruction in the result Namespacing & dispatch — Plugins are namespaced as <brick_name>.<plugin_name> so the dispatch endpoint routes each action back to the right plugin Auto-disabled with the brick — A disabled brick's plugins are never registered, so its actions disappear automatically Validation — Plugin unique_name and per-button action_name are checked for uniqueness Reflex improvements — New download service, improved select resource input and resource search filter, improved typing for resource select (1c9fc877, 0603a3f8) Streamlit / Reflex env apps — New command to generate env app files, fix env app generation, and generate environment.json during Reflex plugin installation (e60ac7f9, 1bcf7b92, 1c9fc877) Other Changes Remove hardcoded /lab path — Replaced hardcoded /lab references with an env variable and a settings method (1c9fc877) App lifecycle hardening — Kill existing processes using the port on start, force-kill processes on stop, and improve stop-app behavior (1c9fc877) Compress utilities — New add_dir_content method, sudo option, and improved documentation (a148e43f, 6b5f0208) FileHelper.is_excel — New helper to detect Excel files (9982cca6) DockerService volume paths — New method to get paths for volumes (1e920a26) Task exception logging — Option to log full exception stack trace (1c9fc877) Note rollback event — Emit update event when a note is rolled back (1c9fc877) ZipCompress error handling — Improved error handling with detailed messages (4717ddc8) VenvService logging — Improved error logs (2de25fe5) Settings: stop storing is_test — is_test is no longer persisted in settings.json (1c9fc877) PostInstall cleanup — Removed pigz from post-install (handled by Docker config) (1c9fc877) ReflexProcess debug logs — Added debug logging to ReflexProcess (1c9fc877) Streamlit / Reflex version bump — Updated Streamlit and Reflex versions (1bcf7b92)