{"id":2014,"date":"2024-04-03T23:23:46","date_gmt":"2024-04-03T23:23:46","guid":{"rendered":"https:\/\/www.aviator.co\/blog\/?p=2014"},"modified":"2025-09-25T11:04:39","modified_gmt":"2025-09-25T11:04:39","slug":"introducing-flexreview-teams-and-slo","status":"publish","type":"post","link":"https:\/\/www.aviator.co\/blog\/introducing-flexreview-teams-and-slo\/","title":{"rendered":"Introducing FlexReview Teams and SLO"},"content":{"rendered":"\n<p>Code reviews and code ownership are team based concepts. Building an efficient code review culture requires having a strong partnership between the authors and the reviewers. Additionally, to truly improve the code review cycle times, it\u2019s even more important for the <a href=\"https:\/\/google.github.io\/eng-practices\/review\/reviewer\/speed.html#responses\">individual responses to come quickly<\/a> than it is for the whole process to happen rapidly.<\/p>\n\n\n\n<p><a href=\"https:\/\/www.aviator.co\/flexreview\" title=\"\">FlexReview Teams<\/a> is built with those principles in mind. It provides a customizable framework for managing code review rules, assignments, and notifications, allowing teams to establish their own policies and objectives while facilitating inter-team best practices.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img fetchpriority=\"high\" decoding=\"async\" width=\"922\" height=\"1024\" src=\"https:\/\/www.aviator.co\/blog\/wp-content\/uploads\/2024\/04\/Desktop-3FR-Teams-SLO-config-922x1024.png\" alt=\"flex review teams config\" class=\"wp-image-2016\" srcset=\"https:\/\/www.aviator.co\/blog\/wp-content\/uploads\/2024\/04\/Desktop-3FR-Teams-SLO-config-922x1024.png 922w, https:\/\/www.aviator.co\/blog\/wp-content\/uploads\/2024\/04\/Desktop-3FR-Teams-SLO-config-270x300.png 270w, https:\/\/www.aviator.co\/blog\/wp-content\/uploads\/2024\/04\/Desktop-3FR-Teams-SLO-config-768x853.png 768w, https:\/\/www.aviator.co\/blog\/wp-content\/uploads\/2024\/04\/Desktop-3FR-Teams-SLO-config.png 1082w\" sizes=\"(max-width: 922px) 100vw, 922px\" \/><figcaption class=\"wp-element-caption\">FlexReview Teams config<\/figcaption><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Teams<\/h2>\n\n\n\n<p>At the core of the system is a Team representation. Each FlexReview Team is 1:1 mapped with a unique <a href=\"https:\/\/docs.github.com\/en\/organizations\/organizing-members-into-teams\/about-teams\">GitHub Team<\/a>, and it inherits the configuration from its parent team as specified in GitHub. That means, in a multi-level hierarchy of various engineering teams set up in GitHub, the configurations can be defined at any level, and be trickled down to all children teams.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Code reviews SLO<\/h2>\n\n\n\n<p><a href=\"https:\/\/docs.aviator.co\/flexreview\/concepts\/slo-management\">Service level objective<\/a> (SLO) for code review defines the suggested time it should take the reviewer to respond to a code change. This is <strong>NOT<\/strong> the time it takes for a PR to be approved, but rather just getting a response. This helps the team focus on individual response times instead of focusing on the complete cycle times.<\/p>\n\n\n\n<p>Think of the code review SLO as an agreement between the author and the reviewer for a pull request. With this agreement, the author is incentivized to create smaller PRs that fall within the bounds of the SLO agreement, and reviewers are incentivized to stay on top of the PRs.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Configuration<\/h2>\n\n\n\n<p>There are 3 core configurations for each FlexReview Team:<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">1. Reviewer assignment<\/h3>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><img decoding=\"async\" width=\"498\" height=\"332\" src=\"https:\/\/www.aviator.co\/blog\/wp-content\/uploads\/2024\/04\/review-assigment.png\" alt=\"Review assignment config\" class=\"wp-image-2017\" title=\"Review assignment config\" srcset=\"https:\/\/www.aviator.co\/blog\/wp-content\/uploads\/2024\/04\/review-assigment.png 498w, https:\/\/www.aviator.co\/blog\/wp-content\/uploads\/2024\/04\/review-assigment-300x200.png 300w\" sizes=\"(max-width: 498px) 100vw, 498px\" \/><figcaption class=\"wp-element-caption\">Review assignment config<\/figcaption><\/figure>\n\n\n\n<p>FlexReview Teams support 3 different configurations for reviewer assignment:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Expert reviewer<\/strong>: Aviator uses heuristics from the past code reviews to calculate the expert reviewer for each file in each change. Based on the <a href=\"https:\/\/docs.aviator.co\/flexreview\/reference\/expert-scoring-algorithms\">expertise score<\/a> and the current review load, it chooses the \u201cbest fit\u201d reviewer from the team.<\/li>\n\n\n\n<li><strong>Oncall reviewer<\/strong>: A team can manage oncall schedule using an oncall software, e.g. Pagerduty to automatically assign reviewers based on the rotation priority.<\/li>\n\n\n\n<li><strong>Load balanced:<\/strong> Reviews can also be evenly distributed in the team purely based on the current review load.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">2. Review SLO<\/h3>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><img decoding=\"async\" width=\"608\" height=\"481\" src=\"https:\/\/www.aviator.co\/blog\/wp-content\/uploads\/2024\/04\/slo-config.png\" alt=\"\" class=\"wp-image-2018\" srcset=\"https:\/\/www.aviator.co\/blog\/wp-content\/uploads\/2024\/04\/slo-config.png 608w, https:\/\/www.aviator.co\/blog\/wp-content\/uploads\/2024\/04\/slo-config-300x237.png 300w\" sizes=\"(max-width: 608px) 100vw, 608px\" \/><figcaption class=\"wp-element-caption\">Code review SLO config<\/figcaption><\/figure>\n\n\n\n<p>Managing the review SLO configuration is critical for a healthy code review experience. The configuration is based on:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Internal response time:<\/strong> An internal team review is the code review where both the author is part of the same team that is reviewing the code<\/li>\n\n\n\n<li><strong>External response time<\/strong>: The ones where the author is not part of the<\/li>\n\n\n\n<li><strong>Max number of modified lines<\/strong>: These are the total modified lines in a pull request that qualifies it to be within the expected SLO range. If a pull request is larger than the specified lines, it won\u2019t be tracked on the team\u2019s SLO dashboard.<\/li>\n<\/ul>\n\n\n\n<p>The SLO is calculated for every author-reviewer combination. That means the same pull request may have both an internal and an external code review SLO if there are two separate reviewers assigned.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">3. Automated rules<\/h3>\n\n\n\n<p>Set up automated rules for stale PRs that are pending action from the reviewer(s). Notify the reviewer on Slack or automatically reassign the review to someone else on the team.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"724\" height=\"474\" src=\"https:\/\/www.aviator.co\/blog\/wp-content\/uploads\/2024\/04\/Screenshot-2024-04-03-at-2.55.57\u202fPM.png\" alt=\"\" class=\"wp-image-2019\" srcset=\"https:\/\/www.aviator.co\/blog\/wp-content\/uploads\/2024\/04\/Screenshot-2024-04-03-at-2.55.57\u202fPM.png 724w, https:\/\/www.aviator.co\/blog\/wp-content\/uploads\/2024\/04\/Screenshot-2024-04-03-at-2.55.57\u202fPM-300x196.png 300w\" sizes=\"(max-width: 724px) 100vw, 724px\" \/><figcaption class=\"wp-element-caption\">Automated rules config for FlexReview Teams<\/figcaption><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Review reassignment<\/h2>\n\n\n\n<p>Based on the automated rules, a review may be automatically reassigned to another team member. This ensures that PRs do not get stalled due to unaddressed reviews, keeping the review process efficient and timely.<\/p>\n\n\n\n<p>Review reassignment follows the same strategy as specified in the reviewer assignment configuration. This automation tries to identify the next best person who can review the provided code change. If no other valid reviewer exists, Aviator would not reassign the reviewer, and report the error as a GitHub comment.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Expert reviewer<\/strong> &#8211; the review would be reassigned to another expert likely with a lower score or lower review load.<\/li>\n\n\n\n<li><strong>Oncall reviewer<\/strong> &#8211; the review would be reassigned to the next person defined in the escalation policy.<\/li>\n\n\n\n<li><strong>Load balanced<\/strong>: the review would be reassigned to another person with the least amount of load<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Team\u2019s SLO dashboard<\/h2>\n\n\n\n<p>Once the Review SLO config is specified, each team can monitor the response times for their incoming code reviews. This dashboard provides real-time insights into code review response times, highlighting areas for improvement and ensuring compliance with set objectives. It splits the review responses for internal and external team reviews and also excludes any reviews that fall outside of the SLO max lines requirement.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"666\" src=\"https:\/\/www.aviator.co\/blog\/wp-content\/uploads\/2024\/04\/teams-slo-1024x666.jpeg\" alt=\"\" class=\"wp-image-2020\" srcset=\"https:\/\/www.aviator.co\/blog\/wp-content\/uploads\/2024\/04\/teams-slo-1024x666.jpeg 1024w, https:\/\/www.aviator.co\/blog\/wp-content\/uploads\/2024\/04\/teams-slo-300x195.jpeg 300w, https:\/\/www.aviator.co\/blog\/wp-content\/uploads\/2024\/04\/teams-slo-768x500.jpeg 768w, https:\/\/www.aviator.co\/blog\/wp-content\/uploads\/2024\/04\/teams-slo.jpeg 1154w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Demo<\/h2>\n\n\n\n<figure class=\"wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-4-3 wp-has-aspect-ratio\"><div class=\"wp-block-embed__wrapper\">\n<iframe title=\"Aviator FlexReview Teams\" width=\"1333\" height=\"1000\" src=\"https:\/\/www.youtube.com\/embed\/wDY7kOJT5ew?feature=oembed\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen><\/iframe>\n<\/div><\/figure>\n\n\n\n<p>To learn more and try out FlexReview Teams, visit: <a href=\"https:\/\/www.aviator.co\/flexreview\" title=\"\">aviator.co\/flexreview<\/a><\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/www.aviator.co\/flexreview\"><img decoding=\"async\" src=\"https:\/\/www.aviator.co\/blog\/wp-content\/uploads\/2024\/07\/blog-cta-8FR_CTA.svg\" alt=\"flexreview teams\" class=\"wp-image-2493\"\/><\/a><\/figure>\n","protected":false},"excerpt":{"rendered":"<p>A customizable framework for managing code review assignments, notifications and response expectations, to improve inter-team collaboration and reviews speed.<\/p>\n","protected":false},"author":18,"featured_media":2024,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"footnotes":""},"categories":[94],"tags":[87,31],"class_list":["post-2014","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-code-reviews"],"blocksy_meta":[],"acf":[],"aioseo_notices":[],"jetpack_featured_media_url":"https:\/\/www.aviator.co\/blog\/wp-content\/uploads\/2024\/04\/producthunt-launch-cover-image-1270-760-3frteamsslo.png","post_mailing_queue_ids":[],"_links":{"self":[{"href":"https:\/\/www.aviator.co\/blog\/wp-json\/wp\/v2\/posts\/2014","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.aviator.co\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.aviator.co\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.aviator.co\/blog\/wp-json\/wp\/v2\/users\/18"}],"replies":[{"embeddable":true,"href":"https:\/\/www.aviator.co\/blog\/wp-json\/wp\/v2\/comments?post=2014"}],"version-history":[{"count":7,"href":"https:\/\/www.aviator.co\/blog\/wp-json\/wp\/v2\/posts\/2014\/revisions"}],"predecessor-version":[{"id":3611,"href":"https:\/\/www.aviator.co\/blog\/wp-json\/wp\/v2\/posts\/2014\/revisions\/3611"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.aviator.co\/blog\/wp-json\/wp\/v2\/media\/2024"}],"wp:attachment":[{"href":"https:\/\/www.aviator.co\/blog\/wp-json\/wp\/v2\/media?parent=2014"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.aviator.co\/blog\/wp-json\/wp\/v2\/categories?post=2014"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.aviator.co\/blog\/wp-json\/wp\/v2\/tags?post=2014"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}