| # Dart SDK process for changes behind experimental flags | 
 |  | 
 | ## Problem statement | 
 |  | 
 | The Dart SDK ships via a number of channels: | 
 |  | 
 | - Via the [Dart SDK](https://dart.dev/get-dart#install) | 
 | - Via the [Flutter SDK](https://flutter.dev/) | 
 | - Internally at Google via an internal channel | 
 |  | 
 | Each of these channels use varying release calendars, and keeping these entirely | 
 | aligned is not practical. Further, a number of developers interested in staying | 
 | current with Dart changes, consume the Dart SDK via our [dev | 
 | channel](https://github.com/dart-lang/sdk/wiki/Branches-and-releases). As a | 
 | result, we should anticipate that any dev channel build has the potential to end | 
 | up as a shipped SDK though some channel. And as a consequence of that, it is | 
 | critical that we keep the quality of our dev channel high AND that we keep it | 
 | consistent wrt. which features are complete and supported. At the same time, we | 
 | need the ability to land incomplete features to facilitate a number of tasks: | 
 |  | 
 | - Compose a feature that spans multiple components/areas | 
 | - Automated testing prior to the full completion of the feature | 
 | - Allow partner teams to get a preview of a future feature | 
 | - Allow customers to get a preview of a future feature | 
 | - Etc. | 
 |  | 
 | ## Solution | 
 |  | 
 | To ensure completed & supported features can be differentiated from incomplete | 
 | features in-progress, we will put all in-progress features behind a single set | 
 | of flags. Changes to features behind these flags are not considered breaking | 
 | (even if the feature behind the flag was in a stable SDK), and they are subject | 
 | to removal at any time. For details about breaking changes, see the breaking | 
 | change process. | 
 |  | 
 | All new features that meet one of the following criteria must be developed | 
 | behind a flag (when possible): | 
 |  | 
 | - All breaking changes | 
 | - All language changes | 
 |  | 
 | Further, it is recommended to consider developing behind a flag when: | 
 |  | 
 | - Landing larger, user-visible changes which will be in an intermediate state | 
 |   over several weeks and perhaps even releases | 
 | - Making changes with the potential to have significant negative performance | 
 |   impact for several weeks and perhaps even across releases | 
 |  | 
 | ## Details | 
 |  | 
 | ### Flag format for CLI-based tools | 
 |  | 
 | Flags consist of one or more words, combined using dashes, using all lower-case. | 
 | The single source of truth of these flags shall be a single shared .dart file. | 
 | The tools are expected to offer a framework for querying these flags so that the | 
 | implementation of the tools can easily access new flags. | 
 |  | 
 | The flags are passed to CLI-based tools using the `--enable-experiment` flag | 
 | Multiple flags can be passed by using multiple flags, or by passing several | 
 | comma-separated flags. Examples: | 
 |  | 
 | ``` | 
 | dart --enable-experiment=super-mixins | 
 | dart --enable-experiment=super-mixins,no-slow-checks,preview-dart3 | 
 | dart --enable-experiment=super-mixins --enable-experiment no-slow-checks --enable-experiment preview-dart3 | 
 | ``` | 
 |  | 
 | If the user passes a flag that is not recognized (for example, when the flag is | 
 | no longer supported), the tool is required to inform about this by printing to | 
 | stderr, and not fail. | 
 |  | 
 | ``` | 
 | dart --enable-experiment better-mixins | 
 | Unknown experiment flag 'better-mixins'. | 
 | ``` | 
 |  | 
 | ### Flag format for UI-based tools (IDEs/editors/etc.) | 
 |  | 
 | IDEs and editors which offer the ability to invoke Dart tools, must support | 
 | passing these flags. The support should be generic and flexible so that no UI | 
 | change is required when we add or remove a flag. This is expected to take one of | 
 | two forms: | 
 |  | 
 | - Experiments affecting analysis can be enabled in `analysis_options.yaml` under | 
 |   a single `enable-experiment:` key, e.g. to enable the flags `super-mixins` & | 
 |   `no-slow-checks`: | 
 |  | 
 |   ``` | 
 |   analyzer: | 
 |     enable-experiment: | 
 |       - super-mixins | 
 |       - no-slow-checks | 
 |   ``` | 
 |  | 
 | - Experiments affecting launch/run behavior, can be enabled in the IDE specific | 
 |   run Configuration, by passing the same `--enable-experiment` flag as listed in | 
 |   the CLI section. | 
 |  | 
 | The current set of experiment flags is defined in a YAML file which the various | 
 | tools access: | 
 | [experimental_features.yaml](../../tools/experimental_features.yaml). |