From 5f1f0bd2a3a6c33afd05bcf9f36cbc65e4f7e68b Mon Sep 17 00:00:00 2001 From: redblueflame Date: Thu, 22 Apr 2021 14:01:53 +0200 Subject: [PATCH 1/6] Added RFC 13: Experimental features --- attachments/0013-stabilization-flow.jpg | Bin 0 -> 37339 bytes rfc/0013-experimental-features.md | 193 ++++++++++++++++++++++++ 2 files changed, 193 insertions(+) create mode 100644 attachments/0013-stabilization-flow.jpg create mode 100644 rfc/0013-experimental-features.md diff --git a/attachments/0013-stabilization-flow.jpg b/attachments/0013-stabilization-flow.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f1b259f174308051ff1b37715db9564cf44e50d5 GIT binary patch literal 37339 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 aJ^?@$8Q{2nxgmdj0;ukP`UQc08vHM26~X@i literal 0 HcmV?d00001 diff --git a/rfc/0013-experimental-features.md b/rfc/0013-experimental-features.md new file mode 100644 index 00000000..41ddc837 --- /dev/null +++ b/rfc/0013-experimental-features.md @@ -0,0 +1,193 @@ +# Summary + +This RFC aims to add a step in the lifecycle of any API or module, called the `experimental phase`. It explains in more detail the broad description present in the [RFC 9](https://github.com/QuiltMC/rfcs/pull/9). + + +# Motivation + +An experimental stage allows modders and the API developers to test out features present in the standard library before they are officially made available, ensuring the quality of the implementation once they reach the GA stage. + +# Explanation + +The experimental system doesn't work the same way for both modules and APIs. + +**NOTE:** For readability, experimental modules and API is simplified as experimental code in this RFC. + +## Definitions + +### **Toggle** + +A toggle is a change in configuration that, once applied, implicitly or explicitly enables the use of an experimental feature or module. This can be a normalized solution (see the **normalized toggle**) or any other change, like the following, but not limited to: + +- Switching versions of a dependency **manually** +- Changing a compiler option (adding a CLI flag) +- Adding an environment variable + +### **Normalized Toggle** + +A normalized toggle is a uniform and agreed-upon way to *toggle* some experimental features or modules. + +### **Closed issue** + +A closed issue is an issue that either resolved or dismissed due to one of the following reasons: +- Duplicate of another open or closed issue +- Already fixed in the **main** branch, a fix in a non-merged PR is not considered closed +- A non-issue (An issue that is not one, usually due to design decisions) +- Out of scope (An issue that is not relevant to any of the experimental features linked) +- Neglected issue (An issue that did not get a response for at least 14 days after a question was asked) +- TODO: Add more closed reasons. + +### **Feature** +A feature in the current context is an indentifier following guidelines: +- Only contains lowercase alphanumeric character, and hyphens +- Is unique among other features +- Explains in a short form the format of the feature +- As a guideline, a feature should not be longer than 32 characters unless the feature name cannot be shorter without overlaps. + +A feature is the identifier used for experimental code, and is used to enable the features wanted. + +By convention, the feature name is the text after the identifier in the initial RFC's name. + +## Lifetime of experimental code + +A module or API is considered experimental once it got merged in the main repository and stays as one until its stabilization. + +After merging, a new issue should be created in the repository, using the following format as title: `[Tracking Issue] {Name of feature} ({RFC ID})` +And the following template: +```md +This is the tracking issue for #{RFC ID}, {Small description of the feature}. + +TODOs: +{ + List of all issues still needed to stabilize the feature, using the checkbox format: + - [ ] #{Issue ID} {Title of issue} +} + +Blocking issues: +{ + List of all open issues about the feature, using the checkbox format: + - [ ] #{Issue ID} {Title of issue} +} +``` + +Once every TODO and blocking issue is closed, the feature can be added to the next related working group meeting, where the team will vote on the stabilization of the feature. If the stabilization is refused, the team has to provide reasoning behind the choice, in addition to TODOs required to send the stabilization request again. + +If the stabilization is accepted, the PR enters a grace period of (7) days, and if no new blocking issue appears, the stabilization PR can be merged. + + +Here is a schema of the whole process: + +![Stabilization Flow Dragram](../attachments/xxxx-stabilization-flow.jpg) + +## Differences of experimental code + +To execute experimental code you need to do one of the following: +- Enable in the Gradle settings the feature: +```gradle +// In the quilt build section +enableExperimentalFeatures 'xxx', 'yyy', 'zzz' +``` +- Enable the feature for the current class using the following syntax +```java +@EnableExperimental("xxx", "yyy") +public class UseClass { +... +``` + +- If a library you use depends on an experimental feature, you are allowed to use the exposed API surface without enabling the experimental feature. So you have to enable the experimental feature yourself if you want to use them. + +- Enabling features in a library/mod (both global and class-specific) will automatically add a tag to the metadata, in a separate file, called `experimental.json`. This file is not present if there are no experimental features used, and a jar depending on another library (JiJ) inherits the `experimental.json` file. + +- Experimental code is not subject to deprecation policies, we do reserve the right to modify or remove any APIs in features without previous notice. + +- Experimental features can be removed at any time in one of the following ways: + - The writer of the RFC supersedes the experimental feature with another one, and after asking the working group for removal + - The working group majority votes for the removal of a feature in a meeting, after providing reasons for the removal + +## `experimental.json` file +The experimental.json file only contains a JSON array with the identifiers like the following: +```json +[ + "xxx", + "yyy" +] +``` + +This file can be used on quilt-loader to switch out a library at runtime or do specific changes ahead of time. + +## Modules +As defined in RFC 9, a module is the lowest level split of the standard level library, independent of each other. + +### Changes specific to modules: + +- A module in an experimental state does not have any limitation, as long as it does not break any stable component **while the toggle is disabled**. + +- It doesn't have to use a *normalized toggle*, as long as the justifications against using one are considered enough by the QSL / dependant working group. + +- There is no minimum time for the experimental state, but all issues raised on the module has to be closed (see definition) + +### Implementation + +*Note: This implementation example is only for modules that use the normalized toggles system, for non-normalized toggles, use the method chosen.* + +For experimental modules, the marking as experimental should be possible to do using the build.gradle file, by adding the following build parameter: +```gradle +// In the quilt build section +experimentalModule "xxx" // The feature name +``` +On the Gradle build side, we should be able to add another file in the built jar, named experimental, and containing the feature name inside it. + +This file will be read by the Gradle plugin during import, and if the file is present, check if the feature is enabled and if it isn't, throw an error. + +## APIs +APIs are smaller parts, that can be as low as a function or interface. +### Changes specific to APIs: +- APIs have to use the normalized toggle system. + +- Experimental toggles cannot deprecate other functions until they are stabilized. + +- All APIs have to be in the experimental status for at least one (1) month. + +### Implementation +The implementation for a library developer is by adding an annotation to the experimental classes & functions, like the following: +```java +@ApiStatus.Experimental // Used for warnings directly in the IDE +@QuiltExperimental("xxx") // where "xxx" is the feature attached to the code +``` + +In the Gradle plugin, as an additional compilation step, if it detects an experimental function is being called and the feature is not enabled, send an error explaining how to enable the feature. +An error could look like this: +``` +ERROR at org.quiltmc.testing.main +The feature `testing-feature` is marked as experimental. +To use it, add the following settings to your build.gradle: +enableExperimentalFeatures 'testing-feature' +``` + +# Drawbacks + +While the experimental system allows ensuring that all stabilized code had enough chances to be tested, it also lengthens the process of getting a new feature directly available to everyone without being opt-in. + + +# Rationale and Alternatives + +- This is an already used process, that allows us to be sure that the system works in the wild +- This feature allows to easily test features before they get stabilized for modders and getting their work field-tested for library developers. + + +# Prior Art + +This system is currently used by [rust](https://github.com/rust-lang) and is working pretty well. The only problem here is the requirement to have nightly to enable feature flags, even if the code itself is there. This is why the requirement was removed in this RFC. + + +# Unresolved Questions + +- This RFC depends mainly on the Gradle plugin system, with the compile-time checking of features. This RFC could stay as unimplemented until then. +- How to do a file-level feature selection? Attributes don't work on there. +- Do we add a smaller deprecation policy on the most used features? + +# Expected Response + +This change would be welcome, as it allows to use of new features and give feedback to it before it's too late, as it allows to bypass all deprecation policies. + +But as it also makes the process of making a new feature globally available, I do expect that there will need to be simplicications in the stabilization process. \ No newline at end of file From bb50fe430b9ad8349f269c1c369cf0ded23572e5 Mon Sep 17 00:00:00 2001 From: Redblueflame Date: Mon, 3 May 2021 17:58:38 +0200 Subject: [PATCH 2/6] Added versionning informations, and explicited out messages --- rfc/0013-experimental-features.md | 48 +++++++++++++++++++++---------- 1 file changed, 33 insertions(+), 15 deletions(-) diff --git a/rfc/0013-experimental-features.md b/rfc/0013-experimental-features.md index 41ddc837..9b06f57d 100644 --- a/rfc/0013-experimental-features.md +++ b/rfc/0013-experimental-features.md @@ -15,7 +15,7 @@ The experimental system doesn't work the same way for both modules and APIs. ## Definitions -### **Toggle** +### **Experimental Toggle** A toggle is a change in configuration that, once applied, implicitly or explicitly enables the use of an experimental feature or module. This can be a normalized solution (see the **normalized toggle**) or any other change, like the following, but not limited to: @@ -23,7 +23,7 @@ A toggle is a change in configuration that, once applied, implicitly or explicit - Changing a compiler option (adding a CLI flag) - Adding an environment variable -### **Normalized Toggle** +### **Normalized Experimental Toggle** A normalized toggle is a uniform and agreed-upon way to *toggle* some experimental features or modules. @@ -69,6 +69,7 @@ Blocking issues: - [ ] #{Issue ID} {Title of issue} } ``` +(*Note: everything between curly brackets has to be replaced with the actual contents.*) Once every TODO and blocking issue is closed, the feature can be added to the next related working group meeting, where the team will vote on the stabilization of the feature. If the stabilization is refused, the team has to provide reasoning behind the choice, in addition to TODOs required to send the stabilization request again. @@ -77,7 +78,7 @@ If the stabilization is accepted, the PR enters a grace period of (7) days, and Here is a schema of the whole process: -![Stabilization Flow Dragram](../attachments/xxxx-stabilization-flow.jpg) +![Stabilization Flow Dragram](../attachments/0013-stabilization-flow.jpg) ## Differences of experimental code @@ -104,16 +105,20 @@ public class UseClass { - The writer of the RFC supersedes the experimental feature with another one, and after asking the working group for removal - The working group majority votes for the removal of a feature in a meeting, after providing reasons for the removal -## `experimental.json` file -The experimental.json file only contains a JSON array with the identifiers like the following: +## `.annotations.json` file +The .annotations.json file is generated automaticly by an annotation processor, and indicates the functions that are marked as experimental, in addition to the attached features. +It is composed of a json object like the following: ```json -[ - "xxx", - "yyy" -] +{ + "experimental": { + "com/redblueflame/library/LibraryTest.TestingField;I": "yyy", + "com/redblueflame/library/LibraryTest.test_enum;Lcom/redblueflame/library/InternalEnum;": "ccc", + "com/redblueflame/library/LibraryTest.testing;Lcom/redblueflame/library/InternalClass;": "bbb", + } +} ``` - -This file can be used on quilt-loader to switch out a library at runtime or do specific changes ahead of time. +Where the key is the ASM-like structure, and the value the attached feature. +The main objective of this file is to provide a precomputed solution, so gradle doesn't have to manually search for annotations in the compiled class files. ## Modules As defined in RFC 9, a module is the lowest level split of the standard level library, independent of each other. @@ -152,17 +157,30 @@ APIs are smaller parts, that can be as low as a function or interface. The implementation for a library developer is by adding an annotation to the experimental classes & functions, like the following: ```java @ApiStatus.Experimental // Used for warnings directly in the IDE +// Note: In the future where IDE extensions are developped, the above can be ignored. @QuiltExperimental("xxx") // where "xxx" is the feature attached to the code ``` In the Gradle plugin, as an additional compilation step, if it detects an experimental function is being called and the feature is not enabled, send an error explaining how to enable the feature. An error could look like this: ``` -ERROR at org.quiltmc.testing.main -The feature `testing-feature` is marked as experimental. -To use it, add the following settings to your build.gradle: -enableExperimentalFeatures 'testing-feature' +C:\Users\User\project\src\main\java\org\quiltmc\test\Testing.java:9: error: The feature ccc is marked as experimental, but not enabled in the build.gradle file. + + +To enable the experimental features, please add the following lines to your build.gradle file: +quilt { + //... + experimentalModules "ccc", "aaa" +} ``` +This error message depends on the DSL language used to build the script. + +# Versionning changes +*Note: Remove this part if there is already work done on the QSL versionning.* + +While the actual versionning rules have to be defined in a separate RFC, there can be already certain rules that will have to be respected on experimental code: +- When experimental code changes, the version of the module must not change, only the build number/hash has to be incremented. (In no case an experimental changes not accompanied with deprecation or breaking changes in non experimental code) +- If following the SemVer versionning convention, adding a new experimental feature can warrant the change of a PATCH or a MINOR value in the event of the feature changing significant parts of the code source that is used by non experimental features. # Drawbacks From 8e0c0f6a603cd821310e0f1a114d4f15e9187e05 Mon Sep 17 00:00:00 2001 From: Redblueflame Date: Mon, 3 May 2021 19:30:15 +0200 Subject: [PATCH 3/6] Fixed typos --- rfc/0013-experimental-features.md | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/rfc/0013-experimental-features.md b/rfc/0013-experimental-features.md index 9b06f57d..20d5d08c 100644 --- a/rfc/0013-experimental-features.md +++ b/rfc/0013-experimental-features.md @@ -38,13 +38,13 @@ A closed issue is an issue that either resolved or dismissed due to one of the f - TODO: Add more closed reasons. ### **Feature** -A feature in the current context is an indentifier following guidelines: -- Only contains lowercase alphanumeric character, and hyphens +A feature in the current context is an identifier following guidelines: +- Only contains lowercase alphanumeric character and hyphens - Is unique among other features - Explains in a short form the format of the feature - As a guideline, a feature should not be longer than 32 characters unless the feature name cannot be shorter without overlaps. -A feature is the identifier used for experimental code, and is used to enable the features wanted. +A feature is the identifier used for experimental code and is used to enable the features wanted. By convention, the feature name is the text after the identifier in the initial RFC's name. @@ -106,7 +106,7 @@ public class UseClass { - The working group majority votes for the removal of a feature in a meeting, after providing reasons for the removal ## `.annotations.json` file -The .annotations.json file is generated automaticly by an annotation processor, and indicates the functions that are marked as experimental, in addition to the attached features. +The .annotations.json file is generated automatically by an annotation processor and indicates the functions that are marked as experimental, in addition to the attached features. It is composed of a json object like the following: ```json { @@ -117,8 +117,8 @@ It is composed of a json object like the following: } } ``` -Where the key is the ASM-like structure, and the value the attached feature. -The main objective of this file is to provide a precomputed solution, so gradle doesn't have to manually search for annotations in the compiled class files. +Where the key is the ASM-like structure, and the value of the attached feature. +The main objective of this file is to provide a pre-computed solution, so Gradle doesn't have to manually search for annotations in the compiled class files. ## Modules As defined in RFC 9, a module is the lowest level split of the standard level library, independent of each other. @@ -157,7 +157,7 @@ APIs are smaller parts, that can be as low as a function or interface. The implementation for a library developer is by adding an annotation to the experimental classes & functions, like the following: ```java @ApiStatus.Experimental // Used for warnings directly in the IDE -// Note: In the future where IDE extensions are developped, the above can be ignored. +// Note: In the future where IDE extensions are developed, the above can be ignored. @QuiltExperimental("xxx") // where "xxx" is the feature attached to the code ``` @@ -176,11 +176,11 @@ quilt { This error message depends on the DSL language used to build the script. # Versionning changes -*Note: Remove this part if there is already work done on the QSL versionning.* +*Note: Remove this part if there is already work done on the QSL versioning.* -While the actual versionning rules have to be defined in a separate RFC, there can be already certain rules that will have to be respected on experimental code: -- When experimental code changes, the version of the module must not change, only the build number/hash has to be incremented. (In no case an experimental changes not accompanied with deprecation or breaking changes in non experimental code) -- If following the SemVer versionning convention, adding a new experimental feature can warrant the change of a PATCH or a MINOR value in the event of the feature changing significant parts of the code source that is used by non experimental features. +While the actual versioning rules have to be defined in a separate RFC, there can be already certain rules that will have to be respected on experimental code: +- When experimental code changes, the version of the module must not change, only the build number/hash has to be incremented. (In no case an experimental changes not accompanied with deprecation or breaking changes in non-experimental code) +- If following the SemVer versioning convention, adding a new experimental feature can warrant the change of a PATCH or a MINOR value in the event of the feature changing significant parts of the code source that is used by non-experimental features. # Drawbacks @@ -208,4 +208,4 @@ This system is currently used by [rust](https://github.com/rust-lang) and is wor This change would be welcome, as it allows to use of new features and give feedback to it before it's too late, as it allows to bypass all deprecation policies. -But as it also makes the process of making a new feature globally available, I do expect that there will need to be simplicications in the stabilization process. \ No newline at end of file +But as it also makes the process of making a new feature globally available, I do expect that there will need to be simplifications in the stabilization process. \ No newline at end of file From 103b61056da6bf1e8250e02ee5d838aa03604a5b Mon Sep 17 00:00:00 2001 From: Redblueflame Date: Mon, 3 May 2021 23:49:42 +0200 Subject: [PATCH 4/6] Fixed issues with versionning --- rfc/0013-experimental-features.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/rfc/0013-experimental-features.md b/rfc/0013-experimental-features.md index 20d5d08c..40b8c923 100644 --- a/rfc/0013-experimental-features.md +++ b/rfc/0013-experimental-features.md @@ -179,8 +179,8 @@ This error message depends on the DSL language used to build the script. *Note: Remove this part if there is already work done on the QSL versioning.* While the actual versioning rules have to be defined in a separate RFC, there can be already certain rules that will have to be respected on experimental code: -- When experimental code changes, the version of the module must not change, only the build number/hash has to be incremented. (In no case an experimental changes not accompanied with deprecation or breaking changes in non-experimental code) -- If following the SemVer versioning convention, adding a new experimental feature can warrant the change of a PATCH or a MINOR value in the event of the feature changing significant parts of the code source that is used by non-experimental features. +- A change in experimental code has to engage **at least** minor bump of the related module. +- Experimental code stabilization has to engage a **major** version bump. # Drawbacks From 69d60de0000306f48d6296993baddc1bd9892f9d Mon Sep 17 00:00:00 2001 From: Redblueflame Date: Mon, 3 May 2021 23:59:12 +0200 Subject: [PATCH 5/6] Updated the versioning part. --- rfc/0013-experimental-features.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/rfc/0013-experimental-features.md b/rfc/0013-experimental-features.md index 40b8c923..e4256095 100644 --- a/rfc/0013-experimental-features.md +++ b/rfc/0013-experimental-features.md @@ -179,8 +179,8 @@ This error message depends on the DSL language used to build the script. *Note: Remove this part if there is already work done on the QSL versioning.* While the actual versioning rules have to be defined in a separate RFC, there can be already certain rules that will have to be respected on experimental code: -- A change in experimental code has to engage **at least** minor bump of the related module. -- Experimental code stabilization has to engage a **major** version bump. +- A change in experimental code has to engage **at least** a patch bump of the related module, upped to a minor bump in the case of an API change. +- Experimental code stabilization has to engage **at least** a minor version bump. # Drawbacks From fd2986fb9037bda4a1e132cf0895e883c2e1058a Mon Sep 17 00:00:00 2001 From: Redblueflame Date: Tue, 4 May 2021 00:02:17 +0200 Subject: [PATCH 6/6] Changed the experimental section to explain the reasoning Thanks glitch :) --- rfc/0013-experimental-features.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/rfc/0013-experimental-features.md b/rfc/0013-experimental-features.md index e4256095..c42050cd 100644 --- a/rfc/0013-experimental-features.md +++ b/rfc/0013-experimental-features.md @@ -179,8 +179,8 @@ This error message depends on the DSL language used to build the script. *Note: Remove this part if there is already work done on the QSL versioning.* While the actual versioning rules have to be defined in a separate RFC, there can be already certain rules that will have to be respected on experimental code: -- A change in experimental code has to engage **at least** a patch bump of the related module, upped to a minor bump in the case of an API change. -- Experimental code stabilization has to engage **at least** a minor version bump. +- A change in experimental code results in a version bump as normal with SemVer, with the exception that breaking changes cause a minor version bump instead of a major version bump. +- Stabilization of experimental code results in a minor version bump (or, if coinciding with a deprecation cycle, a major version bump), as it is adding new API features for mods that did not opt-in to the experimental features. # Drawbacks