| 
									
										
										
										
											2017-01-26 22:30:42 -08:00
										 |  |  |  | # Triage Process and Github Labels for Angular
 | 
					
						
							| 
									
										
										
										
											2015-06-03 13:04:24 -07:00
										 |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-07 14:10:01 -07:00
										 |  |  |  | This document describes how the Angular team uses labels and milestones  | 
					
						
							| 
									
										
										
										
											2016-10-05 14:40:01 -07:00
										 |  |  |  | to triage issues on github. The basic idea of the process is that | 
					
						
							| 
									
										
										
										
											2016-09-07 14:10:01 -07:00
										 |  |  |  | caretaker only assigns a component and type (bug, feature) label. The  | 
					
						
							|  |  |  |  | owner of the component than is in full control of how the issues should  | 
					
						
							|  |  |  |  | be triaged further. | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | Once this process is implemented and in use, we will revisit it to see  | 
					
						
							|  |  |  |  | if further labeling is needed. | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | ## Components
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | A caretaker should be able to determine which component the issue  | 
					
						
							|  |  |  |  | belongs to. The components have a clear piece of source code associated | 
					
						
							|  |  |  |  | with it. | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | * `comp: animations`: `@matsko` | 
					
						
							|  |  |  |  | * `comp: benchpress`: `@tbosch` | 
					
						
							| 
									
										
										
										
											2016-10-04 16:13:32 -07:00
										 |  |  |  | * `comp: build & ci`: `@IgorMinar` -- All build and CI scripts  | 
					
						
							| 
									
										
										
										
											2016-09-07 14:10:01 -07:00
										 |  |  |  | * `comp: common`: `@mhevery`  -- This includes core components / pipes. | 
					
						
							| 
									
										
										
										
											2016-10-04 16:13:32 -07:00
										 |  |  |  | * `comp: core & compiler`: `@tbosch` -- Because core and compiler are very  | 
					
						
							| 
									
										
										
										
											2016-09-07 14:10:01 -07:00
										 |  |  |  |   intertwined, we will be treating them as one. | 
					
						
							|  |  |  |  | * `comp: forms`: `@kara` | 
					
						
							|  |  |  |  | * `comp: http`: `@jeffbcross` | 
					
						
							|  |  |  |  | * `comp: i18n`: `@vicb` | 
					
						
							| 
									
										
										
										
											2016-12-08 15:42:34 -08:00
										 |  |  |  | * `comp: language service`: `@chuckjaz` | 
					
						
							| 
									
										
										
										
											2016-09-07 14:10:01 -07:00
										 |  |  |  | * `comp: metadata-extractor`: `@chuckjaz` | 
					
						
							| 
									
										
										
										
											2016-12-08 15:42:34 -08:00
										 |  |  |  | * `comp: router`: `@vicb` | 
					
						
							| 
									
										
										
										
											2016-09-07 14:10:01 -07:00
										 |  |  |  | * `comp: testing`: `@juliemr` | 
					
						
							|  |  |  |  | * `comp: upgrade`: `@mhevery` | 
					
						
							|  |  |  |  | * `comp: web-worker`: `@vicb` | 
					
						
							| 
									
										
										
										
											2016-10-04 16:13:32 -07:00
										 |  |  |  | * `comp: zones`: `@mhevery` | 
					
						
							| 
									
										
										
										
											2016-09-07 14:10:01 -07:00
										 |  |  |  | 
 | 
					
						
							|  |  |  |  | There are few components which are cross-cutting. They don't have | 
					
						
							|  |  |  |  | a clear location in the source tree. We will treat them as a component | 
					
						
							|  |  |  |  | even thought no specific source tree is associated with them. | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-05 14:40:01 -07:00
										 |  |  |  | * `comp: docs`: `@naomiblack` | 
					
						
							| 
									
										
										
										
											2016-10-04 16:13:32 -07:00
										 |  |  |  | * `comp: packaging`: `@IgorMinar` | 
					
						
							| 
									
										
										
										
											2016-09-07 14:10:01 -07:00
										 |  |  |  | * `comp: performance`: `@tbosch` | 
					
						
							|  |  |  |  | * `comp: security`: `@IgorMinar` | 
					
						
							| 
									
										
										
										
											2015-06-03 13:04:24 -07:00
										 |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-07 14:10:01 -07:00
										 |  |  |  | ## Type
 | 
					
						
							|  |  |  |  | What kind of problem is this? | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | * `type: RFC / discussion / question` | 
					
						
							|  |  |  |  | * `type: bug` | 
					
						
							|  |  |  |  | * `type: chore` | 
					
						
							|  |  |  |  | * `type: feature` | 
					
						
							|  |  |  |  | * `type: performance` | 
					
						
							|  |  |  |  | * `type: refactor` | 
					
						
							| 
									
										
										
										
											2015-06-03 13:04:24 -07:00
										 |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-07 14:10:01 -07:00
										 |  |  |  | ## Caretaker Triage Process
 | 
					
						
							| 
									
										
										
										
											2015-06-03 13:04:24 -07:00
										 |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-05 14:40:01 -07:00
										 |  |  |  | It is the caretaker's responsibility to assign `comp:  *` to each new | 
					
						
							|  |  |  |  | issue as they come in. The reason why we limit the responsibility of the | 
					
						
							| 
									
										
										
										
											2016-10-05 14:41:00 -07:00
										 |  |  |  | caretaker to this one label is that it is likely that without domain | 
					
						
							| 
									
										
										
										
											2016-10-05 14:40:01 -07:00
										 |  |  |  | knowledge the caretaker could mislabel issues or lack knowledge of | 
					
						
							|  |  |  |  | duplicate issues. | 
					
						
							| 
									
										
										
										
											2015-06-03 13:04:24 -07:00
										 |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-07 14:10:01 -07:00
										 |  |  |  | ## Component's owner Triage Process
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | At this point we are leaving each component owner to determine their own | 
					
						
							|  |  |  |  | process for their component. | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | It will be up to the component owner to determine the order in which the | 
					
						
							|  |  |  |  | issues within the component will be resolved. | 
					
						
							| 
									
										
										
										
											2015-06-03 13:04:24 -07:00
										 |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-05 14:41:00 -07:00
										 |  |  |  | Several owners have adopted the issue categorization based on | 
					
						
							|  |  |  |  | [user pain](http://www.lostgarden.com/2008/05/improving-bug-triage-with-user-pain.html) | 
					
						
							| 
									
										
										
										
											2017-01-26 22:30:42 -08:00
										 |  |  |  | used by AngularJS. In this system every issue is assigned frequency and | 
					
						
							| 
									
										
										
										
											2016-10-05 14:41:00 -07:00
										 |  |  |  | severity based on which the total user pain score is calculated. | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | Following is the definition of various frequency and severity levels: | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 1. `freq(score): *` – How often does this issue come up? How many developers does this affect? | 
					
						
							|  |  |  |  |     * low (1) - obscure issue affecting a handful of developers | 
					
						
							|  |  |  |  |     * moderate (2) - impacts auxiliary usage patterns, only small number of applications are affected | 
					
						
							|  |  |  |  |     * high (3) - impacts primary usage patterns, affecting most Angular apps | 
					
						
							|  |  |  |  |     * critical (4) - impacts all Angular apps | 
					
						
							|  |  |  |  | 1. `severity(score): *` - How bad is the issue? | 
					
						
							|  |  |  |  |     * inconvenience (1) - causes ugly/boilerplate code in apps | 
					
						
							|  |  |  |  |     * confusing (2) - unexpected or inconsistent behavior; hard-to-debug | 
					
						
							|  |  |  |  |     * broken expected use (3) - it's hard or impossible for a developer using Angular to accomplish something that Angular should be able to do | 
					
						
							|  |  |  |  |     * memory leak (4) | 
					
						
							|  |  |  |  |     * regression (5) - functionality that used to work no longer works in a new release due to an unintentional change | 
					
						
							|  |  |  |  |     * security issue (6) | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | These criteria are then used to calculate a "user pain" score as follows: | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | `pain = severity × frequency` | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-06-03 13:04:24 -07:00
										 |  |  |  | ### Assigning Issues to Milestones
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | Any issue that is being worked on must have: | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-05 14:41:00 -07:00
										 |  |  |  | * An `Assignee`: The person doing the work. | 
					
						
							| 
									
										
										
										
											2015-06-03 13:04:24 -07:00
										 |  |  |  | * A `Milestone`: When we expect to complete this work. | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | We aim to only have at most three milestones open at a time: | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | * Closing Milestone: A milestone with a very small number of issues, about to release.  | 
					
						
							|  |  |  |  | * Current Milestone: Work that we plan to complete within one week. | 
					
						
							|  |  |  |  | * Next Milestone: Work that is > 1 week but current for the team. | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | The [backlog](https://github.com/angular/angular/issues?q=is%3Aopen+is%3Aissue+no%3Amilestone)  | 
					
						
							|  |  |  |  | consists of all issues that have been triaged but do not have an assignee or milestone.   | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-07 14:10:01 -07:00
										 |  |  |  | ## Triaged vs Untrained PRs
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | PRs should also be label with a `comp: *` so that it is clear which  | 
					
						
							|  |  |  |  | primary area the PR effects. | 
					
						
							| 
									
										
										
										
											2015-06-03 13:04:24 -07:00
										 |  |  |  | 
 | 
					
						
							|  |  |  |  | Because of the cumulative pain associated with rebasing PRs, we triage PRs daily, and  | 
					
						
							|  |  |  |  | closing or reviewing PRs is a top priority ahead of other ongoing work.  | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | Every triaged PR must have a `pr_action` label assigned to it and an assignee: | 
					
						
							|  |  |  |  |   | 
					
						
							| 
									
										
										
										
											2015-08-10 11:45:50 -07:00
										 |  |  |  | * `pr_action: review` -- work is complete and comment is needed from the assignee. | 
					
						
							| 
									
										
										
										
											2015-06-03 13:04:24 -07:00
										 |  |  |  | * `pr_action: cleanup` -- more work is needed from the current assignee.  | 
					
						
							|  |  |  |  | * `pr_action: discuss` -- discussion is needed, to be led by the current assignee. | 
					
						
							| 
									
										
										
										
											2015-08-10 11:45:50 -07:00
										 |  |  |  | * `pr_action: merge` -- the PR should be merged. Add this to a PR when you would like to  | 
					
						
							|  |  |  |  |   trigger automatic merging following a successful build. This is described in [COMMITTER.md](COMMITTER.md). | 
					
						
							| 
									
										
										
										
											2015-06-03 13:04:24 -07:00
										 |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-08-10 11:45:50 -07:00
										 |  |  |  | In addition, PRs can have the following states: | 
					
						
							| 
									
										
										
										
											2015-06-03 13:04:24 -07:00
										 |  |  |  | 
 | 
					
						
							|  |  |  |  | * `pr_state: LGTM` -- PR may have outstanding changes but does not require further review. | 
					
						
							|  |  |  |  | * `pr_state: WIP` -- PR is experimental or rapidly changing. Not ready for review or triage. | 
					
						
							|  |  |  |  | * `pr_state: blocked` -- PR is blocked on an issue or other PR. Not ready for review or triage. | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | Note that an LGTM state does not mean a PR is ready to merge: for example, a reviewer might set the | 
					
						
							|  |  |  |  | LGTM state but request a minor tweak that doesn't need further review, e.g., a rebase or small  | 
					
						
							|  |  |  |  | uncontroversial change. | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | PRs do not need to be assigned to milestones, unless a milestone release should be held for that  | 
					
						
							|  |  |  |  | PR to land. | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | ## Special Labels
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | ### action:design
 | 
					
						
							| 
									
										
										
										
											2015-06-03 20:44:50 -07:00
										 |  |  |  | More active discussion is needed before the issue can be worked on further. Typically used for  | 
					
						
							|  |  |  |  | `type: feature` or `type: RFC/discussion/question` | 
					
						
							| 
									
										
										
										
											2015-06-03 13:04:24 -07:00
										 |  |  |  | 
 | 
					
						
							|  |  |  |  | [See all issues that need discussion](https://github.com/angular/angular/labels/action:%20Design) | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | ### cla
 | 
					
						
							|  |  |  |  | Managed by googlebot. Indicates whether a PR has a CLA on file for its author(s). Only issues with  | 
					
						
							|  |  |  |  | `cla:yes` should be merged into master. | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | ### WORKS_AS_INTENDED
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-06-05 11:20:05 -07:00
										 |  |  |  | Only used on closed issues, to indicate to the reporter why we closed it. |