Skip to content

feat!: Refactor Experiments to be a type of Feature#316

Merged
dkotter merged 18 commits intodevelopfrom
feat/refactor-feature-namespace
Mar 18, 2026
Merged

feat!: Refactor Experiments to be a type of Feature#316
dkotter merged 18 commits intodevelopfrom
feat/refactor-feature-namespace

Conversation

@justlevine
Copy link
Copy Markdown
Contributor

@justlevine justlevine commented Mar 18, 2026

What?

This PR creates the new Features namespace, and makes Experiments a type of Feature.
Class and methods contain breaking changes, hooks are Deprecated until v1.0

Important

This PR is based on #315 which should be merged first.

Why?

How?

Hooks

Old New
ai_experiments_register_experiments wpai_register_features
ai_experiments_default_experiment_classes wpai_default_feature_classes
ai_experiments_enabled wpai_features_enabled
ai_experiments_initialized wpai_features_initialized
ai_experiments_experiment_{id}_enabled wpai_feature_{id}_enabled

Options

Old New Notes
ai_experiments_enabled wpai_features_enabled
ai_experiment_{id}_enabled wpai_feature_{id}_enabled
ai_experiment_{id}_field_{option_name} wpai_feature_{id}_field_{option_name}

Important

There is no migrator class in this PR.

Class/Methods

Category Old name New name Notes
Class WordPress\AI\Abstracts\Abstract_Experiment WordPress\AI\Abstracts\Abstract_Feature New shared base type
Class WordPress\AI\Contracts\Experiment WordPress\AI\Contracts\Feature Interface renamed and expanded
Class WordPress\AI\Experiment_Loader WordPress\AI\Features\Loader Namespace and class name both changed
Class WordPress\AI\Experiment_Registry WordPress\AI\Features\Registry Namespace and class name both changed
Class WordPress\AI\Experiment_Category WordPress\AI\Features\Feature_Category Not a strict 1:1 rename; feature category became the shared base
Class WordPress\AI\Exception\Invalid_Experiment_Metadata_Exception \InvalidArgumentException Old custom exception removed rather than renamed
Method Abstract_Experiment::load_experiment_metadata() Abstract_Feature::load_metadata() Metadata no longer includes id; ID is now static
Method Experiment::get_id() Feature::get_id() Same method name, but changed from instance to static
Method Experiment_Loader::register_default_experiments() Loader::register_features() Default registration entry point renamed
Method Experiment_Loader::get_default_experiments() Loader::get_default_features() Internal loader helper renamed
Method Experiment_Loader::initialize_experiments() Loader::initialize_features() Initialization entry point renamed
Method Experiment_Registry::register_experiment() Registry::register_feature() Registry API renamed
Method Experiment_Registry::get_experiment() Registry::get_feature() Registry API renamed
Method Experiment_Registry::get_all_experiments() Registry::get_all_features() Registry API renamed
Method Experiment_Registry::has_experiment() Registry::has_feature() Registry API renamed
Method WordPress\AI\initialize_experiments() WordPress\AI\initialize_features()

Use of AI Tools

  • GitHub Copilot Autocomplete when coding
  • Ralph Loop (opencode + gpt-5.4 as orchestrator, glm-5 for most subagents) to update tests.
  • Converting my summary of changes into a table for the PR description

Testing Instructions

Testing Instructions for Keyboard

Screenshots or screencast

Before After
Open WordPress Playground Preview

@justlevine justlevine requested a review from Copilot March 18, 2026 00:26
@justlevine justlevine self-assigned this Mar 18, 2026
@github-actions
Copy link
Copy Markdown

github-actions bot commented Mar 18, 2026

The following accounts have interacted with this PR and/or linked issues. I will continue to update these lists as activity occurs. You can also manually ask me to refresh this list by adding the props-bot label.

If you're merging code through a pull request on GitHub, copy and paste the following into the bottom of the merge commit message.

Co-authored-by: justlevine <justlevine@git.wordpress.org>
Co-authored-by: dkotter <dkotter@git.wordpress.org>
Co-authored-by: jeffpaul <jeffpaul@git.wordpress.org>

To understand the WordPress project's expectations around crediting contributors, please review the Contributor Attribution page in the Core Handbook.

Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Refactors the plugin’s “Experiments” system into a broader “Features” system by introducing a Features namespace (contract, registry, loader, categories) and registering existing experiments as feature implementations, with backward-compat hooks intended to remain deprecated until v1.0.

Changes:

  • Introduces WordPress\AI\Contracts\Feature + Abstract_Feature, plus Features\Registry and Features\Loader to replace the prior experiment registry/loader.
  • Adds Experiments\Experiments to register experiment classes via the new wpai_default_feature_classes filter, and moves Experiment_Category into the Experiments namespace (built on Features\Feature_Category).
  • Updates settings wiring and test suite/e2e helpers to use new option keys and registration/initialization entrypoints.

Reviewed changes

Copilot reviewed 53 out of 53 changed files in this pull request and generated 9 comments.

Show a summary per file
File Description
tests/e2e/utils/helpers.ts Updates E2E selectors to new wpai_feature_{id}_enabled option IDs.
tests/Integration/Includes/HelpersTest.php Adjusts test closures (static) and filter behavior for updated helpers.
tests/Integration/Includes/Features/Feature_CategoryTest.php Adds integration test for Feature_Category::OTHER.
tests/Integration/Includes/Experiments/Title_Generation/Title_GenerationTest.php Migrates experiment tests to Features\Loader/Registry and new option keys.
tests/Integration/Includes/Experiments/Summarization/SummarizationTest.php Migrates experiment tests to Features\Loader/Registry and new option keys.
tests/Integration/Includes/Experiments/Review_Notes/Review_NotesTest.php Migrates experiment tests to Features\Loader/Registry and new option keys.
tests/Integration/Includes/Experiments/Image_Generation/Image_GenerationTest.php Migrates experiment tests to Features\Loader/Registry and new option keys.
tests/Integration/Includes/Experiments/ExperimentsTest.php Adds test asserting experiments register via wpai_default_feature_classes.
tests/Integration/Includes/Experiments/Excerpt_Generation/Excerpt_GenerationTest.php Migrates experiment tests and updates enable/disable filter hook.
tests/Integration/Includes/Experiments/Example_Experiment/Example_ExperimentTest.php Migrates example experiment test to feature registry/loader APIs.
tests/Integration/Includes/Experiments/Alt_Text_Generation/Alt_Text_GenerationTest.php Migrates experiment tests and updates enable/disable filter hook.
tests/Integration/Includes/Experiments/Abilities_Explorer/Admin_PageTest.php Updates phpdoc types for renamed namespaces/classes.
tests/Integration/Includes/Experiments/Abilities_Explorer/Abilities_ExplorerTest.php Migrates Abilities Explorer tests to feature registry/loader APIs.
tests/Integration/Includes/Experiment_RegistryTest.php Refactors registry tests to new Features\Registry and Abstract_Feature.
tests/Integration/Includes/Experiment_LoaderTest.php Refactors loader tests to new Features\Loader and new hooks.
tests/Integration/Includes/Abstracts/Abstract_ExperimentTest.php Refactors abstract base tests to Abstract_Feature and adds stability tests.
tests/Integration/Includes/Abstracts/Abstract_AbilityTest.php Updates ability test experiment implementation to Abstract_Feature.
tests/Integration/Includes/Abilities/Title_GenerationTest.php Updates ability tests’ feature wrapper from Abstract_Experiment to Abstract_Feature.
tests/Integration/Includes/Abilities/SummarizationTest.php Updates ability tests’ feature wrapper and phpdoc types.
tests/Integration/Includes/Abilities/Review_NotesTest.php Updates ability tests’ feature wrapper and metadata loading method name.
tests/Integration/Includes/Abilities/Image_Prompt_GenerationTest.php Updates ability tests’ feature wrapper and metadata loading method name.
tests/Integration/Includes/Abilities/Image_ImportTest.php Updates ability tests’ feature wrapper and minor formatting tweaks.
tests/Integration/Includes/Abilities/Image_GenerationTest.php Updates ability tests’ feature wrapper and minor formatting tweaks.
tests/Integration/Includes/Abilities/Excerpt_GenerationTest.php Updates ability tests’ feature wrapper and metadata loading method name.
tests/Integration/Includes/Abilities/Alt_Text_GenerationTest.php Updates ability tests’ feature wrapper and replaces __FILE__ with __DIR__.
phpcs.xml.dist Updates global prefix rules for constants, namespace, and wpai_ prefix.
includes/bootstrap.php Switches initialization to initialize_features() and wires Features\Loader/Registry plus experiments registration.
includes/Settings/Settings_Registration.php Migrates settings registration to Features\Registry and new option keys.
includes/Settings/Settings_Page.php Renders per-feature toggles using new option keys and feature registry.
includes/Features/Registry.php Adds new feature registry (replaces old experiment registry).
includes/Features/Loader.php Adds new loader for registering/initializing features and new hooks.
includes/Features/Feature_Category.php Adds feature category constants (currently OTHER).
includes/Experiments/Title_Generation/Title_Generation.php Converts experiment class to extend Abstract_Feature with static get_id().
includes/Experiments/Summarization/Summarization.php Converts experiment class to extend Abstract_Feature with static get_id().
includes/Experiments/Review_Notes/Review_Notes.php Converts experiment class to extend Abstract_Feature with static get_id().
includes/Experiments/Image_Generation/Image_Generation.php Converts experiment class to extend Abstract_Feature with static get_id().
includes/Experiments/Experiments.php New registration class that injects experiment classes into default feature classes.
includes/Experiments/Experiment_Category.php Moves experiment categories under Experiments and inherits Feature_Category.
includes/Experiments/Excerpt_Generation/Excerpt_Generation.php Converts experiment class to extend Abstract_Feature with static get_id().
includes/Experiments/Example_Experiment/README.md Updates docs to reference Abstract_Feature and new enable/disable hooks.
includes/Experiments/Example_Experiment/Example_Experiment.php Converts example experiment to extend Abstract_Feature with static get_id().
includes/Experiments/Alt_Text_Generation/Alt_Text_Generation.php Converts experiment class to extend Abstract_Feature with static get_id() and updates ability registration path.
includes/Experiments/Abilities_Explorer/Abilities_Explorer.php Converts experiment class to extend Abstract_Feature with static get_id().
includes/Experiment_Registry.php Removes old experiment registry implementation.
includes/Experiment_Loader.php Removes old experiment loader implementation.
includes/Exception/Invalid_Experiment_Metadata_Exception.php Removes old metadata exception class.
includes/Deprecated.php Adds deprecated bridges for renamed feature/experiment hooks and filters.
includes/Contracts/Feature.php Introduces the new Feature contract.
includes/Contracts/Experiment.php Removes the old Experiment contract.
includes/Abstracts/Abstract_Feature.php Introduces shared feature base class including enablement + stability.
includes/Abstracts/Abstract_Experiment.php Removes the old experiment base class.
includes/Abstracts/Abstract_Ability.php Renames experiment_id param to feature_id for ability paths.
docs/DEVELOPER_GUIDE.md Updates developer docs for new registration hook and exception guidance.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

You can also share your feedback on Copilot code review. Take the survey.

@codecov
Copy link
Copy Markdown

codecov bot commented Mar 18, 2026

Codecov Report

❌ Patch coverage is 65.02463% with 71 lines in your changes missing coverage. Please review.
⚠️ Please upload report for BASE (develop@c9c439d). Learn more about missing BASE report.
⚠️ Report is 19 commits behind head on develop.

Files with missing lines Patch % Lines
includes/Deprecated.php 16.66% 30 Missing ⚠️
includes/Abstracts/Abstract_Feature.php 78.72% 10 Missing ⚠️
includes/bootstrap.php 0.00% 8 Missing ⚠️
includes/Features/Loader.php 86.79% 7 Missing ⚠️
includes/Settings/Settings_Registration.php 0.00% 7 Missing ⚠️
includes/Settings/Settings_Page.php 0.00% 6 Missing ⚠️
...iments/Alt_Text_Generation/Alt_Text_Generation.php 75.00% 1 Missing ⚠️
includes/Experiments/Experiment_Category.php 0.00% 1 Missing ⚠️
includes/Features/Feature_Category.php 0.00% 1 Missing ⚠️
Additional details and impacted files
@@            Coverage Diff             @@
##             develop     #316   +/-   ##
==========================================
  Coverage           ?   57.15%           
  Complexity         ?      589           
==========================================
  Files              ?       41           
  Lines              ?     3076           
  Branches           ?        0           
==========================================
  Hits               ?     1758           
  Misses             ?     1318           
  Partials           ?        0           
Flag Coverage Δ
unit 57.15% <65.02%> (?)

Flags with carried forward coverage won't be shown. Click here to find out more.

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@justlevine justlevine requested a review from Copilot March 18, 2026 01:05
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR refactors the plugin’s “Experiments” system into a unified “Features” system by introducing a WordPress\AI\Features namespace and treating experiments as a type of feature, while updating hooks/options and adding deprecation bridges.

Changes:

  • Introduces Features\Registry, Features\Loader, Contracts\Feature, and Abstract_Feature and migrates experiments to extend Abstract_Feature.
  • Updates settings/options, hooks, and tests (E2E + integration) to use the new feature-based APIs.
  • Adds deprecation shims for legacy experiment hooks/actions until v1.0.

Reviewed changes

Copilot reviewed 60 out of 60 changed files in this pull request and generated 8 comments.

Show a summary per file
File Description
tests/e2e/utils/helpers.ts Updates E2E selectors to feature-based option IDs.
tests/Integration/Includes/HelpersTest.php Makes filter callbacks static and reformats for consistency.
tests/Integration/Includes/Features/Feature_CategoryTest.php Adds coverage for Feature_Category::OTHER.
tests/Integration/Includes/Experiments/Title_Generation/Title_GenerationTest.php Migrates experiment tests to feature loader/registry + new option keys.
tests/Integration/Includes/Experiments/Summarization/SummarizationTest.php Migrates summarization experiment tests to features system.
tests/Integration/Includes/Experiments/Review_Notes/Review_NotesTest.php Migrates review notes experiment tests to features system.
tests/Integration/Includes/Experiments/Image_Generation/Image_GenerationTest.php Migrates image generation experiment tests to features system.
tests/Integration/Includes/Experiments/ExperimentsTest.php Adds test ensuring Experiments registers default feature classes.
tests/Integration/Includes/Experiments/Excerpt_Generation/Excerpt_GenerationTest.php Migrates excerpt generation tests + updated enable/disable filter.
tests/Integration/Includes/Experiments/Example_Experiment/Example_ExperimentTest.php Migrates example experiment test to register/init via features API.
tests/Integration/Includes/Experiments/Alt_Text_Generation/Alt_Text_GenerationTest.php Migrates alt text generation tests + updated enable/disable filter.
tests/Integration/Includes/Experiments/Abilities_Explorer/Admin_PageTest.php Updates phpdoc types to new namespaces.
tests/Integration/Includes/Experiments/Abilities_Explorer/Abilities_ExplorerTest.php Migrates abilities explorer tests to features loader/registry.
tests/Integration/Includes/Experiment_RegistryTest.php Converts registry tests from experiments to features registry.
tests/Integration/Includes/Experiment_LoaderTest.php Converts loader tests from Experiment_Loader to Features\Loader.
tests/Integration/Includes/Abstracts/Abstract_ExperimentTest.php Converts abstract experiment tests to Abstract_Feature + adds stability tests.
tests/Integration/Includes/Abstracts/Abstract_AbilityTest.php Updates ability tests to use Abstract_Feature and refactors minor formatting.
tests/Integration/Includes/Abilities/Title_GenerationTest.php Updates ability test experiment to Abstract_Feature + static get_id().
tests/Integration/Includes/Abilities/SummarizationTest.php Updates ability test experiment to Abstract_Feature + static get_id().
tests/Integration/Includes/Abilities/Review_NotesTest.php Updates ability test experiment to Abstract_Feature + static get_id().
tests/Integration/Includes/Abilities/Image_Prompt_GenerationTest.php Updates ability test experiment to Abstract_Feature + static get_id().
tests/Integration/Includes/Abilities/Image_ImportTest.php Updates ability test experiment to Abstract_Feature + static get_id() and minor alignment.
tests/Integration/Includes/Abilities/Image_GenerationTest.php Updates ability test experiment to Abstract_Feature + static get_id() and minor alignment.
tests/Integration/Includes/Abilities/Excerpt_GenerationTest.php Updates ability test experiment to Abstract_Feature + static get_id().
tests/Integration/Includes/Abilities/Alt_Text_GenerationTest.php Updates ability test experiment to Abstract_Feature + __DIR__ usage.
phpcs.xml.dist Updates global prefix rules to match new naming/prefixes.
includes/bootstrap.php Switches initialization to initialize_features() and wires in feature loader/registry.
includes/Settings/Settings_Registration.php Migrates settings registration to iterate features and new option keys.
includes/Settings/Settings_Page.php Migrates settings UI to read features and new option keys/IDs.
includes/Features/Registry.php Adds new feature registry responsible for storing feature instances.
includes/Features/Loader.php Adds new loader to register/initialize features from filtered class lists.
includes/Features/Feature_Category.php Adds feature-level category constants (currently OTHER).
includes/Experiments/Title_Generation/Title_Generation.php Migrates experiment implementation to Abstract_Feature + static get_id().
includes/Experiments/Summarization/Summarization.php Migrates experiment implementation to Abstract_Feature + static get_id().
includes/Experiments/Review_Notes/Review_Notes.php Migrates experiment implementation to Abstract_Feature + static get_id().
includes/Experiments/Image_Generation/Image_Generation.php Migrates experiment implementation to Abstract_Feature + static get_id().
includes/Experiments/Experiments.php Adds class that registers experiment classes as default features via filter.
includes/Experiments/Excerpt_Generation/Excerpt_Generation.php Migrates experiment implementation to Abstract_Feature + static get_id().
includes/Experiments/Example_Experiment/README.md Updates docs to Abstract_Feature + new hooks/filters.
includes/Experiments/Example_Experiment/Example_Experiment.php Migrates example experiment to Abstract_Feature + static get_id().
includes/Experiments/Alt_Text_Generation/Alt_Text_Generation.php Migrates experiment to Abstract_Feature + updates ability registration path building.
includes/Experiments/Abilities_Explorer/Abilities_Explorer.php Migrates experiment implementation to Abstract_Feature + static get_id().
includes/Experiment_Category.php Moves experiment category to Experiments namespace and inherits feature category.
includes/Deprecated.php Adds deprecation bridges from legacy experiment hooks/actions to new feature equivalents.
includes/Contracts/Feature.php Adds new Feature interface (static id + stability).
includes/Abstracts/Abstract_Feature.php Adds new base class implementing shared feature behavior + enablement logic.
includes/Abstracts/Abstract_Ability.php Renames param in path() from experiment to feature for clarity.
docs/DEVELOPER_GUIDE.md Updates developer docs for new custom feature registration hooks and exceptions.
includes/Experiment_Registry.php Removes legacy experiment registry class (replaced by Features\Registry).
includes/Experiment_Loader.php Removes legacy experiment loader class (replaced by Features\Loader).
includes/Abstracts/Abstract_Experiment.php Removes legacy abstract experiment base class (replaced by Abstract_Feature).
includes/Contracts/Experiment.php Removes legacy experiment contract (replaced by Contracts\Feature).
includes/Exception/Invalid_Experiment_Metadata_Exception.php Removes legacy exception (docs now suggest standard exceptions).
Comments suppressed due to low confidence (8)

tests/Integration/Includes/Experiment_LoaderTest.php:1

  • These assertions still call an instance method get_id(), but the new Contracts\\Feature API exposes get_id() as a static method. Update these calls to use $abilities_explorer_experiment::get_id() (and similarly for the others), or add a non-static get_id() instance accessor in Abstract_Feature if you intend to keep the old call style.
    tests/Integration/Includes/Experiment_LoaderTest.php:1
  • These assertions still call an instance method get_id(), but the new Contracts\\Feature API exposes get_id() as a static method. Update these calls to use $abilities_explorer_experiment::get_id() (and similarly for the others), or add a non-static get_id() instance accessor in Abstract_Feature if you intend to keep the old call style.
    tests/Integration/Includes/Experiment_LoaderTest.php:1
  • These assertions still call an instance method get_id(), but the new Contracts\\Feature API exposes get_id() as a static method. Update these calls to use $abilities_explorer_experiment::get_id() (and similarly for the others), or add a non-static get_id() instance accessor in Abstract_Feature if you intend to keep the old call style.
    tests/Integration/Includes/Experiment_LoaderTest.php:1
  • These assertions still call an instance method get_id(), but the new Contracts\\Feature API exposes get_id() as a static method. Update these calls to use $abilities_explorer_experiment::get_id() (and similarly for the others), or add a non-static get_id() instance accessor in Abstract_Feature if you intend to keep the old call style.
    tests/Integration/Includes/Experiment_LoaderTest.php:1
  • These assertions still call an instance method get_id(), but the new Contracts\\Feature API exposes get_id() as a static method. Update these calls to use $abilities_explorer_experiment::get_id() (and similarly for the others), or add a non-static get_id() instance accessor in Abstract_Feature if you intend to keep the old call style.
    tests/Integration/Includes/Experiment_LoaderTest.php:1
  • These assertions still call an instance method get_id(), but the new Contracts\\Feature API exposes get_id() as a static method. Update these calls to use $abilities_explorer_experiment::get_id() (and similarly for the others), or add a non-static get_id() instance accessor in Abstract_Feature if you intend to keep the old call style.
    tests/Integration/Includes/Experiment_LoaderTest.php:1
  • These assertions still call an instance method get_id(), but the new Contracts\\Feature API exposes get_id() as a static method. Update these calls to use $abilities_explorer_experiment::get_id() (and similarly for the others), or add a non-static get_id() instance accessor in Abstract_Feature if you intend to keep the old call style.
    tests/Integration/Includes/Abilities/Title_GenerationTest.php:1
  • The docblock indentation here is inconsistent (extra indentation before *) and is likely to trip WordPressCS/phpcs formatting rules. Align the docblock to the project’s standard indentation (one tab inside the class body) to keep linting consistent.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

You can also share your feedback on Copilot code review. Take the survey.

Copy link
Copy Markdown
Collaborator

@dkotter dkotter left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Overall this looks and tests well to me, left a few minor comments.

This is mentioned in the PR description but worth highlighting again that this introduces breaking changes. For instance, anyone that built custom experiments on top of our Abstract_Experiment class (which now no longer exists) will run into fatal errors. Or anyone accessing the Experiment_Registry directly (among other areas that have been removed). I think that's fine but needs to be called out in our changelog.

@jeffpaul jeffpaul mentioned this pull request Mar 18, 2026
33 tasks
justlevine and others added 10 commits March 18, 2026 21:19
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
justlevine and others added 7 commits March 18, 2026 21:19
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Darin Kotter <darin.kotter@gmail.com>
Co-authored-by: Darin Kotter <darin.kotter@gmail.com>
Co-authored-by: Darin Kotter <darin.kotter@gmail.com>
@justlevine justlevine force-pushed the feat/refactor-feature-namespace branch from 0eaba59 to b361d2d Compare March 18, 2026 19:20
@justlevine justlevine requested a review from dkotter March 18, 2026 19:41
Base automatically changed from dev/hooks-helpers to develop March 18, 2026 19:47
@dkotter dkotter merged commit c04a8bf into develop Mar 18, 2026
28 of 29 checks passed
@dkotter dkotter deleted the feat/refactor-feature-namespace branch March 18, 2026 20:12
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Rename plugin from “AI Experiments” to “AI” and define feature vs experiment classification

4 participants