diff --git a/.github/ISSUE_TEMPLATE/bug-report.yml b/.github/ISSUE_TEMPLATE/bug-report.yml index 5f9dc709f7f1..7ae393b8f111 100644 --- a/.github/ISSUE_TEMPLATE/bug-report.yml +++ b/.github/ISSUE_TEMPLATE/bug-report.yml @@ -1,6 +1,6 @@ name: Bug Report description: File a bug report -labels: ["t/bug", "s/needs-verification"] +labels: ["t/bug"] assignees: [] body: - type: markdown @@ -28,7 +28,7 @@ body: 3. Click the added button and observe the bug 🐞 Expected outcome: a bug was added - Actual outcome: a ladybug appeared + Actual outcome: a ladybug appeared validations: required: true - type: dropdown diff --git a/.github/fabricbot.json b/.github/fabricbot.json index 99d173c55de2..6db708e844d2 100644 --- a/.github/fabricbot.json +++ b/.github/fabricbot.json @@ -148,7 +148,7 @@ { "name": "activitySenderHasPermissions", "parameters": { - "permissions": "none" + "permissions": "read" } }, { @@ -1336,7 +1336,7 @@ { "name": "addedToMilestone", "parameters": { - "milestoneName": "Future" + "milestoneName": "Backlog" } } ] @@ -1346,12 +1346,12 @@ "issues", "project_card" ], - "taskName": "Comment: Issue moved to Future", + "taskName": "Comment: Issue moved to Backlog", "actions": [ { "name": "addReply", "parameters": { - "comment": "We've moved this issue to the Future milestone. This means that it is not going to be worked on for the coming release. We will reassess the issue following the current release and consider this item at that time." + "comment": "We've moved this issue to the Backlog milestone. This means that it is not going to be worked on for the coming release. We will reassess the backlog following the current release and consider this item at that time. To learn more about our issue management process and to have better expectation regarding different types of issues you can read our [Triage Process](https://github.com/dotnet/maui/blob/main/.github/TriageProcess.md)." } } ] @@ -2005,7 +2005,7 @@ { "name": "addReply", "parameters": { - "comment": "Thanks for the issue report ${issueAuthor}! This issue appears to be a problem with Visual Studio, so we ask that you use the VS feedback tool to report the issue. That way it will get to the routed to the team that owns this experience in VS.\n\nIf you encounter a problem with Visual Studio, we want to know about it so that we can diagnose and fix it. By using the Report a Problem tool, you can collect detailed information about the problem, and send it to Microsoft with just a few button clicks.\n\n1. Go to the [VS feedback tool](https://docs.microsoft.com/visualstudio/ide/how-to-report-a-problem-with-visual-studio?view=vs-2022) to report the issue\n2. Close this bug, and consider adding a link to the VS Feedback issue so that others can follow its activity there.\n\nThis issue will be automatically closed in 3 days if there are no further comments." + "comment": "Thanks for the issue report @${issueAuthor}! This issue appears to be a problem with Visual Studio, so we ask that you use the VS feedback tool to report the issue. That way it will get to the routed to the team that owns this experience in VS.\n\nIf you encounter a problem with Visual Studio, we want to know about it so that we can diagnose and fix it. By using the Report a Problem tool, you can collect detailed information about the problem, and send it to Microsoft with just a few button clicks.\n\n1. Go to the [VS feedback tool](https://docs.microsoft.com/visualstudio/ide/how-to-report-a-problem-with-visual-studio?view=vs-2022) to report the issue\n2. Close this bug, and consider adding a link to the VS Feedback issue so that others can follow its activity there.\n\nThis issue will be automatically closed in 3 days if there are no further comments." } } ] @@ -2196,7 +2196,633 @@ } ] } + }, + { + "taskType": "trigger", + "capabilityId": "IssueResponder", + "subCapability": "IssuesOnlyResponder", + "version": "1.0", + "config": { + "conditions": { + "operator": "and", + "operands": [ + { + "name": "isAction", + "parameters": { + "user": "roubachof", + "action": "opened" + } + }, + { + "operator": "or", + "operands": [ + { + "name": "isActivitySender", + "parameters": { + "user": "roubachof" + } + }, + { + "name": "isActivitySender", + "parameters": { + "user": "davidbritch" + } + } + ] + } + ] + }, + "eventType": "issue", + "eventNames": [ + "issues", + "project_card" + ], + "taskName": "Add 'i/great-reporter' when issue is opened by an author we know opens high quality issues", + "actions": [ + { + "name": "addLabel", + "parameters": { + "label": "i/great-reporter" + } + } + ] + } + }, + { + "taskType": "trigger", + "capabilityId": "IssueResponder", + "subCapability": "IssuesOnlyResponder", + "version": "1.0", + "config": { + "conditions": { + "operator": "and", + "operands": [ + { + "name": "labelAdded", + "parameters": { + "label": "s/try-latest-version" + } + } + ] + }, + "eventType": "issue", + "eventNames": [ + "issues", + "project_card" + ], + "taskName": "Add comment when 's/try-latest-version' is applied to the issue", + "actions": [ + { + "name": "addReply", + "parameters": { + "comment": "Hi @${issueAuthor}. We have added the \"s/try-latest-version\" label to this issue, which indicates that we'd like you to try and reproduce this issue on the latest available public version. This can happen because we think that this issue was fixed in a version that has just been released, or the information provided by you indicates that you might be working with an older version.\n\nYou can install the latest version by installing the latest Visual Studio (Preview) with the .NET MAUI workload installed. If the issue still persists, please let us know with any additional details and ideally a [reproduction project](https://github.com/dotnet/maui/blob/main/.github/repro.md) provided through a GitHub repository.\n\nThis issue will be closed automatically in 7 days if we do not hear back from you by then - please feel free to re-open it if you come back to this issue after that time." + } + } + ] + } + }, + { + "taskType": "scheduled", + "capabilityId": "ScheduledSearch", + "subCapability": "ScheduledSearch", + "version": "1.1", + "config": { + "frequency": [ + { + "weekDay": 0, + "hours": [ + 3, + 15 + ], + "timezoneOffset": 2 + }, + { + "weekDay": 1, + "hours": [ + 3, + 15 + ], + "timezoneOffset": 2 + }, + { + "weekDay": 2, + "hours": [ + 3, + 15 + ], + "timezoneOffset": 2 + }, + { + "weekDay": 3, + "hours": [ + 3, + 15 + ], + "timezoneOffset": 2 + }, + { + "weekDay": 4, + "hours": [ + 3, + 15 + ], + "timezoneOffset": 2 + }, + { + "weekDay": 5, + "hours": [ + 3, + 15 + ], + "timezoneOffset": 2 + }, + { + "weekDay": 6, + "hours": [ + 3, + 15 + ], + "timezoneOffset": 2 + } + ], + "searchTerms": [ + { + "name": "isOpen", + "parameters": {} + }, + { + "name": "hasLabel", + "parameters": { + "label": "s/try-latest-version" + } + }, + { + "name": "noActivitySince", + "parameters": { + "days": 7 + } + } + ], + "taskName": "[Idle Issue Management] Close stale 's/try-latest-version' issues", + "actions": [ + { + "name": "closeIssue", + "parameters": {} + } + ] + } + }, + { + "taskType": "trigger", + "capabilityId": "IssueResponder", + "subCapability": "PullRequestResponder", + "version": "1.0", + "config": { + "conditions": { + "operator": "and", + "operands": [ + { + "name": "activitySenderHasPermissions", + "parameters": { + "permissions": "read" + } + }, + { + "operator": "not", + "operands": [ + { + "name": "isActivitySender", + "parameters": { + "user": "dotnet-maestro" + } + } + ] + }, + { + "operator": "not", + "operands": [ + { + "name": "isActivitySender", + "parameters": { + "user": "dotnet-maestro-bot" + } + } + ] + } + ] + }, + "eventType": "pull_request", + "eventNames": [ + "pull_request", + "issues", + "project_card" + ], + "taskName": "Add 'community ✨' label to community contributions", + "actions": [ + { + "name": "addLabel", + "parameters": { + "label": "community ✨" + } + }, + { + "name": "addReactionToIssue", + "parameters": { + "reaction": "heart" + } + }, + { + "name": "addReply", + "parameters": { + "comment": "Hey there @${issueAuthor}! Thank you so much for your PR! Someone from the team will get assigned to your PR shortly and we'll get it reviewed." + } + } + ] + } + }, + { + "taskType": "scheduled", + "capabilityId": "ScheduledSearch", + "subCapability": "ScheduledSearch", + "version": "1.1", + "config": { + "frequency": [ + { + "weekDay": 0, + "hours": [ + 2, + 5, + 8, + 11, + 14, + 17, + 20, + 23 + ], + "timezoneOffset": 2 + }, + { + "weekDay": 1, + "hours": [ + 2, + 5, + 8, + 11, + 14, + 17, + 20, + 23 + ], + "timezoneOffset": 2 + }, + { + "weekDay": 2, + "hours": [ + 2, + 5, + 8, + 11, + 14, + 17, + 20, + 23 + ], + "timezoneOffset": 2 + }, + { + "weekDay": 3, + "hours": [ + 2, + 5, + 8, + 11, + 14, + 17, + 20, + 23 + ], + "timezoneOffset": 2 + }, + { + "weekDay": 4, + "hours": [ + 2, + 5, + 8, + 11, + 14, + 17, + 20, + 23 + ], + "timezoneOffset": 2 + }, + { + "weekDay": 5, + "hours": [ + 2, + 5, + 8, + 11, + 14, + 17, + 20, + 23 + ], + "timezoneOffset": 2 + }, + { + "weekDay": 6, + "hours": [ + 2, + 5, + 8, + 11, + 14, + 17, + 20, + 23 + ], + "timezoneOffset": 2 + } + ], + "searchTerms": [ + { + "name": "isOpen", + "parameters": {} + }, + { + "name": "isPr", + "parameters": {} + }, + { + "name": "hasLabel", + "parameters": { + "label": "s/pr-needs-author-input" + } + }, + { + "name": "noActivitySince", + "parameters": { + "days": 10 + } + }, + { + "name": "noLabel", + "parameters": { + "label": "stale" + } + } + ], + "taskName": "Stale PR reminder", + "actions": [ + { + "name": "addReply", + "parameters": { + "comment": "Hi @${issueAuthor}.\nIt seems you haven't touched this PR for the last two weeks. To avoid accumulating old PRs, we're marking it as `stale`. As a result, it will be closed if no further activity occurs **within 4 days of this comment**. You can learn more about our Issue Management Policies [here](https://github.com/dotnet/maui/blob/main/.github/IssueManagementPolicies.md)." + } + }, + { + "name": "addLabel", + "parameters": { + "label": "stale" + } + } + ] + } + }, + { + "taskType": "scheduled", + "capabilityId": "ScheduledSearch", + "subCapability": "ScheduledSearch", + "version": "1.1", + "config": { + "frequency": [ + { + "weekDay": 0, + "hours": [ + 3, + 7, + 11, + 15, + 19, + 23 + ], + "timezoneOffset": 2 + }, + { + "weekDay": 1, + "hours": [ + 3, + 7, + 11, + 15, + 19, + 23 + ], + "timezoneOffset": 2 + }, + { + "weekDay": 2, + "hours": [ + 3, + 7, + 11, + 15, + 19, + 23 + ], + "timezoneOffset": 2 + }, + { + "weekDay": 3, + "hours": [ + 3, + 7, + 11, + 15, + 19, + 23 + ], + "timezoneOffset": 2 + }, + { + "weekDay": 4, + "hours": [ + 3, + 7, + 11, + 15, + 19, + 23 + ], + "timezoneOffset": 2 + }, + { + "weekDay": 5, + "hours": [ + 3, + 7, + 11, + 15, + 19, + 23 + ], + "timezoneOffset": 2 + }, + { + "weekDay": 6, + "hours": [ + 3, + 7, + 11, + 15, + 19, + 23 + ], + "timezoneOffset": 2 + } + ], + "searchTerms": [ + { + "name": "isOpen", + "parameters": {} + }, + { + "name": "isPr", + "parameters": {} + }, + { + "name": "hasLabel", + "parameters": { + "label": "s/pr-needs-author-input" + } + }, + { + "name": "hasLabel", + "parameters": { + "label": "stale" + } + }, + { + "name": "noActivitySince", + "parameters": { + "days": 4 + } + } + ], + "taskName": "Close stale PRs", + "actions": [ + { + "name": "closeIssue", + "parameters": {} + } + ] + } + }, + { + "taskType": "trigger", + "capabilityId": "IssueResponder", + "subCapability": "PullRequestResponder", + "version": "1.0", + "config": { + "conditions": { + "operator": "and", + "operands": [ + { + "name": "hasLabel", + "parameters": { + "label": "stale" + } + }, + { + "name": "hasLabel", + "parameters": { + "label": "s/pr-needs-author-input" + } + }, + { + "name": "isActivitySender", + "parameters": { + "user": { + "type": "author" + } + } + }, + { + "operator": "not", + "operands": [ + { + "name": "activitySenderHasPermissions", + "parameters": { + "permissions": "write" + } + } + ] + } + ] + }, + "eventType": "pull_request", + "eventNames": [ + "pull_request", + "issues", + "project_card" + ], + "taskName": "Revitalize stale PR and reopen", + "actions": [ + { + "name": "reopenIssue", + "parameters": {} + }, + { + "name": "removeLabel", + "parameters": { + "label": "stale" + } + }, + { + "name": "removeLabel", + "parameters": { + "label": "s/pr-needs-author-input" + } + } + ] + } + }, + { + "taskType": "trigger", + "capabilityId": "IssueResponder", + "subCapability": "PullRequestResponder", + "version": "1.0", + "config": { + "conditions": { + "operator": "and", + "operands": [ + { + "name": "labelAdded", + "parameters": { + "label": "s/pr-needs-author-input" + } + } + ] + }, + "eventType": "pull_request", + "eventNames": [ + "pull_request", + "issues", + "project_card" + ], + "taskName": "Add comment when 's/pr-needs-author-input' is applied to PR", + "actions": [ + { + "name": "addReply", + "parameters": { + "comment": "Hi @${issueAuthor}. We have added the \"s/pr-needs-author-input\" label to this issue, which indicates that we have an open question/action for you before we can take further action. This PRwill be closed automatically in 14 days if we do not hear back from you by then - please feel free to re-open it if you come back to this PR after that time." + } + } + ] + } } ], "userGroups": [] -} +} \ No newline at end of file diff --git a/docs/IssueManagementPolicies.md b/docs/IssueManagementPolicies.md new file mode 100644 index 000000000000..5755fe520af5 --- /dev/null +++ b/docs/IssueManagementPolicies.md @@ -0,0 +1,27 @@ +# Issue Management Policies + +We have a lot of issue traffic to manage, so we have some policies in place to help us do that. This is a brief summary of some of the policies we have in place and the justification for them. + +## Commenting on closed issues + +In general, we recommend you open a new issue if you have a bug, feature request, or question to discuss. If you find a closed issue that is related, open a *new issue* and link to the closed issue rather than posting on the closed issue. Closed issues don't appear in our triage process, so only the people who have been active on the original thread will be notified of your comment. A new issue will get more attention from the team. + +*In general* we don't mind getting duplicate issues. It's easier for us to close duplicate issues than to discuss multiple root causes on a single issue! We may close your issue as a duplicate if we determine it has the same root cause as another. Don't worry! It's not a waste of our time! + +## Needs Author Feedback + +If a contributor reviews an issue and determines that more information is needed from the author, they will post a comment requesting that information and apply the `s/needs-info` label. This label indicates that the author needs to post a response in order for us to continue investigating the issue. + +If the author does not post a response within **7 days**, the issue will be automatically closed. If the author responds within **7 days** after the issue is closed, the issue will be automatically re-opened. We recognize that you may not be able to respond immediately to our requests, we're happy to hear from you whenever you're able to provide the new information. + +### PR: pending author input +Similar to the `Needs Author Feedback` process above, PRs also require author input from time to time. When a member of our team asks for some follow-up changes from the author, we mark these PRs with `s/pr-needs-author-input` label. After doing so, we expect the author to respond within 14 days. +If the author does not post a response or updates the PR within **14 days**, the PR will be automatically closed. If the author responds within **7 days** after the PR is closed, the PR will be automatically re-opened. We recognize that you may not be able to respond immediately to our requests, we're happy to hear from you whenever you're able to provide the new information. + +## Duplicate issues + +If we determine that the issue is a duplicate of another, we will close the issue and comment with the issue we believe is a duplicate one. Note that we might close an issue as duplicate which is not the one that has been reported the earliest. We might close an issue that has been reported earlier because the later issue has more relevant information and/or discussion. + +## Locking closed issues + +After an issue has been closed and had no activity for **30 days** it will be automatically locked as *resolved*. This is done in order to reduce confusion as to where to post new comments. If you are still encountering the problem reported in an issue, or have a related question or bug report, feel free to open a *new issue* and link to the original (now locked) issue! \ No newline at end of file diff --git a/docs/README.md b/docs/README.md new file mode 100644 index 000000000000..4a5a313437a6 --- /dev/null +++ b/docs/README.md @@ -0,0 +1,14 @@ +Contributor documentation +========================= + +The primary audience for documentation in this folder is contributors to .NET MAUI. +If you are looking for documentation on how to *use* .NET MAUI, go to . + + + +The table below outlines the different docs in this folder and what they are helpful for. + +| Documentation | What is it about? | Who is it for? | +|--------------------------------------------------------------------------|-------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------| +| [Issue management](IssueManagementPolicies.md) | Overview of policies in place to manage issues| Community members and collaborators looking to understand how we handle closed issue, issues that need author feedback, etc | | +| [Triage process](TriageProcess.md)| Overview of the issue triage process used in the repo | Anyone looking to understand the triage process on the repo | \ No newline at end of file diff --git a/docs/ReleasePlanning.md b/docs/ReleasePlanning.md new file mode 100644 index 000000000000..8998d61597d2 --- /dev/null +++ b/docs/ReleasePlanning.md @@ -0,0 +1,47 @@ +Throughout the year we add issues to the `Backlog` milestone as is pointed out in our [Triage Process](TriageProcess.md). +We review all the issues in that milestone once a year, after the work on an upcoming major release is complete. +Given the large number of issues, it takes multiple sessions for teams to review and identify candidates for consideration for the next major release. +This document details the process we use for identifying candidate issues for the next release. + +## Phases +The process for identifying candidates for the next major release consists of multiple phases. In each phase, we filter issues out of the release by either moving them to the `Backlog`, or closing the issue. +- Filtering & Individual priorization +- Rough costing +- Team review & Priority adjustment +- Capacity planning +- Define the cut line + +### Filtering +At this stage all the issues are distributed to engineers by feature areas. Each engineer reviews all the issues within their feature area, and returns to the next meeting with individual priority labels assigned - fl-p1, fl-p2, fl-p3, where `fl` are their initials. + +All the issues which the engineer believes are lower than `Priority-3` - remain in the backlog. We also agree to approximately balance the distribution of the 3 priority labels on the issues that will be brought back by each engineer, so that it forces real prioritization exercise. +The issues which engineers think are good candidates and fit in the above listed requirements are moved to the `.NET V Planning` milestone, where `V` is the upcoming version number. + +### Rough costing +At this phase engineers apply rough cost estimates to the final list of issues that they have moved to the `.NET V Planning` milestone, by applying one of the `Cost: X` labels below, where `X` is the size: + +| **Label** | **Description** | +|--------------|---------------------------------------------------| +| **Cost: S** | Work that requires one engineer up to 1 week | +| **Cost: M** | Work that requires one engineer up to 2 weeks | +| **Cost: L** | Work that requires one engineer up to 4 weeks | +| **Cost: XL** | Work that requires one engineer more than 4 weeks | + +This will be used later during the planning process. + +For issues which don't have a clear description of the associated work, it's important to drop a comment summarizing the work involved. This will help at a later time, in case a question about the cost will be raised. + +**Note**: while costing issues, it's important to reevaluate costs for those, which already have cost labels applied. Those are most probably from the past and may be outdated, not properly representing the cost any more. + +### Team Review & Priority adjustment +Now, that all the issues are in the `.NET V planning` milestone, the team reviews each issue one at a time starting from the highest priority ones (Priority: 1). +We discuss the issues and agree on the priority at this point. Sometimes we make adjustments to the suggested individual priorities. After discussing each issue the `Priority: X` label is applied to each issue. +Each `Priority: 1` issue is then moved to the project board, which will be used by each team for tracking the work for the upcoming release throughout the year. The issues start off in the `Triage` column. At this point we bring only the top priority issues to the board. + +### Capacity Planning +We usually reserve only 50% of the team capacity for this work. The reason is that we will be getting a lot of incoming feedback throughout the year and we need to allocate time for handling this feedback throughout the year. +So we calculate the capacity of the team in weeks for the upcoming year and use half of the final number later in this process. + +### Define the cut line +At this point we have all the candidate issues that we think are worth considering for the upcoming release. This number is quite large, so the teams usually won't have enough capacity to handle all this. +We start stack ranking issues so the most important work remains on the top of the list. We then draw the cut line and that defines the rough list of things the team will work on during the upcoming release. diff --git a/docs/TriageProcess.md b/docs/TriageProcess.md new file mode 100644 index 000000000000..4356e28d0155 --- /dev/null +++ b/docs/TriageProcess.md @@ -0,0 +1,97 @@ +# Triage Process + +Managing a popular GitHub repo with a small team is not an easy task. It requires a good balance between creating new features while handling many investigations and bug fixes associated with existing ones. + +During our time working on Xamarin.Forms and while ramping up with .NET MAUI, the amount of incoming issues has been constantly growing. While this is a sign of a healthy framework and ecosystem surrounding it, it's becoming harder to react to all those issues. +To be able to keep up with ever-evolving expectations, we're introducing a set of rules to help us better handle the incoming issues going forward. + +**Note:** Customers that need help with **urgent investigations** should contact [Microsoft Support](https://dotnet.microsoft.com/platform/support). + +## Goals + +The goals of these rules are listed below in priority order: + +- Make it easy to make triage decisions for each issue filed in this repository +- Be able to easily prioritize issues for each milestone +- Set proper expectations with customers regarding how issues are going to be handled + +## Triage Process Details + +The feature teams should be able look through every single issue filed against this repository and be able to make a quick call regarding the nature of the issue. +We will first categorize the issues and further handle these depending on the category the issue is in. The subsections below represent these categories and the rules we apply for them during our triage meeting. + +### Information Gathering + +In this phase we instruct the user on how to collect the appropriate diagnostics and see if they are able to address the issue with that additional information. When we need user input we will mark the issue with `s/needs-info` label. Issues in this phase may be closed automatically if we do not receive timely responses, they often do not provide enough information for us to investigate further. +We'll try to respond quickly to such issues (within days). If a user has collected all of the relevant diagnostics and the issue is still not apparent, then we will consider it for further [investigation](#investigations) by the team. + +### Feature requests + +As soon as we identify an issue represents an ask for a new feature, we will label the issue with the `t/enhancement ☀️` label. +Most of the time, we will automatically move these issues into the `.NET V Planning` (where V is the .NET version we're planning this for) milestone for further review during one of our [sprint planning meetings](#milestone-planning). +If we think the feature request is not aligned with our goals, we may choose to close it immediately. +In some situations, however, we may choose to collect more feedback before acting on the issue. In these situations we will move the issue in the `Backlog` so that we can review it during the [release planning](#release-planning). + +### Bug reports + +If it's immediately clear, that the issue is related to a bug in the framework, we will apply the `bug` label to the issue. + +At this point, we will try to make a call regarding it's impact and severity. If the issue is critical, we may choose to include it in our current milestone for immediate handling or potentially patching. +If the bug is relatively high impact, we will move the issue into the `.NET V Planning` (where V is the .NET version we're planning this for) milestone to review during our [sprint planning](#milestone-planning) meeting. +If the impact is unclear or the is a very corner case scenario, we may move it to a next `.NET V Planning` or `Backlog` milestone to further evaluate the impact by reviewing customer upvotes / comments at a later time. + +### Investigations + +In many situations it's not immediately clear whether a specific issue reported is a bug or not. To be certain, the team will need to spend time to investigate it before making a call regarding the faith of the issue. In these situations we will apply the `investigate` label to the issue. +In many situations, these issues turn out to be a result of some kind of misconfiguration in the user code. +In some rare situations, however, these turn out to be caused by very impactful issues. So we will make a call during the triage whether we need to immediately investigate certain issues or not. +If not, we will move the investigation to the `.NET V Planning` (where V is the .NET version we're planning this for) to review during one of the upcoming [sprint planning meetings](#milestone-planning). + +### Documentation requests + +Some issues turn out to indicate user confusion around how to configure different aspects of the framework. +When we determine such issues, we will mark these with the `Docs` label and move them into the `.NET V Planning` (where V is the .NET version we're planning this for) milestone to handle at a later time. The goal here will be to fill in the gaps or clarify our documentation, so that customers can be successful by using the guidance provided in the documentation. +If we identify a documentation issue which too many customers are having trouble with, we may choose to address that in current milestone. + +## Milestone Planning + +Our milestones are usually a month long. +Before each milestone we have one or more planning meetings, where we look through all the accumulated issues in the `.NET V Planning` (where V is the .NET version we're planning this for) milestone and choose the most important and impactful ones to handle during the next milestone. This will be a mixture of feature requests, bug fixes, documentation issues as well as some investigations. + +Note, that we will investigate only issues, which have accumulated more than certain number of upvotes and/or comments, which will indicate that there is some wider impact associated with it. +We may not investigate issues which haven't received many votes/comments and choose to close these. The reason is that the impact is very scoped and potentially something is wrong in the user code. Consider asking these questions on StackOverflow, or if a bug is super important to you, please consider contributing to our project yourself. + +For some feature requests and bug reports, depending on the user involvement, we may choose to move these to the backlog at this point. What this means, is that they will not be looked at again up until the next major release planning. + +## Release Planning + +Once we approach to the end of the release cycle (.NET Core 3, .NET 5) we will look through the accumulated issues in the `Backlog` milestone. This is a long process as the amount of issues accumulated in this milestone is quite large. + +We will try to prioritize issues with most community requests / upvotes assuming these are aligned with our goals. +Issues, which we will think are candidates for the upcoming release, will be moved to the `.NET V Planning` (where V is the .NET version we're planning this for) milestone. This process is documented in more details in the [Release Planning](ReleasePlanning.md) document. + +## Cleanup +As we go through all the issues in the Backlog milestone as part of our release planning process, we will also cleanup the milestone by closing low priority issues, which have stayed in the backlog for more than 2 releases. While some of these issues may seem reasonable, the fact that those haven't been addressed for such prolonged period of time indicate that they're not as important for the product as they may seem to be. + +## Process Visualization + +The following diagram summarizes the processes detailed above: + +```mermaid +graph TD + A[Issue] --> B{Triage} + B -->|Bugs| C[Current] + B -->|Bugs, Features,
Investigations, Docs| D[.NET n Planning] + B -->|Bugs, Features, Docs| E[Backlog] + B --> F[Close] + D --> H[Sprint Planning] + E --> G(Release Planning) + G --> H + H --> C + H --> E + G --> F +``` + +## References + +We rely on some automation to help us with this process. You can learn more about some of these by reading our [Issue Management Policies](IssueManagementPolicies.md) document. \ No newline at end of file