We use GitHub issues and milestones to track our work. We use four categories of issues:
Theme. These are big initiatives, each will have a dedicated document and owner. These are often cross-cutting features across the product. We'll have very few of these (less than ten per release usually).
Epic. This is a higher level grouping of related user stories, it can span up to the entire release.
User story. An explanation of the feature written from the perspective of the end user. Its purpose is to articulate how a software feature will provide value to the customer. Once implemented, it will contribute value towards the overall epic.
Task. These are all other work items. These could be bugs, features, or developer tasks. We leave it up to the engineering team/area owner how and if they want to use these.
The type of an issue in GitHub is tracked via a label. Each issue should only have a single one of these labels:
- If no label is present, the issue is assumed to be a Task.
It is expected that a
Theme is decomposed into multiple
issues, each of which in turn are decomposed into multiple
Status:Proposed. Indicates that the work is proposed, pending reviews.
Status:Committed. Indicates that we intend to deliver this work.
Status:InProgress. Indicates that the work has started.
Status:Completed. Indicates that the work is completed.
Status:Cut. Indicates that we no longer plan to complete this work.
Open issues should be marked as either
Closed issues should be marked as either
Parent/child relationshipsThe children of an issue are found by parsing the markdown of the issue description. In order to link a child, you need to include it in task list. Any of the following links are recognized:
You can also link to Azure DevOps items and queries from GitHub issues. Those are always considered private. The Azure DevOps queries can be flat or hierarchical but indexing will always include all children, regardless of query type. It is also possible to link a parent issue. This is useful when the child is in a private repository while the parent is in public repository. This avoids having to publicy link to a private issue. This is done by putting a link like this anywhere in the child's issue description:
- [ ] #123 - [ ] org/repo#123 - [ ] https://github.com/org/repo/issues/123 - [ ] [SomeLink](https://github.com/org/repo/issues/123) - [ ] https://foo.visualstudio.com/bar/_queries/query/5cc24ce1-2bec-4ba8-80df-ccdf86131d99/ - [ ] https://foo.visualstudio.com/foo/_queries/edit/1267177
Teams and areas
For the most part, your issues should be automatically tagged with the corresponding area and team, based on the subscription configuration, which can be found in the (private) repo here:
This file lets you automatically map issues to areas and teams based on repo and
area: path labels.
Teams are generally associated with a list of areas. However, you can still label an issue explicitly for a
team by applying a label like
Team:Libraries. This is useful for themes and epics that live in
an other unrelated repo for your team.