Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Issue 854] ADR for 30k deliverable reporting strategy #926

Merged
merged 19 commits into from
Jan 22, 2024
Merged
Changes from 9 commits
Commits
Show all changes
19 commits
Select commit Hold shift + click to select a range
b487cc3
feat: Adds deliverable reporting strategy ADR
widal001 Dec 18, 2023
43d05f9
feat: Evaluates options for assigning issues to deliverables
widal001 Dec 18, 2023
0661f65
feat: Evaluates options for filtering 30k deliverables
widal001 Dec 18, 2023
3d70ab1
refactor: Adds missing deciders and adds todo
widal001 Dec 18, 2023
9f88806
Merge branch 'main' into issue-854-30k-deliverable-reporting-strategy
widal001 Dec 18, 2023
dfc9101
fix: Typo in decision drivers section
widal001 Dec 18, 2023
d51afe0
feat: Adds tips with bottom line details about options
widal001 Dec 19, 2023
67f8262
feat: Adds recommendation to ADR
widal001 Dec 20, 2023
631f579
Merge branch 'main' into issue-854-30k-deliverable-reporting-strategy
widal001 Dec 20, 2023
37e3a11
feat: Adds option for creating milestones per 10k
widal001 Jan 5, 2024
4ecc6ff
feat: Adds some other cons to the reporting options
widal001 Jan 5, 2024
5831bfa
fix: Incorporates PR comments
widal001 Jan 5, 2024
e21130f
feat: Adds steps and examples to reporting ADR
widal001 Jan 5, 2024
ae880e0
feat: Adds comparison table and links to examples
widal001 Jan 5, 2024
fee52b5
Merge branch 'main' into issue-854-30k-deliverable-reporting-strategy
widal001 Jan 5, 2024
323af9b
Merge branch 'main' into issue-854-30k-deliverable-reporting-strategy
widal001 Jan 16, 2024
6808467
fix: Incorporates feedback from PR review
widal001 Jan 16, 2024
1b876b4
fix: Typo in reporting strategy ADR
widal001 Jan 16, 2024
2fc0e7a
Merge branch 'main' into issue-854-30k-deliverable-reporting-strategy
widal001 Jan 17, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,235 @@
# 30k ft deliverable reporting strategy

- **Status:** Active <!-- REQUIRED -->
- **Last Modified:** 2023-12-18 <!-- REQUIRED -->
- **Related Issue:** [#854](https://github.com/HHS/simpler-grants-gov/issues/854) <!-- RECOMMENDED -->
- **Deciders:** <!-- REQUIRED -->
- Lucas Brown
- Sarah Knopp
- Sumi Thaiveettil
- Aaron Couch
- Esther Oke
- Billy Daly
- **Tags:** analytics, github

## Context and Problem Statement

In order to report on the progress we're making toward our 30,000 foot deliverables (30k deliverables), we need to be able to connect those deliverables to the ground-level tasks that need to be completed for delivery. Being able to reliably identify which tasks are required for a given deliverable not only enables us to report key metrics like burnup or percent completion for each deliverable, it also allows us to understand which deliverables are being worked on within a given sprint.

Currently, however, we do not have a consistent strategy for indicating which 30k deliverable a given issue is associated with. For custom reporting, we have been using the milestone that an issue is assigned to as a proxy for its 30k deliverable, and for our sprint board, we've been using issue labels to drive filtering and reporting. The fact that we represent this hierarchy differently across reporting channels creates an additional maintenance overhead and increases the likelihood of presenting conflicting information between reports.
widal001 marked this conversation as resolved.
Show resolved Hide resolved

Additionally, as the number of 30k deliverables defined for the project grows, we'll need to adjust our strategy for including them in project reporting. By default, we include all 30k deliverables in our reports, but this results in a large chart where in which many deliverables have no points or issues assigned to them. In order to more accurately reflect the status of our deliverables, we need to determine when and how to include them in reporting.

In light of these needs, the goal of this ADR is to:

1. Recommend a consistent strategy for assigning issues to a parent 30k deliverable across reporting channels
2. Recommend an approach to limiting the number of 30k deliverables that appear in our reports

## Decision Drivers <!-- RECOMMENDED -->
widal001 marked this conversation as resolved.
Show resolved Hide resolved

### Assigning issues to deliverables

Our recommended strategy for assigning issues to a given 30k deliverable should consider the following criteria:

- Users assigning an issue to a 30k deliverable should only need to update that value in one place
- Users should be able to search or filter for the issues assigned to a given 30k deliverable
- Users should be able to group by 30k deliverables in the sprint board and in [GitHub insights reporting][github-insights]
- The relationship between issues and 30k deliverables should be consistently represented across all reports
widal001 marked this conversation as resolved.
Show resolved Hide resolved

### Limiting the 30k deliverables included in reporting

Our recommended approach to limiting the deliverables that are included in reporting should consider the following criteria:

- The logic for including a 30k deliverable in reporting should be clear and easy to understand
- Users should be able to add or remove a given 30k deliverable from reports without having to change the underlying logic
widal001 marked this conversation as resolved.
Show resolved Hide resolved
- If necessary, users should be able to change the reporting logic without rewriting significant sections of the source code

## Options considered

### Assigning issues to deliverables

- **Milestones:** Add the issue to a milestone that represents a 30k deliverable
- **Labels:** Tag the issue with a label that represents a 30k deliverable
- **Deliverable column:** Add a custom "deliverable" column to the GitHub projects with values representing each 30k deliverable
- **Reserved phrase:** Use a reserved phrase to tag a 30k deliverable in the body of the issue

### Limiting the 30k deliverables included in reporting

- **Label:** Use a label to indicate when a deliverable should be included in reporting
- **Status:** Use the status of the deliverable in the provisional roadmap project
- **GitHub action:** Explicitly list the deliverables to include in the GitHub action for reporting

## Decision outcomes <!-- REQUIRED -->

### Assigning issues to deliverables

We've decided to use a "deliverable" column to assign issues to a parent 30k deliverable. This involves:

- creating a single select column in both the product roadmap and the sprint board
- populating that column with options that represent each 30k deliverables in our roadmap
- using that column to indicate the 30k deliverable that an issue is assigned to

- **Positive outcomes**
- We can filter, group, and sort issues by deliverable in GitHub projects and GitHub's automated insight reporting.
widal001 marked this conversation as resolved.
Show resolved Hide resolved
- The engineering team can continue to use GitHub milestones to organize issues into units of work that are smaller than a 30k deliverable.
widal001 marked this conversation as resolved.
Show resolved Hide resolved
- **Negative outcomes**
widal001 marked this conversation as resolved.
Show resolved Hide resolved
- We won't be able to filter for issues assigned to a given 30k deliverable within the GitHub repository.
- We'll have to make sure the list of options in the deliverable column is consistent across GitHub projects in order to join issues from different projects correctly in our custom reporting.
- We'll have to update the current logic in our custom reporting so that issues are joined to their parent deliverable using the value of this column.

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
- When creating a new Issue, it's not sufficient to add that Issue to a Milestone; it must also be added to the 30k deliverable for that Milestone for reporting purposes. We will need to monitor for Issues that do not have a 30k and triage them regularly.

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm still wondering if we might make it easier to associate Issues with the appropriate Milestone and 30k deliverable. One idea that comes to mind is prefixing all Milestone titles with an ID that matches the ID of the deliverable — e.g.:

  • Issue #n has the title "[30k ]: My Deliverable Name"
  • The deliverable column uses that Issue's ID in its title, e.g. "[#n]: My Deliverable Name"
  • Milestones that address that deliverable use that same ID in their titles, e.g. "[#n]: My Milestone Name"
  • Then, when creating an Issue, it is clear that you should choose a Milestone and deliverable that are prefixed with same ID. This may make it easier to choose the right deliverable when it is not apparent which 30k a Milestone addresses, or for individual contributors who are closer to the ground, more concerned with Milestones, and unsure with which 30k an individual ticket addresses.

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

One idea that comes to mind is prefixing all Milestone titles with an ID that matches the ID of the deliverable

I like this idea as a way to make the intended deliverable clear, though I worry it could introduce discrepancies if an issue gets reassigned to a different deliverable but forgets to update the title of the issue as well.

Part of the reason we created this ADR was to limit the "sources of truth" that associate an issue to a deliverable.

> [!NOTE]
widal001 marked this conversation as resolved.
Show resolved Hide resolved
> If the team finds a consistent need to filter the list of issues by deliverable within the repository, we may revisit this decision and choose to use ***both*** a label and a deliverable column to assign an issue to a 30k deliverable. We've decided **not** to use both options for the time being to avoid having multiple (potentially conflicting) ways of assigning an issue to a given deliverable.

### Limiting the 30k deliverables included in reporting

We've decided to use the status of the deliverable in the product roadmap board to determine when deliverables are included or excluded from reporting.
widal001 marked this conversation as resolved.
Show resolved Hide resolved

- **Positive outcomes**
- Keeps our reporting strategy closed aligned with how we're monitoring our delivery progress.
- Avoids creating *another* field or label that needs to be maintained separately.
- **Negative outcomes**
- Tightly couples reporting logic with delivery management, which may introduce challenges if there are instances in which we want to report on some but not all deliverables in a given status.
- If stakeholders aren't familiar with the relationship between deliverable status and reporting, it may be harder for them to understand why certain deliverables appear in a given report but others do not.

## Evaluation - Assigning issues to deliverables <!-- OPTIONAL -->

### Milestone
widal001 marked this conversation as resolved.
Show resolved Hide resolved

This option involves creating a milestone for each 30k deliverable and assigning issues to that milestone if they are required for delivery of that 30k.

> [!NOTE]
> This is a slightly different use of milestones than the project currently supports. Right now, the engineering team can create multiple milestones for a given 30k deliverable and reporting is driven by tagging the parent 30k deliverable in the description of the milestone. This new approach would require a *single* milestone per 30k deliverable and all tickets associated with that deliverable would need to be added to the milestone to be included in reporting.

> [!TIP]
> **Bottom line:** This is the best option if we:
widal001 marked this conversation as resolved.
Show resolved Hide resolved
> - want a consistent way to filter and group issues by deliverable across all GitHub projects and reporting as well as within the repository
> - but are okay with preventing the engineering team from using milestones to organize issues into smaller units of work


- **Pros**
- Ensures that there is just one source of truth for the list of issues associated with a given 30k deliverable.
- Supports filtering both within the repository and within GitHub projects (e.g. roadmap and sprint board).
- Supports grouping both within the GitHub projects and within GitHub insight reporting.
- **Cons**
- Prevents the engineering team from using GitHub milestones to organize and group related issues outside of the 30k deliverable framework.
- Milestones that represent 30k deliverables will have a *lot* of tickets unless we work on downscoping 30k deliverables.
- Does not support customizing the order of the groups on the sprint board when grouping by milestone -- milestones can only be sorted alphabetically.
widal001 marked this conversation as resolved.
Show resolved Hide resolved

### Label

This option involves creating a label for each 30k deliverable with a consistent prefix (e.g. `30k: Public launch`) and then applying this label to each of the issues required for delivery of that 30k.

> [!TIP]
> **Bottom line:** This is the best option if:
> - we want a consistent way to filter issues by deliverable in the repository and across GitHub projects
> - but can compromise on being able to **group** by deliverable in GitHub projects or reporting

- **Pros**
- Allows the engineering team to continue to use GitHub milestones to organize issues into units of work that make sense to them.
- Supports filtering both within the repository and within GitHub projects (e.g. roadmap and sprint board).
- **Cons**
- Does not easily support grouping in GitHub projects or GitHub insights reporting.
- Will result in a large number of labels if 30k labels aren't deleted once a 30k deliverable is complete.
widal001 marked this conversation as resolved.
Show resolved Hide resolved

### Deliverable column

This option involves creating a single select "deliverable" column in the GitHub projects, with values for each 30k deliverable, and then selecting the corresponding "deliverable" value for each issue added to the project.

> [!TIP]
> **Bottom line:** This is the best option if:
> - we want a consistent way of filtering, grouping, and sorting issues by deliverable in GitHub projects and reporting
> - but can compromise on being able to filter by deliverable in the **repository**

- **Pros**
- Allows the engineering team to continue to use GitHub milestones to organize issues into units of work that make sense to them.
- Supports filtering within GitHub projects (e.g. roadmap and sprint board).
- Supports grouping within GitHub projects and within GitHub insight reporting.
- Supports customizing the order of groups on the sprint board when grouping by deliverable -- for example we can make "Static site public launch" appear above "GET Opportunities" even though GET opportunities would be first alphabetically.
- **Cons**
- Does not support filtering or searching within the GitHub repository.
- Will result in a large number of values for the deliverable column if not regularly maintained.
widal001 marked this conversation as resolved.
Show resolved Hide resolved
- List of deliverable column values will have to be maintained separately across projects -- inconsistencies between these lists may introduce bugs in custom reporting.
widal001 marked this conversation as resolved.
Show resolved Hide resolved

### Reserved phrase

This option involves tagging a 30k deliverable from the body of each issue using a reserved phrase (e.g. "30k deliverable: #123"). It would function much like [linking a pull request to an issue][linking pull requests] does in GitHub.

> [!TIP]
> **Bottom line:** Probably not the best option unless we only cared about grouping issues by deliverable in custom reporting.

- **Pros**
- Allows the engineering team to continue to use GitHub milestones to organize issues into units of work that make sense to them.
- Easy to parse in custom reporting.
- **Cons**
- Does not support filtering or searching within the GitHub repository.
- Does not support filtering or searching within GitHub projects (e.g. roadmap or sprint board).
- Does not support grouping within GitHub projects or GitHub insight reporting.
- Very difficult to audit or maintain programmatically.

## Evaluation - Limiting 30k deliverables in reporting <!-- OPTIONAL -->

### Label

This option involves creating a label that indicates when a deliverable should be included in reporting (e.g. "add to report") and then filtering for this label in our custom reporting.

> [!NOTE]
> The code should be configured to accept an arbitrary set of labels as filters, so that if the label changes, we only need to change the top-level configuration and not several lines of the source code.

> [!TIP]
> **Bottom line:** This is the best option if we:
> - want an easy way to explicitly indicate when a deliverable should be included or excluded from reporting
> - and are okay with decoupling the reporting logic from the business logic around deliverable status

- **Pros**
- Makes the choice to include a deliverable in a report explicit and easy to understand.
- Enables users to add or remove deliverables from reporting without changing the logic or the source code.
- Makes it easy to change the logic that determines which issue labels are used to include/exclude issues from reporting.
- **Cons**
- Decouples reporting logic from the status of ongoing deliverables. **Note:** this could be a pro or a con depending on how tightly coupled we want reporting and delivery management to be.
- Adds to the already long list of labels in the repository.

### Status

This option involves filtering the deliverables that are included in reporting based on their status in the provisional roadmap project. For example, we may only want to report on deliverables that have the status "In progress" or "Planning".

> [!NOTE]
widal001 marked this conversation as resolved.
Show resolved Hide resolved
> The code should be configured to accept an arbitrary set of statuses as filters, so that if we want to change which statuses are included, we only need to change the top-level configuration and not several lines of the source code.

> [!TIP]
> **Bottom line:** This is the best option if we:
> - want deliverables to automatically be included in reporting once they enter a specific status (e.g. "in progress")
> - and we don't anticipate edge cases that require including or excluding deliverables from reporting despite their status

- **Pros**
- Enables users to add or remove deliverables from reporting without changing the logic or the source code.
- Makes it easy to change the logic that determines which statuses are used to include/exclude issues from reporting.
- Keeps the reporting and delivery management in sync.
widal001 marked this conversation as resolved.
Show resolved Hide resolved
- **Cons**
- Logic behind which deliverables are included in reporting is not as explicit as having a dedicated label.
- Requires the reporting logic to be tightly coupled with the rules for assigning deliverable status.

### GitHub action

This option involves specifying the deliverables we want to include in the reporting within the GitHub action itself, either by name or by issue number.

> [!NOTE]
> The code should be configured to accept an arbitrary list of issue titles or numbers, so that if we want to change which deliverables are included, we only need to change the top-level configuration and not several lines of the source code.

> [!TIP]
> **Bottom line:** This is probably not a good option unless we want to version control when we add or remove deliverables from reporting.

- **Pros**
- Makes the choice to include a deliverable in a report explicit and easy to understand.
- Prevents someone from accidentally removing a deliverable from reporting by changing a label or status.
- **Cons**
- Decouples reporting logic from the status of ongoing deliverables. **Note:** this could be a pro or a con depending on how tightly coupled we want reporting and delivery management to be.
- Does not allow users to add or remove deliverables from reporting without changing a configuration file.
- Prone to error if users enter the wrong issue title or number.

## Links <!-- OPTIONAL -->

- [Linking pull requests to issues][linking-pull-requests]
- [GitHub insights reporting][github-insights]

[linking-pull-requests]: https://docs.github.com/en/get-started/writing-on-github/working-with-advanced-formatting/using-keywords-in-issues-and-pull-requests#linking-a-pull-request-to-an-issue
[github-insights]: https://docs.github.com/en/issues/planning-and-tracking-with-projects/viewing-insights-from-your-project/about-insights-for-projects