Developer Productivity

PR

Matt PocockMITSkill language: English
License verifiedNo scripts
DemoReal run · claude-opus-5-5 · October 2026
Write a PR body for this change. ```diff --- a/app/rates.py +++ b/app/rates.py @@ -1,12 +1,24 @@ +import time import requests RATES_URL = "https://api.example-fx.com/latest" +CACHE_TTL_SECONDS = 300 +_cache: dict[str, tuple[float, float]] = {} def get_rate(base: str, quote: str) -> float: - resp = requests.get(RATES_URL, params={"base": base, "symbols": quote}, timeout=5) - resp.raise_for_status() - return resp.json()["rates"][quote] + key = f"{base}:{quote}" + cached = _cache.get(key) + if cached and time.monotonic() - cached[1] < CACHE_TTL_SECONDS: + return cached[0] + resp = requests.get(RATES_URL, params={"base": base, "symbols": quote}, timeout=5) + resp.raise_for_status() + rate = resp.json()["rates"][quote] + _cache[key] = (rate, time.monotonic()) + return rate --- a/tests/test_rates.py +++ b/tests/test_rates.py @@ -20,3 +20,15 @@ def test_get_rate_returns_quote(mock_get): assert get_rate("USD", "EUR") == 0.92 + + +def test_get_rate_uses_cache_within_ttl(mock_get): + get_rate("USD", "EUR") + get_rate("USD", "EUR") + assert mock_get.call_count == 1 ``` Context: checkout called the FX provider on every cart render and we hit their 1,000 requests/minute limit during Friday's sale, which caused 429 errors on checkout. Test run before: 14 passed. After: 15 passed.
Skill: pr
Read: GLOSSARY.md (not found in the sandbox)

Here's the PR body:

## Summary

Checkout called the FX provider on every cart render. During Friday's sale that went over the provider's 1,000 requests/minute limit, and checkout started returning 429 errors. `get_rate` now keeps each rate in memory for 5 minutes.

```diff
 get_rate(base, quote)
+  if base:quote was fetched less than 300s ago
+    return the saved rate
   GET api.example-fx.com/latest
   raise on HTTP error
+  save rate for base:quote with time.monotonic()
   return rate

Evidence

  • Before: pytest shows 14 passed. Every get_rate call makes its own HTTP request.
    After: pytest shows 15 passed. Added test_get_rate_uses_cache_within_ttl:

    get_rate("USD", "EUR")
    get_rate("USD", "EUR")
    assert provider was called once
    

Merge Danger

Door: two-way

The cache only lives in memory, with nothing persisted and no schema change. To roll back, revert the commit.

Blast Radius: checkout

  • Stale rates: prices can use a rate up to 5 minutes old. Confirm that's acceptable for checkout pricing.
  • Per-process cache: each worker keeps its own cache. Provider calls per 5 minutes are roughly workers × currency pairs, so the limit could still be reached with many workers.
  • No size limit or eviction: this is fine for a fixed set of currency pairs.
  • No locking: two requests that miss the cache at the same moment can both call the provider. The only cost is an extra request.
  • Test isolation: _cache is module-level, so it carries over between tests unless a fixture clears it.

- **No `GLOSSARY.md`:** the repo doesn't have one, so I used the wording from your context and the code.
- **Check this before merging:** `test_get_rate_returns_quote` already caches `USD:EUR`. If nothing clears `_cache` between tests, the new test should see 0 provider calls and fail. Since it passes, the `mock_get` fixture probably resets the cache, but I couldn't see the fixture to confirm. If it doesn't, the test result depends on the order tests run in, and I'd add an autouse fixture that calls `_cache.clear()`.

Real run recorded with claude-code / claude-opus-5-5. Output is shown verbatim, unmodified. The only change: the trial machine's temp-folder path was replaced with a generic placeholder.

What it does

Writes a pull request description that is quick to review, in three parts.

How it works

  1. Summary: the smallest visual that makes the point. It can be pseudocode, a call tree, a component tree, a file tree, a Mermaid diagram or a diff sketch, placed next to the short text it supports.
  2. Evidence: a concrete before and after. Screenshots are best when the change is visual; otherwise the exact test that now fails and passes.
  3. Merge Danger: whether the change is a one-way or two-way door (can it be rolled back?), and its blast radius, such as layout shift or breakage for consumers.
  4. Skips preambles and keeps prose brief, using your GLOSSARY.md wording if the repo has one.

Good for

Pull requests where reviewers need to see what changed and how risky it is.

Worth knowing

In our trial it also flagged a risk it could not verify from the diff, a test-isolation question, instead of hiding it.

Notes & risks

Pure instruction files: no scripts and no network access. The Summary section's menu of visuals is adapted from the show-me skill by Dex Horthy (HumanLayer, MIT licence); the package includes that licence as LICENSE-show-me and a CREDITS.md note. It only writes text and does not run git or open the pull request. The package also contains the original MIT LICENSE and agents/openai.yaml (display name for Codex).