Sweaty Imposter

Practical Round

PR Review Lab

Review a pull request the way the code review round expects: comment on the lines that matter, mark each comment Blocking, Should Fix, or Nit, and give a verdict. Then compare your review with a model review.

Junior

5 PRs
  • JuniorTypeScript · 3 files · +42 −8 · 20 min

    Add Search to the Product List

    A React product list gains a search box that filters and highlights matching names.

    Shoppers asked for a way to find a product without scrolling the whole catalog. This adds a search box above the list that filters by name as you type and highlights the matching text. Results are sorted alphabetically so they're easier to scan.

    Start the Review
  • JuniorPython · 3 files · +45 −0 · 20 min

    Import Contacts From a CSV File

    A Django view and importer bring a user's contacts in from an uploaded CSV.

    Adds an Import button to the Contacts page. Upload a CSV with name, email, and phone columns, and the importer creates a contact for each row. Rows with an email you already have are skipped, so importing the same file twice doesn't duplicate anyone. Tested with a sample export.

    Start the Review
  • JuniorShell · 2 files · +21 −0 · 20 min

    Back Up the Database Every Night

    A shell script and a cron entry dump the app's MySQL database every night and keep a week of copies.

    We don't have database backups yet. This adds a script that dumps the app database, compresses it, and keeps a week of copies in /var/backups/app, plus a cron entry that runs it at midnight. I ran it by hand on staging and the file showed up with today's date.

    Start the Review
  • JuniorKotlin · 3 files · +42 −1 · 20 min

    Save Note Drafts as You Type

    An Android note editor saves a draft on every keystroke, so text survives the app being closed.

    If the app is killed while someone is editing a note, they lose what they typed. This saves the text to SharedPreferences as they type and restores it the next time the editor opens. Saving the note clears the draft. I tested it by typing, swiping the app away, and reopening it.

    Start the Review
  • JuniorRuby · 3 files · +21 −0 · 20 min

    Let Users Change Their Email

    A Rails account page gains an update action so people can change the email on their account.

    Support gets a few requests a week from people who want to change the email on their account. This adds an update action to AccountsController, wired to the existing form on the account page, plus an email format and uniqueness validation on User. There's a request spec for the happy path.

    Start the Review

Mid

5 PRs
  • MidJava · 2 files · +41 −2 · 25 min

    Cache User Profiles in Memory

    A Spring service puts an in-memory cache in front of the profile repository.

    The profile endpoint is our most-read route, and every request goes to the database. This adds a map in front of the repository so repeat reads of the same profile skip the query. Locally, p95 for GET /users/{id}/profile dropped from 38 ms to 2 ms. updateProfile now reads straight from the repository so it always edits the latest data.

    Start the Review
  • MidSwift · 3 files · +28 −0 · 25 min

    Load Contact Avatars Asynchronously

    A UIKit contacts list downloads each contact's avatar as its cell appears.

    Contacts showed a generic person icon. Now each row downloads the contact's avatar in the background and swaps it in when it arrives, so scrolling stays smooth. Failed loads are counted in metrics so we can see how often the image host has problems, and ContactCell clears its image on reuse.

    Start the Review
  • MidTypeScript · 3 files · +48 −0 · 20 min

    Record Request Timing Metrics

    An Express middleware records a Prometheus histogram of request durations by route and status.

    We have no per-endpoint latency data, so slow routes only show up as customer complaints. This adds middleware that times every request and records it in a histogram labeled by method, route pattern, and status code. Unmatched paths share one "unmatched" label so raw URLs never become label values. The existing /metrics endpoint exposes it.

    Start the Review
  • MidTypeScript, SQL · 3 files · +50 −0 · 30 min

    Show Order History on the Account Page

    An Express endpoint, a Postgres migration, and a React list for a customer's recent orders.

    Adds an endpoint that returns a customer's recent orders with their items, a status column on orders, and the Order History list on the account page.

    Start the Review
  • MidPHP · 3 files · +48 −0 · 25 min

    Export Orders to CSV From the Admin Panel

    A PHP admin endpoint exports orders since a chosen date as a CSV download.

    Finance exports orders every month by asking an engineer to run a query. This adds an export endpoint the admin panel links to, with an optional from date. Each row has the order, the customer, the total, and the number of items. There's a test that checks the header row.

    Start the Review

Senior

5 PRs
  • SeniorPython · 3 files · +30 −4 · 30 min

    Add Retries to the Payment Client

    A Python payment client gains retries with backoff and a new config module.

    Charges sometimes fail on a flaky network, and checkout shows an error. This retries the charge with exponential backoff and moves the API key and retry count into config.py.

    Start the Review
  • SeniorGo · 3 files · +61 −1 · 25 min

    Limit Coupon Redemptions

    A Go coupon service adds expiry, a redemption cap, and a once-per-customer rule.

    Marketing wants coupons that run out. Each coupon now has an expiry and a redemption limit, and each customer can redeem a coupon once. Also adds the HTTP handler for the redeem button.

    Start the Review
  • SeniorGo · 3 files · +98 −1 · 30 min

    Add a Per-Client Rate Limiter

    A Go net/http middleware that limits each client to 100 requests a minute, wired in for every route.

    Scrapers have been hammering /products and /search, and the database feels it at peak. This adds rate limiting middleware: each client gets 100 requests per minute, keyed on X-Forwarded-For since we sit behind the load balancer. It wraps the whole mux in main.go, and there are tests for the limit and the client key.

    Start the Review
  • SeniorTypeScript · 3 files · +76 −5 · 30 min

    Cache Product Pages in Redis

    A TypeScript product service adds a cache-aside Redis layer for rendered product pages, with invalidation on update.

    Product pages are our most requested route, and every view runs a database read plus a pricing call. This caches the rendered page in Redis for 5 minutes and invalidates it when a product is updated. On staging the p95 for product pages dropped from 180 ms to 12 ms.

    Start the Review
  • SeniorC# · 3 files · +57 −0 · 30 min

    Upload Profile Photos to Blob Storage

    An ASP.NET Core endpoint stores profile photos in Azure Blob Storage and saves each URL on the user.

    Users can finally set a profile photo. The new endpoint accepts an image upload, stores it in a profile-photos blob container, and saves the blob URL on the user so the web and mobile apps can show it. The container is created at startup if it doesn't exist. There's a test for a successful upload.

    Start the Review

Staff

5 PRs
  • StaffSQL, Python · 4 files · +71 −8 · 35 min

    Move Shipping Addresses to Their Own Table

    Shipping addresses move from columns on orders to a new addresses table, with the backfill, read switch, and column drop in one release.

    Shipping addresses move out of orders and into their own addresses table, which unblocks split shipments and saved addresses next quarter. Migration 0087 creates the table and copies every existing address, the repository now reads and writes the new table, and 0088 drops the old ship_* columns. orders has about 140 million rows. I ran both migrations against last week's staging snapshot and they finished in about 6 minutes. Planning to ship it all in Thursday's release.

    Start the Review
  • StaffYAML, TypeScript · 4 files · +100 −17 · 35 min

    Route Checkout to the New Pricing Service

    Kubernetes manifests and a checkout client change that send every pricing call to a newly extracted pricing service.

    Pricing has been extracted from the monolith into its own service, and this routes checkout to it. It adds the Deployment, Service, and VirtualService for pricing-v2, points the checkout pricing client at the new service, and removes the catalog price fallback, since pricing-v2 is now the source of truth. Retries are on in the mesh and in the client, so one bad pod won't fail a checkout. Verified in staging: quotes come back and checkout completes end to end.

    Start the Review
  • StaffHCL · 3 files · +48 −0 · 35 min

    Move Orders to Managed Postgres

    A Terraform module and production config create a managed Postgres instance for the orders service.

    The orders database still runs on a hand-built EC2 instance. This adds a reusable postgres module and uses it to create orders-prod on RDS, sized to match the current box. Once it's applied, we'll restore last night's dump into it and switch the service's connection string. I set it up so we can reach it from our laptops for the restore, and I've kept settings simple for the first version.

    Start the Review
  • StaffProtocol Buffers, Go, YAML · 3 files · +22 −8 · 35 min

    Add Line Items and Money to the Order API

    The orders protobuf gains line items, Money, and a refunded status, and the server charges from total.

    Orders need line items and a currency for international launch. This reworks the Order message: numeric customer ids now that the customer service migrated, 64-bit totals, repeated line items in place of the unused coupon field, a Money total, and a REFUNDED status, with the statuses reordered so the most common one comes first. The server now charges from total. buf's breaking check flagged the file, so I've excluded it, since these are intentional changes.

    Start the Review
  • StaffYAML, Shell · 3 files · +44 −0 · 30 min

    Deploy Previews and Production From CI

    GitHub Actions build previews for pull requests and deploy main to production on every merge.

    Deploys are a manual script someone runs from their laptop. This adds two workflows: one that builds every pull request and posts a preview link, including PRs from forks so outside contributors get previews too, and one that tests and deploys main to production on every merge. AWS keys and the preview token are in repository secrets.

    Start the Review

Principal

4 PRs
  • PrincipalTypeScript, YAML, SQL · 4 files · +40 −0 · 40 min

    Serve Writes From Both Regions

    Both regions take writes, with change replication between them and last-write-wins conflicts.

    EU customers see 180 ms on every write because all writes go to us-east-1. This makes both regions primary: requests write to the nearest region's database, a replication worker applies each region's changes to the other, and conflicts resolve by last write wins on updated_at. Sequences are split by parity so ids never collide. Failover becomes automatic, since either region can take all traffic. I tested it with both regions in staging under synthetic load.

    Start the Review
  • PrincipalRust · 3 files · +50 −2 · 35 min

    Replace JSON With a Binary Quote Protocol

    A hand-written Rust binary encoding replaces JSON between the gateway and the quote service.

    JSON encoding and decoding is 9% of CPU on the quote service. This adds a small wire crate that encodes quote requests as length-prefixed fields in a fixed order, and switches the gateway to it. In a microbenchmark, encode and decode are 6x faster than serde_json, and staging p99 dropped by 4 ms. Both services deploy from the monorepo, so they ship together.

    Start the Review
  • PrincipalJava, XML · 3 files · +72 −1 · 35 min

    Give Every Service a Shared HTTP Client

    A platform library gives all 41 services one HTTP client with default timeouts, retries, and metrics.

    Every team configures HTTP clients differently, and two incidents last quarter came from calls with no timeout. This adds platform-http, a shared OkHttp client with a 30 second timeout, retries with exponential backoff on IOExceptions and 5xx responses, and a metrics interceptor. platform-core 5.0 registers it as the default client, so the BOM bump moves all 41 services onto it at their next build with no code changes.

    Start the Review
  • PrincipalMarkdown · 2 files · +28 −0 · 30 min

    Propose Event Sourcing for Billing

    An architecture decision record proposes rebuilding billing on event sourcing in one release.

    This is ADR 21, proposing that billing move to event sourcing so every invoice has a complete history. Disputes currently take support hours of digging through logs. I'd like comments here before we take it to the architecture review on the 20th.

    Start the Review

The Phases

  1. Read the PR
  2. Leave Comments
  3. Write the Summary
  4. Compare With the Model Review

How the Comparison Works

Each model issue covers a file and a range of lines. A comment counts toward an issue when it sits in that file, inside that range. The comparison shows what you found, what you missed, where your severity differs, and how your verdict compares.

Matching goes by location, so read the model's explanation next to your comment to judge whether you named the same problem.

Severities

Blocking stops the merge. Should Fix needs a change before or soon after merge. Nit is a preference the author can take or leave.