Experimentation with new ideas is essential for successful innovation. However, we do not have a consistent or successful pattern for running larger scale experimental projects based on the .NET runtime today. For lack of better options, .NET runtime experiments live in dotnet/runtime directly (Utf8String) or in separate repo with unclear messaging (CoreRT). This discourages innovation and creates confusion among both our team and customers. That's the opposite of what we want.
We need to establish a pattern to run experimental projects that:
We are proposing to create a new dotnet/runtimelab repo as a shared place to hosts experimental projects based on the .NET runtime. This repo is going to be a fork of dotnet/runtime. Each experiment is going to live in its own branch in this repo. The master branch of dotnet/runtimelab is going to have the list of experiments and the branches they use to help with discoverability.
The spirit is the same as with corefxlab. The key differences are that this spans the whole .NET runtime and that the experiments can be done across full stack by leveraging code from dotnet/runtime. The active experiments from corefxlab will be moved to runtimelab, and corefxlab repo will be archived.
The packages are going to be published to dedicated NuGet feed. The packages are not going to be published to nuget.org. Same as corefxlab today. We only publish packages to nuget.org that we can commit to customers using in production apps.
The packages from dotnet/runtimelab are not supported by the .NET team for use in production. The packages published by dotnet/runtimelab do not have stable releases nor receive servicing fixes. Same as corefxlab today.
It is still fine to do small scale experiments in dotnet/runtime directly if:
An example of a small scale experiment that is perfectly fine to do in dotnet/runtime directly is ValueTask Pooling.
The experiment must be sponsored by a dotnet/runtime contributor with commit permissions who has enough time to run it. The contributor and commit right permission model for the dotnet/runtimelab is identical to dotnet/runtime.
The process for this is no different from ordinary features. The experiment has to demonstrate its value, public APIs need to go through API review, etc. Logistically, the relevant code is manually copied from dotnet/runtimelab to dotnet/runtime and deleted in dotnet/runtimelab. Same as corefxlab today.
The Native AOT form-factor CoreRT project, based on the CoreCLR GC and RyuJIT, is going to be one of experiments hosted in dotnet/runtimelab. This is different from the plan published in Consolidating .NET GitHub Repos announcement.
The engineering system for dotnet/runtimelab is going to be focused on ensuring that the experimental projects are usable and not completely broken. It is not going to guarantee high quality across all platforms. As such, it is going be much more lightweight compared to the engineering system of dotnet/runtime.
If an experiment requires additional validation, it will be addressed on a case-by-case basis.
I couldn't figure out the best area label to add to this issue. Please help me learn by adding exactly one area label.
Logistically, the relevant code is manually copied from dotnet/runtimelab to dotnet/runtime and deleted in dotnet/runtimelab. Same as corefxlab today
I suppose this means rebase the fork and then merge from the fork, right?
Thanks for getting this proposal up! Do you have an idea of how this might work with larger-scale changes?
For example, let's say we were trying to stand up Span<T> today. This would touch almost every facet of the product: corelib, System.Runtime APIs, and pretty much every System.* package, really. Is the idea that the "span-ified" runtime would basically be an entirely separate SxS release? So anybody who wanted to use it would need to pull down the experimental corelib, and the experimental System.Runtime, (and the rest of the SDK), etc.?
Do you have an idea of how this might work with larger-scale changes?
I expect that the experiments will be building runtime refs and packs that will allow people to publish self-contained app with the experimental runtime using regular SDK. I do not expect that the experiments will try to build shared framework integrated into SDK.
pretty much every System.* package
The goal of the experiments should be to gather the data to prove the feature. It do not expect that we will do 100% of the productized implementation in dotnet/runtimelab, and then just integrate it over. It will be more like do first 10%-20% in runtimelab, and if it is proven, do the remaining 80% in dotnet/runtime.
I suppose this means rebase the fork and then merge from the fork, right?
Depends. It is one of the possible strategies. For the experiments we have done in the past, we often found that we want to do things slightly differently for real or that we do not want to include everything that was prototyped in the experiment. Selective copy may be more appropriate for these case.
https://github.com/dotnet/runtimelab is created now and the experiments are starting to live there. Woo-hoo!
https://github.com/dotnet/runtimelab/blob/master/README.md has a link back to this issue for context.
Most helpful comment
I expect that the experiments will be building runtime refs and packs that will allow people to publish self-contained app with the experimental runtime using regular SDK. I do not expect that the experiments will try to build shared framework integrated into SDK.
The goal of the experiments should be to gather the data to prove the feature. It do not expect that we will do 100% of the productized implementation in dotnet/runtimelab, and then just integrate it over. It will be more like do first 10%-20% in runtimelab, and if it is proven, do the remaining 80% in dotnet/runtime.
Depends. It is one of the possible strategies. For the experiments we have done in the past, we often found that we want to do things slightly differently for real or that we do not want to include everything that was prototyped in the experiment. Selective copy may be more appropriate for these case.