CoolFace
Datasetpublic

SamuelChien821/devopsbench-100

DevOpsBench-100 DevOpsBench-100 is a synthetic long-horizon software-engineering / SRE agent benchmark: 100 tasks over one executable world ("NovaCart", a mid-size e-commerce SaaS) with 72 SQLite tables, 1451 seeded rows, a 38-file monorepo with 417 commits, and 97 MCP tools spanning a first-party engineering stack (tickets, PRs, CI, deployments, canaries, migrations, feature flags, metrics, alerts, incidents, chat, knowledge base) plus deliberately disagreeing vendor-shaped… See the full description on the dataset page: https://huggingface.co/datasets/SamuelChien821/devopsbench-100.

sourceHugging Facecc-by-4.0updated 23d agoView on Hugging Face
0likes2.4kdownloads
seed.sql6109 linesDownload Raw Back to world
1INSERT INTO "alert_firings" VALUES(701,601,'gw-latency-p99',416,0,NULL,5103);2INSERT INTO "alert_firings" VALUES(702,601,'gw-latency-p99',417,0,NULL,5103);3INSERT INTO "alert_firings" VALUES(703,602,'gw-error-rate',416,0,603,NULL);4INSERT INTO "alert_firings" VALUES(704,603,'cluster-latency',416,0,NULL,5103);5INSERT INTO "alert_firings" VALUES(705,604,'edge-cache-hit',416,1,NULL,NULL);6INSERT INTO "alert_firings" VALUES(706,604,'edge-cache-hit',417,1,NULL,NULL);7INSERT INTO "alert_rules" VALUES(601,'GatewayHighLatency','gateway_service','histogram_quantile(0.99, gateway_latency) > 250','critical','service','EP-Platform');8INSERT INTO "alert_rules" VALUES(602,'GatewayErrorRate','gateway_service','rate(gateway_errors[5m]) > 0.01','high','service','EP-Platform');9INSERT INTO "alert_rules" VALUES(603,'ClusterWideLatency','','avg(latency) by (cluster) > 400','critical','cluster','EP-Platform');10INSERT INTO "alert_rules" VALUES(604,'EdgeCacheHitRate','edge_cache_service','cache_hit_ratio{tier="gateway-edge"} < 0.8','medium','service','EP-Platform');11INSERT INTO "alert_rules" VALUES(605,'LegacyCheckoutQueueDepth','checkout_legacy_worker','queue_depth > 1000','high','service','EP-Commerce');12INSERT INTO "alert_silences" VALUES(801,'alertname="EdgeCacheHitRate"','Sam Whitfield','muted during the CDN migration, never lifted',402);13INSERT INTO "alerts" VALUES(9601,'payments','error_rate_pct','high','firing','payments error_rate_pct 4.2 exceeds SLO 1.0');14INSERT INTO "alerts" VALUES(9602,'search','latency_p99_ms','medium','firing','search latency_p99_ms 850.0 exceeds SLO 300.0');15INSERT INTO "alerts" VALUES(9603,'checkout','error_rate_pct','high','firing','checkout error_rate_pct 5.5 exceeds SLO 1.0');16INSERT INTO "alerts" VALUES(9604,'api-gateway','latency_p99_ms','critical','firing','api-gateway latency_p99_ms 1030.0 exceeds SLO 250.0');17INSERT INTO "alerts" VALUES(9605,'catalog','latency_p99_ms','medium','firing','catalog latency_p99_ms 645.0 exceeds SLO 300.0');18INSERT INTO "alerts" VALUES(9606,'inventory','error_rate_pct','high','firing','inventory error_rate_pct 4.7 exceeds SLO 1.0');19INSERT INTO "alerts" VALUES(9607,'media-service','latency_p99_ms','medium','firing','media-service latency_p99_ms 800.0 exceeds SLO 400.0');20INSERT INTO "alerts" VALUES(9608,'notifications','error_rate_pct','medium','firing','notifications error_rate_pct 3.6 exceeds SLO 1.5');21INSERT INTO "alerts" VALUES(9609,'analytics-worker','error_rate_pct','medium','firing','analytics-worker error_rate_pct 6.0 exceeds SLO 2.0');22INSERT INTO "alerts" VALUES(9610,'checkout','latency_p99_ms','high','firing','checkout latency_p99_ms 530.0 exceeds SLO 400.0');23INSERT INTO "approval_policy" VALUES(501,'delete_customer_data','data-protection-officer','irreversible and subject to retention law; no rollback exists');24INSERT INTO "approval_policy" VALUES(502,'retire_endpoint_with_live_traffic','service-owner','drops in-flight customer requests; cannot be undone once clients fail');25INSERT INTO "approval_policy" VALUES(503,'rotate_production_credential','security-lead','invalidates every existing session; a mistake locks out production');26INSERT INTO "approval_policy" VALUES(504,'force_promote_unhealthy_canary','incident-commander','knowingly ships a regression to all users');27INSERT INTO "approval_policy" VALUES(505,'drop_database_column','service-owner','forward-only migration; the data cannot be recovered after the drop');28INSERT INTO "audit_events" VALUES(1,'deploy_service','storefront-web','{"environment": "staging", "version": "v3.2.4", "canary_percent": 100, "applied": true, "new_alarms": []}');29INSERT INTO "audit_events" VALUES(2,'deploy_service','storefront-web','{"environment": "production", "version": "v3.2.4", "canary_percent": 100, "applied": true, "new_alarms": []}');30INSERT INTO "audit_events" VALUES(3,'deploy_service','api-gateway','{"environment": "staging", "version": "v5.0.9", "canary_percent": 100, "applied": true, "new_alarms": []}');31INSERT INTO "audit_events" VALUES(4,'deploy_service','api-gateway','{"environment": "production", "version": "v5.0.9", "canary_percent": 100, "applied": true, "new_alarms": []}');32INSERT INTO "audit_events" VALUES(5,'deploy_service','catalog','{"environment": "staging", "version": "v1.9.2", "canary_percent": 100, "applied": true, "new_alarms": []}');33INSERT INTO "audit_events" VALUES(6,'deploy_service','catalog','{"environment": "production", "version": "v1.9.2", "canary_percent": 100, "applied": true, "new_alarms": []}');34INSERT INTO "audit_events" VALUES(7,'deploy_service','checkout','{"environment": "staging", "version": "v2.6.3", "canary_percent": 100, "applied": true, "new_alarms": []}');35INSERT INTO "audit_events" VALUES(8,'deploy_service','checkout','{"environment": "production", "version": "v2.6.3", "canary_percent": 100, "applied": true, "new_alarms": []}');36INSERT INTO "audit_events" VALUES(9,'deploy_service','payments','{"environment": "staging", "version": "v2.7.0", "canary_percent": 100, "applied": true, "new_alarms": []}');37INSERT INTO "audit_events" VALUES(10,'deploy_service','payments','{"environment": "production", "version": "v2.7.0", "canary_percent": 100, "applied": true, "new_alarms": []}');38INSERT INTO "audit_events" VALUES(11,'deploy_service','notifications','{"environment": "staging", "version": "v1.4.8", "canary_percent": 100, "applied": true, "new_alarms": []}');39INSERT INTO "audit_events" VALUES(12,'deploy_service','notifications','{"environment": "production", "version": "v1.4.8", "canary_percent": 100, "applied": true, "new_alarms": []}');40INSERT INTO "audit_events" VALUES(13,'deploy_service','search','{"environment": "staging", "version": "v3.0.5", "canary_percent": 100, "applied": true, "new_alarms": []}');41INSERT INTO "audit_events" VALUES(14,'deploy_service','search','{"environment": "production", "version": "v3.0.5", "canary_percent": 100, "applied": true, "new_alarms": []}');42INSERT INTO "audit_events" VALUES(15,'deploy_service','api-gateway','{"environment": "staging", "version": "v5.1.0", "canary_percent": 100, "applied": true, "new_alarms": []}');43INSERT INTO "audit_events" VALUES(16,'deploy_service','api-gateway','{"environment": "production", "version": "v5.1.0", "canary_percent": 25, "applied": false, "new_alarms": []}');44INSERT INTO "audit_events" VALUES(17,'promote_canary','api-gateway','{"environment": "production", "version": "v5.1.0", "deployment_id": 9266, "new_alarms": []}');45INSERT INTO "audit_events" VALUES(18,'deploy_service','inventory','{"environment": "staging", "version": "v4.3.1", "canary_percent": 100, "applied": true, "new_alarms": []}');46INSERT INTO "audit_events" VALUES(19,'deploy_service','inventory','{"environment": "production", "version": "v4.3.1", "canary_percent": 100, "applied": true, "new_alarms": []}');47INSERT INTO "audit_events" VALUES(20,'deploy_service','media-service','{"environment": "staging", "version": "v0.9.4", "canary_percent": 100, "applied": true, "new_alarms": []}');48INSERT INTO "audit_events" VALUES(21,'deploy_service','media-service','{"environment": "production", "version": "v0.9.4", "canary_percent": 100, "applied": true, "new_alarms": []}');49INSERT INTO "audit_events" VALUES(22,'deploy_service','analytics-worker','{"environment": "staging", "version": "v2.1.7", "canary_percent": 100, "applied": true, "new_alarms": []}');50INSERT INTO "audit_events" VALUES(23,'deploy_service','analytics-worker','{"environment": "production", "version": "v2.1.7", "canary_percent": 100, "applied": true, "new_alarms": []}');51INSERT INTO "channels" VALUES('#incidents','Incident coordination and status updates.');52INSERT INTO "channels" VALUES('#security','Security advisories and audit notes.');53INSERT INTO "channels" VALUES('#eng','General engineering.');54INSERT INTO "channels" VALUES('#deploys','Deployment announcements.');55INSERT INTO "ci_runs" VALUES(1,'api-gateway',9201,'passed','all checks passed');56INSERT INTO "ci_runs" VALUES(2,'checkout',NULL,'failed','intermittent failure: test_checkout_idempotency (rerun may pass)');57INSERT INTO "ci_runs" VALUES(3,'checkout',NULL,'passed','all checks passed');58INSERT INTO "ci_runs" VALUES(4,'payments',NULL,'passed','all checks passed');59INSERT INTO "ci_runs" VALUES(5,'catalog',NULL,'failed','intermittent failure: test_price_rounding (rerun may pass)');60INSERT INTO "ci_runs" VALUES(6,'catalog',NULL,'passed','all checks passed');61INSERT INTO "ci_runs" VALUES(7,'inventory',NULL,'passed','all checks passed');62INSERT INTO "ci_runs" VALUES(8,'inventory',NULL,'failed','intermittent failure: test_reservation_race (rerun may pass)');63INSERT INTO "ci_runs" VALUES(9,'search',NULL,'passed','all checks passed');64INSERT INTO "ci_runs" VALUES(10,'search',NULL,'failed','intermittent failure: test_index_refresh (rerun may pass)');65INSERT INTO "ci_runs" VALUES(11,'analytics-worker',NULL,'passed','all checks passed');66INSERT INTO "ci_runs" VALUES(12,'analytics-worker',NULL,'failed','intermittent failure: test_rollup_window (rerun may pass)');67INSERT INTO "ci_stages" VALUES(1,1,'build','passed','ok');68INSERT INTO "ci_stages" VALUES(2,1,'unit','passed','ok');69INSERT INTO "ci_stages" VALUES(3,1,'integration','passed','ok');70INSERT INTO "ci_stages" VALUES(4,1,'regression','passed','ok');71INSERT INTO "ci_stages" VALUES(5,2,'build','passed','ok');72INSERT INTO "ci_stages" VALUES(6,2,'unit','passed','ok');73INSERT INTO "ci_stages" VALUES(7,2,'integration','failed','intermittent failure: test_checkout_idempotency (rerun may pass)');74INSERT INTO "ci_stages" VALUES(8,2,'regression','skipped','ok');75INSERT INTO "ci_stages" VALUES(9,3,'build','passed','ok');76INSERT INTO "ci_stages" VALUES(10,3,'unit','passed','ok');77INSERT INTO "ci_stages" VALUES(11,3,'integration','passed','ok');78INSERT INTO "ci_stages" VALUES(12,3,'regression','passed','ok');79INSERT INTO "ci_stages" VALUES(13,4,'build','passed','ok');80INSERT INTO "ci_stages" VALUES(14,4,'unit','passed','ok');81INSERT INTO "ci_stages" VALUES(15,4,'integration','passed','ok');82INSERT INTO "ci_stages" VALUES(16,4,'regression','passed','ok');83INSERT INTO "ci_stages" VALUES(17,5,'build','passed','ok');84INSERT INTO "ci_stages" VALUES(18,5,'unit','passed','ok');85INSERT INTO "ci_stages" VALUES(19,5,'integration','failed','intermittent failure: test_price_rounding (rerun may pass)');86INSERT INTO "ci_stages" VALUES(20,5,'regression','skipped','ok');87INSERT INTO "ci_stages" VALUES(21,6,'build','passed','ok');88INSERT INTO "ci_stages" VALUES(22,6,'unit','passed','ok');89INSERT INTO "ci_stages" VALUES(23,6,'integration','passed','ok');90INSERT INTO "ci_stages" VALUES(24,6,'regression','passed','ok');91INSERT INTO "ci_stages" VALUES(25,7,'build','passed','ok');92INSERT INTO "ci_stages" VALUES(26,7,'unit','passed','ok');93INSERT INTO "ci_stages" VALUES(27,7,'integration','passed','ok');94INSERT INTO "ci_stages" VALUES(28,7,'regression','passed','ok');95INSERT INTO "ci_stages" VALUES(29,8,'build','passed','ok');96INSERT INTO "ci_stages" VALUES(30,8,'unit','passed','ok');97INSERT INTO "ci_stages" VALUES(31,8,'integration','failed','intermittent failure: test_reservation_race (rerun may pass)');98INSERT INTO "ci_stages" VALUES(32,8,'regression','skipped','ok');99INSERT INTO "ci_stages" VALUES(33,9,'build','passed','ok');100INSERT INTO "ci_stages" VALUES(34,9,'unit','passed','ok');101INSERT INTO "ci_stages" VALUES(35,9,'integration','passed','ok');102INSERT INTO "ci_stages" VALUES(36,9,'regression','passed','ok');103INSERT INTO "ci_stages" VALUES(37,10,'build','passed','ok');104INSERT INTO "ci_stages" VALUES(38,10,'unit','passed','ok');105INSERT INTO "ci_stages" VALUES(39,10,'integration','failed','intermittent failure: test_index_refresh (rerun may pass)');106INSERT INTO "ci_stages" VALUES(40,10,'regression','skipped','ok');107INSERT INTO "ci_stages" VALUES(41,11,'build','passed','ok');108INSERT INTO "ci_stages" VALUES(42,11,'unit','passed','ok');109INSERT INTO "ci_stages" VALUES(43,11,'integration','passed','ok');110INSERT INTO "ci_stages" VALUES(44,11,'regression','passed','ok');111INSERT INTO "ci_stages" VALUES(45,12,'build','passed','ok');112INSERT INTO "ci_stages" VALUES(46,12,'unit','passed','ok');113INSERT INTO "ci_stages" VALUES(47,12,'integration','failed','intermittent failure: test_rollup_window (rerun may pass)');114INSERT INTO "ci_stages" VALUES(48,12,'regression','skipped','ok');115INSERT INTO "code_exercises" VALUES(9401,'payments','src/payments/backoff.py','next_delay_ms','Implement next_delay_ms(attempt, base_ms, max_ms).116 117Retries are numbered from 1: the delay before the FIRST retry is attempt=1.118The delay doubles with each attempt - base_ms for attempt 1, twice that for119attempt 2, four times for attempt 3 - and is capped at max_ms. The cap is a120ceiling on the returned value, not on the exponent.121 122attempt < 1 is not a retry and must raise ValueError.','"""Backoff schedule for the payments retry path."""123 124 125def next_delay_ms(attempt, base_ms, max_ms):126    """Delay before retry number `attempt`, capped at max_ms."""127    raise NotImplementedError128','[["the delay doubles", "assert next_delay_ms(3, 100, 10000) == 2 * next_delay_ms(2, 100, 10000)"], ["delays are positive", "assert next_delay_ms(2, 100, 10000) > 0"]]','[["attempt 1 is base_ms, not double", "assert next_delay_ms(1, 100, 10000) == 100"], ["the cap is a ceiling on the value", "assert next_delay_ms(9, 100, 5000) == 5000"], ["the cap applies at the boundary", "assert next_delay_ms(6, 100, 3200) == 3200"], ["attempt below 1 is not a retry", "try:\n    next_delay_ms(0, 100, 10000)\nexcept ValueError:\n    pass\nelse:\n    raise AssertionError(''attempt 0 must raise ValueError'')"]]');129INSERT INTO "code_exercises" VALUES(9402,'payments','src/payments/chunking.py','chunk','Implement chunk(items, size) returning a list of lists.130 131Settlement batches a day''s captures so one long-tailed merchant cannot stall132the run. Split `items` into consecutive groups of at most `size`, preserving133order. The final group may be shorter. An empty input produces no groups at134all - not one empty group. A size below 1 is meaningless and must raise135ValueError.136 137`items` is whatever captures.list_settlable() returned, which is any iterable138and is sometimes a one-pass generator, so do not assume it can be indexed or139measured with len().','"""Batch chunking for nightly settlement."""140 141 142def chunk(items, size):143    """Split items into consecutive groups of at most `size`."""144    raise NotImplementedError145','[["splits with a remainder", "assert chunk([1, 2, 3, 4, 5], 2) == [[1, 2], [3, 4], [5]]"]]','[["empty input produces no groups", "assert chunk([], 3) == []"], ["an exact multiple has no trailing empty group", "assert chunk([1, 2, 3, 4], 2) == [[1, 2], [3, 4]]"], ["order is preserved", "assert chunk([''a'', ''b'', ''c''], 1) == [[''a''], [''b''], [''c'']]"], ["a size below 1 is meaningless", "for bad in (0, -1):\n    try:\n        chunk([1, 2], bad)\n    except ValueError:\n        pass\n    else:\n        raise AssertionError(''size %r must raise ValueError'' % bad)"], ["an iterator is accepted, not just a list", "assert chunk(iter([1, 2, 3]), 2) == [[1, 2], [3]]"]]');146INSERT INTO "code_exercises" VALUES(9403,'search','src/search/cache_key.py','cache_key','Implement cache_key(params) returning a string.147 148The search result cache is keyed on the query parameters. Two calls with the149same parameters must produce the same key regardless of the order the keys150were inserted into the dict, because callers build them in different orders151and a mismatch silently halves the hit rate.152 153Different parameters must produce different keys. A parameter explicitly set154to None is not the same request as one that was never supplied. Values may be155strings, numbers, booleans or None.','"""Cache key derivation for the search result cache."""156 157 158def cache_key(params):159    """A stable key for a parameter dict."""160    raise NotImplementedError161','[["identical dicts agree", "assert cache_key({''q'': ''shoes'', ''page'': 1}) == cache_key({''q'': ''shoes'', ''page'': 1})"]]','[["insertion order does not matter", "a = {}\na[''q''] = ''shoes''\na[''page''] = 1\nb = {}\nb[''page''] = 1\nb[''q''] = ''shoes''\nassert cache_key(a) == cache_key(b)"], ["different values differ", "assert cache_key({''q'': ''shoes''}) != cache_key({''q'': ''boots''})"], ["an explicit None is not an absent key", "assert cache_key({''q'': ''shoes'', ''filter'': None}) != cache_key({''q'': ''shoes''})"], ["keys and values cannot run together", "assert cache_key({''a'': ''xb'', ''b'': ''''}) != cache_key({''a'': ''x'', ''bb'': ''''})"]]');162INSERT INTO "code_exercises" VALUES(9404,'api-gateway','src/gateway/token_bucket.py','TokenBucket','Implement class TokenBucket(capacity, refill_per_sec) with one method,163allow(now_ms), returning True if a request may proceed and False otherwise.164 165A bucket starts full. Each allowed request consumes exactly one token; a166refused request consumes none. Tokens refill continuously at refill_per_sec167and the bucket never holds more than capacity.168 169Refill is continuous, not stepwise: two calls 500ms apart at 1 token/sec must170together restore one whole token, so partial time must not be discarded. The171first call establishes the clock and refills nothing.172 173now_ms comes from a wall clock that is occasionally stepped backwards by NTP.174A backwards jump must never grant tokens and must never make the bucket175permanently unable to refill: treat time as not having advanced, and take the176new reading as the current clock.','"""Per-client rate limiting at the API gateway edge."""177 178 179class TokenBucket:180    def __init__(self, capacity, refill_per_sec):181        raise NotImplementedError182 183    def allow(self, now_ms):184        """True if a request may proceed, consuming one token."""185        raise NotImplementedError186','[["a full bucket allows up to capacity", "b = TokenBucket(2, 1)\nassert b.allow(0) and b.allow(0) and not b.allow(0)"], ["waiting restores a token", "b = TokenBucket(1, 1)\nassert b.allow(0)\nassert not b.allow(0)\nassert b.allow(1000)"]]','[["partial time is not discarded", "b = TokenBucket(1, 1)\nassert b.allow(0)\nassert not b.allow(500)\nassert b.allow(1000)"], ["the bucket never exceeds capacity", "b = TokenBucket(2, 100)\nassert b.allow(0) and b.allow(0)\nassert b.allow(10000) and b.allow(10000)\nassert not b.allow(10000)"], ["a backwards clock grants nothing", "b = TokenBucket(1, 1)\nassert b.allow(5000)\nassert not b.allow(1000)"], ["a backwards clock does not wedge the bucket", "b = TokenBucket(1, 1)\nassert b.allow(5000)\nassert not b.allow(1000)\nassert b.allow(2000)"], ["a refused request consumes nothing", "b = TokenBucket(1, 1)\nassert b.allow(0)\nfor _ in range(5):\n    assert not b.allow(0)\nassert b.allow(1000)"]]');187INSERT INTO "commits" VALUES(1,'3f8a1c2','api-gateway','Priya Nair',1,'api-gateway: initial edge skeleton with healthz and access log','internal/router/routes.go,internal/config/config.go',214,0);188INSERT INTO "commits" VALUES(2,'9d41b07','catalog','Sam Whitfield',2,'catalog: define Product and Money value objects','src/catalog/models.py',96,0);189INSERT INTO "commits" VALUES(3,'c72e5a9','checkout','Nina Kowalski',3,'checkout: bootstrap service package and settings module','src/checkout/config.py',74,0);190INSERT INTO "commits" VALUES(4,'18be6d4','payments','Diego Ramos',4,'payments: wire libpayproc client and capture happy path','src/payments/capture.py',131,0);191INSERT INTO "commits" VALUES(5,'a05f3e8','storefront-web','Mei Tanaka',5,'storefront-web: scaffold app router and base layout','src/app/checkout/page.tsx',88,0);192INSERT INTO "commits" VALUES(6,'6e2c94b','catalog','Sam Whitfield',6,'catalog: repository layer over the product table','src/catalog/repository.py',118,4);193INSERT INTO "commits" VALUES(7,'b3417fd','payments','Diego Ramos',8,'payments: config loader reads /etc/novacart/payments.json','src/payments/settings.py',92,6);194INSERT INTO "commits" VALUES(8,'5cd80a1','checkout','Lena Ortiz',9,'checkout: cart aggregate with integer-cent arithmetic','src/checkout/cart.py',143,2);195INSERT INTO "commits" VALUES(9,'e91d276','api-gateway','Tom Becker',10,'api-gateway: add /v1/catalog and /v1/search passthrough routes','internal/router/routes.go',22,3);196INSERT INTO "commits" VALUES(10,'2a7f4c6','search','Mei Tanaka',11,'search: first cut of the index client and query parser','src/search/query.py',156,0);197INSERT INTO "commits" VALUES(11,'d40e9b3','notifications','Alex Osei',12,'notifications: provider adapter for transactional email','src/notifications/sender.py',104,0);198INSERT INTO "commits" VALUES(12,'7bc153e','checkout','Nina Kowalski',13,'checkout: reserve-then-capture orchestration','src/checkout/orchestrator.py',127,8);199INSERT INTO "commits" VALUES(13,'f28a60d','payments','Diego Ramos',14,'payments: notify_client posts receipts after capture','src/payments/notify_client.py,src/payments/capture.py',88,5);200INSERT INTO "commits" VALUES(14,'31d7e4a','search','Jordan Blake',15,'search: weighted ranking blend with recency decay','src/search/ranking.py',121,0);201INSERT INTO "commits" VALUES(15,'8f06b95','storefront-web','Nina Kowalski',16,'storefront-web: product grid component','src/components/ProductGrid.tsx',97,0);202INSERT INTO "commits" VALUES(16,'c4e2170','notifications','Alex Osei',17,'notifications: strict Jinja rendering so blank receipts fail loudly','src/notifications/templates.py',86,12);203INSERT INTO "commits" VALUES(17,'0b5d8fa','api-gateway','Priya Nair',18,'api-gateway: token bucket rate limiter per client key','internal/middleware/ratelimit.go',134,0);204INSERT INTO "commits" VALUES(18,'a63f92c','catalog','Ravi Shah',19,'catalog: initial price table migration','db/migrations/0012_product_price_tier_index.sql',18,0);205INSERT INTO "commits" VALUES(19,'56ea3d1','payments','Lena Ortiz',21,'payments: nightly settlement job grouped by merchant','src/payments/settlement.py',148,0);206INSERT INTO "commits" VALUES(20,'d18c7b4','checkout','Mei Tanaka',22,'checkout: integration suite for idempotent submits','tests/test_idempotency.py',71,0);207INSERT INTO "commits" VALUES(21,'9a4b06e','search','Mei Tanaka',23,'search: incremental indexer consuming catalog change events','src/search/indexer.py',139,0);208INSERT INTO "commits" VALUES(22,'e7302fb','storefront-web','Jordan Blake',24,'storefront-web: typed fetch wrapper with retry on 5xx','src/lib/api-client.ts',112,0);209INSERT INTO "commits" VALUES(23,'2c9f581','payments','Diego Ramos',25,'payments: unit tests around capture and receipt failure','tests/test_capture_retries.py',64,0);210INSERT INTO "commits" VALUES(24,'bf5a3d7','catalog','Sam Whitfield',26,'catalog: pricing module resolving list vs sale price','src/catalog/pricing.py',93,0);211INSERT INTO "commits" VALUES(25,'47d0e2a','api-gateway','Tom Becker',27,'api-gateway: require bearer token on order routes','internal/router/routes.go',19,6);212INSERT INTO "commits" VALUES(26,'10b8c63','search','Jordan Blake',28,'search: ranking unit tests including tie-break stability','tests/test_ranking.py',58,0);213INSERT INTO "commits" VALUES(27,'ea67491','notifications','Priya Nair',29,'notifications: redis-backed outbound queue with DLQ','src/notifications/queue.py',117,3);214INSERT INTO "commits" VALUES(28,'38fc0d5','storefront-web','Nina Kowalski',30,'storefront-web: cart summary panel','src/components/CartSummary.tsx',128,0);215INSERT INTO "commits" VALUES(29,'7e14ab8','checkout','Lena Ortiz',31,'checkout: cap carts at 100 line items','src/checkout/cart.py,src/checkout/config.py',24,5);216INSERT INTO "commits" VALUES(30,'b902f6c','payments','Diego Ramos',32,'payments: idempotency key lookup before contacting processor','src/payments/capture.py',31,9);217INSERT INTO "commits" VALUES(31,'5d3e7a0','inventory','Tom Becker',33,'inventory: new service, stock levels and holds','src/main/java/com/novacart/inventory/StockRepository.java',187,0);218INSERT INTO "commits" VALUES(32,'c8a51fe','inventory','Tom Becker',34,'inventory: reservation service with soft holds','src/main/java/com/novacart/inventory/ReservationService.java',142,0);219INSERT INTO "commits" VALUES(33,'0f6b294','catalog','Ravi Shah',35,'catalog: index price rows by (currency, product_id)','db/migrations/0012_product_price_tier_index.sql',12,4);220INSERT INTO "commits" VALUES(34,'a2740db','search','Mei Tanaka',36,'search: enable query cache in front of the index','src/search/query.py',41,6);221INSERT INTO "commits" VALUES(35,'94ecf13','api-gateway','Priya Nair',37,'api-gateway: structured access logs with correlation ids','internal/router/routes.go,internal/middleware/ratelimit.go',47,12);222INSERT INTO "commits" VALUES(36,'6b18d5a','inventory','Ravi Shah',38,'inventory: REST surface for levels and holds','src/main/java/com/novacart/inventory/StockController.java',108,0);223INSERT INTO "commits" VALUES(37,'d7f30c6','storefront-web','Mei Tanaka',39,'storefront-web: checkout page skeleton behind cart cookie','src/app/checkout/page.tsx',63,21);224INSERT INTO "commits" VALUES(38,'1e59b8f','checkout','Nina Kowalski',40,'checkout: release inventory hold when capture fails','src/checkout/orchestrator.py,tests/test_idempotency.py',38,7);225INSERT INTO "commits" VALUES(39,'83c6a4e','media-service','Jordan Blake',41,'media-service: object store adapter and signed URLs','src/media/assets.py',96,0);226INSERT INTO "commits" VALUES(40,'f501d29','media-service','Sam Whitfield',42,'media-service: responsive variant ladder on upload','src/media/transcode.py',121,0);227INSERT INTO "commits" VALUES(41,'2db947c','analytics-worker','Ravi Shah',43,'analytics-worker: AMQP consumer skeleton','src/analytics/consumer.py',104,0);228INSERT INTO "commits" VALUES(42,'b6e0851','analytics-worker','Nina Kowalski',44,'analytics-worker: per-minute rollups into warehouse staging','src/analytics/aggregates.py',113,0);229INSERT INTO "commits" VALUES(43,'40a2f7d','payments','Lena Ortiz',45,'payments: chunk settlement batches so one merchant cannot stall the run','src/payments/settlement.py',34,11);230INSERT INTO "commits" VALUES(44,'cf83e16','notifications','Alex Osei',46,'notifications: exponential backoff with jitter on requeue','src/notifications/queue.py',27,8);231INSERT INTO "commits" VALUES(45,'79bd403','search','Jordan Blake',47,'search: assert ranking weights sum to 1.0 at import','src/search/ranking.py',9,1);232INSERT INTO "commits" VALUES(46,'e352cb8','catalog','Sam Whitfield',48,'catalog: drop discontinued products from listings','src/catalog/repository.py',11,4);233INSERT INTO "commits" VALUES(47,'05c9a71','storefront-web','Jordan Blake',49,'storefront-web: abort in-flight requests after 6s','src/lib/api-client.ts',22,6);234INSERT INTO "commits" VALUES(48,'ab417ef','api-gateway','Tom Becker',50,'api-gateway: reap idle rate-limit buckets every minute','internal/middleware/ratelimit.go',26,2);235INSERT INTO "commits" VALUES(49,'3c8e60b','checkout','Lena Ortiz',51,'checkout: refund intents and the async settle worker','src/checkout/refunds.py',132,0);236INSERT INTO "commits" VALUES(50,'d914072','inventory','Tom Becker',52,'inventory: expire holds after 20 minutes','src/main/java/com/novacart/inventory/ReservationService.java',29,6);237INSERT INTO "commits" VALUES(51,'6741bfa','payments','Diego Ramos',53,'payments: fail the payment when the receipt is undeliverable','src/payments/capture.py,src/payments/notify_client.py',42,9);238INSERT INTO "commits" VALUES(52,'8e0d35c','media-service','Jordan Blake',54,'media-service: cache-control headers on origin responses','src/media/assets.py',15,3);239INSERT INTO "commits" VALUES(53,'b25a9d8','analytics-worker','Ravi Shah',55,'analytics-worker: ack batches with multiple=true','src/analytics/consumer.py',19,12);240INSERT INTO "commits" VALUES(54,'17ce4b6','search','Mei Tanaka',56,'search: shard-aware index client','src/search/query.py,src/search/indexer.py',44,17);241INSERT INTO "commits" VALUES(55,'e6b8103','storefront-web','Nina Kowalski',57,'storefront-web: sale badge on discounted cards','src/components/ProductGrid.tsx',24,5);242INSERT INTO "commits" VALUES(56,'9f0a4d7','checkout','Mei Tanaka',58,'checkout: docs for the submit ordering guarantees','src/checkout/orchestrator.py',18,2);243INSERT INTO "commits" VALUES(57,'42fd81e','notifications','Alex Osei',59,'notifications: park messages on the DLQ after 5 attempts','src/notifications/queue.py',21,4);244INSERT INTO "commits" VALUES(58,'c07e5b2','api-gateway','Priya Nair',60,'api-gateway: cut v3.0.0','internal/config/config.go',3,3);245INSERT INTO "commits" VALUES(59,'5a3b16d','payments','Diego Ramos',62,'payments: log effective config at startup','src/payments/settings.py',14,2);246INSERT INTO "commits" VALUES(60,'e814c90','catalog','Sam Whitfield',63,'catalog: return None instead of raising on missing price row','src/catalog/repository.py,src/catalog/pricing.py',17,11);247INSERT INTO "commits" VALUES(61,'76d2fa4','storefront-web','Jordan Blake',64,'storefront-web: bump next to 14.1.3','src/lib/api-client.ts',6,6);248INSERT INTO "commits" VALUES(62,'1bf9037','search','Jordan Blake',65,'search: personalize ranking for logged-in segments','src/search/ranking.py,tests/test_ranking.py',52,8);249INSERT INTO "commits" VALUES(63,'d5807ae','inventory','Ravi Shah',66,'inventory: batch stock lookups with ANY()','src/main/java/com/novacart/inventory/StockRepository.java',38,14);250INSERT INTO "commits" VALUES(64,'0ac6e39','checkout','Nina Kowalski',67,'checkout: banker''s rounding for tax to match the ledger','src/checkout/cart.py',23,9);251INSERT INTO "commits" VALUES(65,'9e47b51','api-gateway','Tom Becker',68,'api-gateway: per-route method filtering','internal/router/routes.go',31,7);252INSERT INTO "commits" VALUES(66,'38a0dc7','notifications','Alex Osei',69,'notifications: money filter for template amounts','src/notifications/templates.py',12,1);253INSERT INTO "commits" VALUES(67,'b1f6e82','analytics-worker','Nina Kowalski',70,'analytics-worker: drop unknown event types by default','src/analytics/aggregates.py',26,6);254INSERT INTO "commits" VALUES(68,'4c2d709','media-service','Sam Whitfield',71,'media-service: skip transcode when the variant etag matches','src/media/transcode.py',21,5);255INSERT INTO "commits" VALUES(69,'72e5a1b','payments','Lena Ortiz',72,'payments: record settlement receipts for reconciliation','src/payments/settlement.py',29,6);256INSERT INTO "commits" VALUES(70,'af309d6','storefront-web','Mei Tanaka',73,'storefront-web: prioritize the first four grid images','src/components/ProductGrid.tsx',14,3);257INSERT INTO "commits" VALUES(71,'6d84c05','search','Mei Tanaka',74,'search: stable cache keys from sorted JSON payloads','src/search/query.py',19,12);258INSERT INTO "commits" VALUES(72,'c93b7e4','checkout','Lena Ortiz',75,'checkout: cancel_refund guards already-settled refunds','src/checkout/refunds.py',22,3);259INSERT INTO "commits" VALUES(73,'20fa68d','inventory','Tom Becker',76,'inventory: SELECT ... FOR UPDATE while placing holds','src/main/java/com/novacart/inventory/StockRepository.java',27,8);260INSERT INTO "commits" VALUES(74,'e5710bc','api-gateway','Priya Nair',77,'api-gateway: read rate limit from config instead of a const','internal/middleware/ratelimit.go,internal/config/config.go',33,14);261INSERT INTO "commits" VALUES(75,'8b4e0f3','catalog','Ravi Shah',78,'catalog: ANALYZE after building the price index','db/migrations/0012_product_price_tier_index.sql',4,0);262INSERT INTO "commits" VALUES(76,'31c9d7a','payments','Diego Ramos',79,'payments: surface processor decline reasons to callers','src/payments/capture.py,tests/test_capture_retries.py',36,11);263INSERT INTO "commits" VALUES(77,'f7a2065','analytics-worker','Ravi Shah',80,'analytics-worker: heartbeat every 30s to survive slow flushes','src/analytics/consumer.py',11,3);264INSERT INTO "commits" VALUES(78,'594be18','storefront-web','Nina Kowalski',81,'storefront-web: memoize cart totals selector','src/components/CartSummary.tsx',17,9);265INSERT INTO "commits" VALUES(79,'ad0637f','notifications','Priya Nair',82,'notifications: reuse one requests.Session across sends','src/notifications/sender.py',18,7);266INSERT INTO "commits" VALUES(80,'6ef1c94','search','Jordan Blake',83,'search: cap segment affinity at 1.0','src/search/ranking.py',5,2);267INSERT INTO "commits" VALUES(81,'c26805d','checkout','Mei Tanaka',84,'checkout: helper fixtures for the integration suite','tests/test_idempotency.py',29,6);268INSERT INTO "commits" VALUES(82,'13f9ea7','media-service','Jordan Blake',85,'media-service: reject sources over 25MB','src/media/transcode.py',13,2);269INSERT INTO "commits" VALUES(83,'7052bd1','inventory','Ravi Shah',86,'inventory: reject stock batches larger than 200 SKUs','src/main/java/com/novacart/inventory/StockController.java',15,3);270INSERT INTO "commits" VALUES(84,'b8d43a6','api-gateway','Tom Becker',87,'api-gateway: /v2/orders route registered dark at weight 0','internal/router/routes.go',8,1);271INSERT INTO "commits" VALUES(85,'2f60c8e','catalog','Sam Whitfield',88,'catalog: typed availability enum replaces string literals','src/catalog/models.py,src/catalog/repository.py',41,23);272INSERT INTO "commits" VALUES(86,'94ab125','payments','Lena Ortiz',89,'payments: skip settlement when there is nothing to settle','src/payments/settlement.py',9,2);273INSERT INTO "commits" VALUES(87,'e0c7f38','storefront-web','Jordan Blake',90,'storefront-web: shape API errors into a typed ApiError','src/lib/api-client.ts',34,12);274INSERT INTO "commits" VALUES(88,'5b198da','search','Mei Tanaka',91,'search: flush the indexer buffer on SIGTERM','src/search/indexer.py',24,5);275INSERT INTO "commits" VALUES(89,'df3620c','notifications','Alex Osei',92,'notifications: log provider rejections with a truncated body','src/notifications/sender.py',12,4);276INSERT INTO "commits" VALUES(90,'a7e4593','checkout','Nina Kowalski',93,'checkout: never log the partner credential value','src/checkout/config.py',8,3);277INSERT INTO "commits" VALUES(91,'6c05b7f','analytics-worker','Nina Kowalski',94,'analytics-worker: revenue counters alongside event counts','src/analytics/aggregates.py',23,7);278INSERT INTO "commits" VALUES(92,'84fa2e1','api-gateway','Priya Nair',95,'api-gateway: cut v3.4.0','internal/config/config.go',3,3);279INSERT INTO "commits" VALUES(93,'10d9c46','inventory','Tom Becker',96,'inventory: return 409 rather than 500 on insufficient stock','src/main/java/com/novacart/inventory/StockController.java',19,8);280INSERT INTO "commits" VALUES(94,'cb7031a','catalog','Sam Whitfield',97,'catalog: pricing returns dictionaries the API can serialize','src/catalog/models.py',21,4);281INSERT INTO "commits" VALUES(95,'3e58f0b','payments','Diego Ramos',98,'payments: correlation id header on every notifications call','src/payments/notify_client.py',14,3);282INSERT INTO "commits" VALUES(96,'97b2e6d','storefront-web','Mei Tanaka',99,'storefront-web: redirect empty carts away from checkout','src/app/checkout/page.tsx',16,4);283INSERT INTO "commits" VALUES(97,'42c1a80','search','Jordan Blake',100,'search: docs on the ranking weight contract','src/search/ranking.py',15,2);284INSERT INTO "commits" VALUES(98,'d6e937f','checkout','Lena Ortiz',101,'checkout: promotion stacking rules','src/checkout/cart.py',37,12);285INSERT INTO "commits" VALUES(99,'0847bce','media-service','Sam Whitfield',102,'media-service: WebP twin for every ladder rung','src/media/transcode.py',26,9);286INSERT INTO "commits" VALUES(100,'b53d19e','notifications','Priya Nair',103,'notifications: warn on incomplete template directories','src/notifications/templates.py',17,5);287INSERT INTO "commits" VALUES(101,'7fa4025','api-gateway','Tom Becker',104,'api-gateway: deprecation-notice middleware','internal/router/routes.go',22,3);288INSERT INTO "commits" VALUES(102,'ec1904b','analytics-worker','Ravi Shah',105,'analytics-worker: prefetch 200 to bound consumer memory','src/analytics/consumer.py',8,3);289INSERT INTO "commits" VALUES(103,'58b7d3c','payments','Lena Ortiz',106,'payments: batch settlement retries by merchant','src/payments/settlement.py',31,14);290INSERT INTO "commits" VALUES(104,'a4f0e26','inventory','Ravi Shah',107,'inventory: quiet rollback helper to stop leaking connections','src/main/java/com/novacart/inventory/ReservationService.java',34,11);291INSERT INTO "commits" VALUES(105,'2d6ba95','catalog','Ravi Shah',108,'catalog: partial index on non-standard price tiers','db/migrations/0012_product_price_tier_index.sql',7,1);292INSERT INTO "commits" VALUES(106,'f918c04','storefront-web','Nina Kowalski',109,'storefront-web: loading and error states for the cart panel','src/components/CartSummary.tsx',28,6);293INSERT INTO "commits" VALUES(107,'63ce7a8','search','Mei Tanaka',110,'search: apply deletes before upserts inside a flush','src/search/indexer.py',18,9);294INSERT INTO "commits" VALUES(108,'8a5f21d','checkout','Mei Tanaka',111,'checkout: assert hold release on capture failure','tests/test_idempotency.py',24,2);295INSERT INTO "commits" VALUES(109,'10e4b7c','notifications','Alex Osei',112,'notifications: delivery log records provider message ids','src/notifications/sender.py',21,6);296INSERT INTO "commits" VALUES(110,'cd2903f','api-gateway','Priya Nair',113,'api-gateway: bump go to 1.22','internal/config/config.go',4,4);297INSERT INTO "commits" VALUES(111,'7b3e6a1','payments','Diego Ramos',114,'payments: retry receipts up to 3 times with backoff','src/payments/notify_client.py,src/payments/settings.py',43,12);298INSERT INTO "commits" VALUES(112,'e6047db','media-service','Jordan Blake',115,'media-service: point reads at the CDN edge','src/media/assets.py',27,8);299INSERT INTO "commits" VALUES(113,'35a8c92','analytics-worker','Nina Kowalski',116,'analytics-worker: nack the whole batch when aggregation throws','src/analytics/consumer.py',16,7);300INSERT INTO "commits" VALUES(114,'b0f75e3','catalog','Sam Whitfield',117,'catalog: log slow listings over 400ms','src/catalog/pricing.py',13,2);301INSERT INTO "commits" VALUES(115,'94d1c67','storefront-web','Jordan Blake',118,'storefront-web: retry only on 408/429/5xx','src/lib/api-client.ts',11,5);302INSERT INTO "commits" VALUES(116,'2ea590b','inventory','Tom Becker',119,'inventory: name the Hikari pool so metrics are attributable','src/main/java/com/novacart/inventory/StockRepository.java',6,1);303INSERT INTO "commits" VALUES(117,'f43b8d0','search','Jordan Blake',120,'search: round scores in API responses','src/search/ranking.py',4,2);304INSERT INTO "commits" VALUES(118,'5c17e49','checkout','Nina Kowalski',121,'checkout: read payment timeout from the environment','src/checkout/config.py',9,3);305INSERT INTO "commits" VALUES(119,'a980f2e','notifications','Priya Nair',122,'notifications: worker loop entrypoint','src/notifications/queue.py',14,1);306INSERT INTO "commits" VALUES(120,'d3ba605','api-gateway','Tom Becker',123,'api-gateway: chain middleware in a fixed, documented order','internal/router/routes.go',26,18);307INSERT INTO "commits" VALUES(121,'76e2109','payments','Diego Ramos',124,'payments: cover the undeliverable-receipt path in tests','tests/test_capture_retries.py',27,4);308INSERT INTO "commits" VALUES(122,'1fc48ab','analytics-worker','Ravi Shah',125,'analytics-worker: flush on a 10s timer as well as on size','src/analytics/consumer.py',19,8);309INSERT INTO "commits" VALUES(123,'8d5b03c','media-service','Sam Whitfield',126,'media-service: LANCZOS resampling for downscales','src/media/transcode.py',8,4);310INSERT INTO "commits" VALUES(124,'e7c1946','catalog','Ravi Shah',127,'catalog: build the price index CONCURRENTLY','db/migrations/0012_product_price_tier_index.sql',6,6);311INSERT INTO "commits" VALUES(125,'3b0af78','storefront-web','Mei Tanaka',128,'storefront-web: cut v2.9.0','src/lib/api-client.ts',2,2);312INSERT INTO "commits" VALUES(126,'c50e832','search','Mei Tanaka',129,'search: 300s TTL on cached query payloads','src/search/query.py',12,4);313INSERT INTO "commits" VALUES(127,'9147fed','checkout','Lena Ortiz',130,'checkout: refund ledger migration','db/migrations/0031_refund_ledger.sql',34,0);314INSERT INTO "commits" VALUES(128,'62d70b4','inventory','Ravi Shah',131,'inventory: log hold placement with line counts','src/main/java/com/novacart/inventory/ReservationService.java',9,2);315INSERT INTO "commits" VALUES(129,'af6b153','notifications','Alex Osei',132,'notifications: cache the Jinja environment','src/notifications/templates.py',11,6);316INSERT INTO "commits" VALUES(130,'0e93da7','api-gateway','Priya Nair',133,'api-gateway: keepalive tuning on upstream dials','internal/proxy/pool.go',96,0);317INSERT INTO "commits" VALUES(131,'d81c40e','payments','Lena Ortiz',134,'payments: settle yesterday by default in the cron entrypoint','src/payments/settlement.py',12,5);318INSERT INTO "commits" VALUES(132,'5fa2c68','storefront-web','Nina Kowalski',135,'storefront-web: disable the CTA on empty carts','src/components/CartSummary.tsx',7,2);319INSERT INTO "commits" VALUES(133,'b6407e9','analytics-worker','Nina Kowalski',136,'analytics-worker: docs on replay safety','src/analytics/aggregates.py',14,1);320INSERT INTO "commits" VALUES(134,'27e8b1d','catalog','Sam Whitfield',137,'catalog: guard against negative money values','src/catalog/models.py',8,1);321INSERT INTO "commits" VALUES(135,'ca396f2','search','Jordan Blake',138,'search: test that stale documents decay below fresh ones','tests/test_ranking.py',13,2);322INSERT INTO "commits" VALUES(136,'704be5a','checkout','Mei Tanaka',139,'checkout: cut v1.8.0','src/checkout/config.py',2,2);323INSERT INTO "commits" VALUES(137,'e2d7f81','inventory','Tom Becker',140,'inventory: cut v0.9.0','src/main/java/com/novacart/inventory/StockController.java',3,3);324INSERT INTO "commits" VALUES(138,'39fb2c7','search','Mei Tanaka',141,'search: warm the cache for the top 500 head terms on boot','src/search/query.py',46,7);325INSERT INTO "commits" VALUES(139,'8ce0451','checkout','Lena Ortiz',142,'checkout: link refund intents to ledger entries','db/migrations/0031_refund_ledger.sql,src/checkout/refunds.py',41,13);326INSERT INTO "commits" VALUES(140,'b74d9e0','api-gateway','Priya Nair',143,'api-gateway: pool health probes every 15s','internal/proxy/pool.go',38,6);327INSERT INTO "commits" VALUES(141,'1a6c83f','payments','Diego Ramos',144,'payments: ENG-1804 record failure reason on declines','src/payments/capture.py',18,6);328INSERT INTO "commits" VALUES(142,'6205ade','storefront-web','Jordan Blake',145,'storefront-web: track checkout_started from the summary CTA','src/components/CartSummary.tsx',15,3);329INSERT INTO "commits" VALUES(143,'d0b4917','catalog','Sam Whitfield',146,'catalog: rank_hint ordering for category listings','src/catalog/repository.py',12,6);330INSERT INTO "commits" VALUES(144,'4e8f16c','inventory','Ravi Shah',147,'inventory: sweeper releases expired holds','src/main/java/com/novacart/inventory/ReservationService.java',44,9);331INSERT INTO "commits" VALUES(145,'97ca3b5','notifications','Alex Osei',148,'notifications: raise smtp pool to 8 connections','src/notifications/sender.py',5,5);332INSERT INTO "commits" VALUES(146,'f31de84','analytics-worker','Ravi Shah',149,'analytics-worker: bump pika to 1.3.2','src/analytics/consumer.py',3,3);333INSERT INTO "commits" VALUES(147,'5d92016','media-service','Jordan Blake',150,'media-service: 15 minute TTL on signed origin URLs','src/media/assets.py',10,4);334INSERT INTO "commits" VALUES(148,'ae470f3','checkout','Nina Kowalski',151,'checkout: extract promotion application from totals()','src/checkout/cart.py',33,27);335INSERT INTO "commits" VALUES(149,'c8b1652','search','Jordan Blake',152,'search: merchandising boost term in the blend','src/search/ranking.py,tests/test_ranking.py',39,14);336INSERT INTO "commits" VALUES(150,'20e6fd9','api-gateway','Tom Becker',153,'api-gateway: fall back to remote addr when X-Api-Client is absent','internal/middleware/ratelimit.go',17,5);337INSERT INTO "commits" VALUES(151,'b3f7048','payments','Lena Ortiz',154,'payments: settlement batch size configurable at 250','src/payments/settings.py,src/payments/settlement.py',14,7);338INSERT INTO "commits" VALUES(152,'76d05ca','storefront-web','Mei Tanaka',155,'storefront-web: responsive sizes attribute on grid images','src/components/ProductGrid.tsx',9,3);339INSERT INTO "commits" VALUES(153,'e41c983','inventory','Tom Becker',156,'inventory: bump HikariCP to 5.1.0','src/main/java/com/novacart/inventory/StockRepository.java',4,4);340INSERT INTO "commits" VALUES(154,'0af5b27','catalog','Ravi Shah',157,'catalog: drop the superseded single-column price index','db/migrations/0012_product_price_tier_index.sql',3,1);341INSERT INTO "commits" VALUES(155,'d6820ec','notifications','Priya Nair',158,'notifications: bound DLQ replays behind an admin command','src/notifications/queue.py',26,8);342INSERT INTO "commits" VALUES(156,'958ea31','analytics-worker','Nina Kowalski',159,'analytics-worker: channel dimension on rollups','src/analytics/aggregates.py',22,11);343INSERT INTO "commits" VALUES(157,'3c74b6f','checkout','Mei Tanaka',160,'checkout: docs for refund path selection','src/checkout/refunds.py',17,3);344INSERT INTO "commits" VALUES(158,'e09d5a8','search','Mei Tanaka',161,'search: commit stream offsets only after a successful flush','src/search/indexer.py',21,12);345INSERT INTO "commits" VALUES(159,'127c4be','api-gateway','Priya Nair',162,'api-gateway: cut v4.0.0','internal/config/config.go',3,3);346INSERT INTO "commits" VALUES(160,'84fb90d','payments','Diego Ramos',163,'payments: freeze CaptureResult as a dataclass','src/payments/capture.py',24,16);347INSERT INTO "commits" VALUES(161,'b1e6273','media-service','Sam Whitfield',164,'media-service: quality knobs for JPEG and WebP encodes','src/media/transcode.py',16,6);348INSERT INTO "commits" VALUES(162,'5a03fc9','storefront-web','Nina Kowalski',165,'storefront-web: aria-busy on the loading cart skeleton','src/components/CartSummary.tsx',6,2);349INSERT INTO "commits" VALUES(163,'de1478b','inventory','Ravi Shah',166,'inventory: surface hold expiry in the create response','src/main/java/com/novacart/inventory/StockController.java',12,4);350INSERT INTO "commits" VALUES(164,'6fb2091','catalog','Sam Whitfield',167,'catalog: bulk price lookup for the category page rewrite','src/catalog/repository.py,src/catalog/pricing.py',58,9);351INSERT INTO "commits" VALUES(165,'9d5083a','notifications','Alex Osei',168,'notifications: locale passthrough to templates','src/notifications/templates.py',18,7);352INSERT INTO "commits" VALUES(166,'42a7ec6','search','Jordan Blake',169,'search: retune recency halflife to 45 days','src/search/ranking.py',4,4);353INSERT INTO "commits" VALUES(167,'c07b48f','checkout','Lena Ortiz',170,'checkout: partial unique index on open refunds','db/migrations/0031_refund_ledger.sql',9,2);354INSERT INTO "commits" VALUES(168,'31ed970','analytics-worker','Ravi Shah',171,'analytics-worker: drain cleanly on SIGTERM','src/analytics/consumer.py',23,6);355INSERT INTO "commits" VALUES(169,'7b6c2d4','api-gateway','Tom Becker',172,'api-gateway: document the route table fields','internal/router/routes.go',19,4);356INSERT INTO "commits" VALUES(170,'ea38516','payments','Lena Ortiz',173,'payments: keep settling other merchants when one batch fails','src/payments/settlement.py',17,9);357INSERT INTO "commits" VALUES(171,'58c9f02','storefront-web','Jordan Blake',174,'storefront-web: correlation id header on every request','src/lib/api-client.ts',14,3);358INSERT INTO "commits" VALUES(172,'0d4a7be','media-service','Jordan Blake',175,'media-service: raise AssetNotFound instead of returning empty bodies','src/media/assets.py',15,8);359INSERT INTO "commits" VALUES(173,'b8250ea','inventory','Tom Becker',176,'inventory: cut v1.0.0','src/main/java/com/novacart/inventory/StockRepository.java',3,3);360INSERT INTO "commits" VALUES(174,'f6013cd','catalog','Ravi Shah',177,'catalog: INCLUDE price columns to make the index covering','db/migrations/0012_product_price_tier_index.sql',5,3);361INSERT INTO "commits" VALUES(175,'295e7ab','checkout','Nina Kowalski',178,'checkout: reuse one PaymentsClient per process','src/checkout/orchestrator.py,src/checkout/refunds.py',19,14);362INSERT INTO "commits" VALUES(176,'cb64f38','search','Mei Tanaka',179,'search: invalidate helper for admin-triggered reindex','src/search/query.py',11,1);363INSERT INTO "commits" VALUES(177,'7a1e05d','notifications','Priya Nair',180,'notifications: cut v1.2.0','src/notifications/sender.py',2,2);364INSERT INTO "commits" VALUES(178,'e5cb241','analytics-worker','Nina Kowalski',181,'analytics-worker: tolerate undecodable payloads','src/analytics/aggregates.py',17,5);365INSERT INTO "commits" VALUES(179,'40f8b96','api-gateway','Priya Nair',182,'api-gateway: expose in-flight connection count','internal/proxy/pool.go',13,2);366INSERT INTO "commits" VALUES(180,'9e207ca','payments','Diego Ramos',183,'payments: bump requests to 2.32.3','src/payments/notify_client.py',3,3);367INSERT INTO "commits" VALUES(181,'163bd50','storefront-web','Mei Tanaka',184,'storefront-web: backorder badge on out-of-stock cards','src/components/ProductGrid.tsx',11,3);368INSERT INTO "commits" VALUES(182,'8d4e7f1','checkout','Mei Tanaka',185,'checkout: reset order fixtures between integration cases','tests/test_idempotency.py',16,4);369INSERT INTO "commits" VALUES(183,'c1a9603','catalog','Sam Whitfield',186,'catalog: log query counts per listing request','src/catalog/pricing.py',14,4);370INSERT INTO "commits" VALUES(184,'36b8ed2','inventory','Ravi Shah',187,'inventory: 3s connection timeout on the stock pool','src/main/java/com/novacart/inventory/StockRepository.java',7,2);371INSERT INTO "commits" VALUES(185,'b027a5e','search','Jordan Blake',188,'search: revert ''personalize anonymous traffic by geo''','src/search/ranking.py',6,34);372INSERT INTO "commits" VALUES(186,'5f30ce8','media-service','Sam Whitfield',189,'media-service: bump pillow to 10.3.0','src/media/transcode.py',3,3);373INSERT INTO "commits" VALUES(187,'e94d16b','notifications','Alex Osei',190,'notifications: template inventory endpoint for support tooling','src/notifications/templates.py',23,6);374INSERT INTO "commits" VALUES(188,'72c58a0','api-gateway','Tom Becker',191,'api-gateway: mount /v1/media route','internal/router/routes.go',6,1);375INSERT INTO "commits" VALUES(189,'af169d3','payments','Lena Ortiz',192,'payments: reconciliation notes in the settlement docstring','src/payments/settlement.py',15,3);376INSERT INTO "commits" VALUES(190,'0b7e4c9','analytics-worker','Ravi Shah',193,'analytics-worker: log how many messages stay unflushed on exit','src/analytics/consumer.py',8,2);377INSERT INTO "commits" VALUES(191,'d5836fe','storefront-web','Nina Kowalski',194,'storefront-web: discount row hidden when there is no discount','src/components/CartSummary.tsx',12,6);378INSERT INTO "commits" VALUES(192,'3ea061c','checkout','Lena Ortiz',195,'checkout: audit trail on every refund action','src/checkout/refunds.py',20,5);379INSERT INTO "commits" VALUES(193,'94b7f25','search','Mei Tanaka',196,'search: cut v2.4.0','src/search/query.py',2,2);380INSERT INTO "commits" VALUES(194,'6c0da81','inventory','Tom Becker',197,'inventory: reject reserve calls for unknown SKUs early','src/main/java/com/novacart/inventory/ReservationService.java',13,4);381INSERT INTO "commits" VALUES(195,'e836b04','catalog','Sam Whitfield',198,'catalog: cut v1.5.0','src/catalog/models.py',2,2);382INSERT INTO "commits" VALUES(196,'17fa5d6','api-gateway','Priya Nair',199,'api-gateway: OPS-204 alert when in-flight connections exceed 5k','internal/proxy/pool.go',21,3);383INSERT INTO "commits" VALUES(197,'b40e9c7','payments','Diego Ramos',200,'payments: cut v2.2.0','src/payments/settings.py',2,2);384INSERT INTO "commits" VALUES(198,'58d1af3','storefront-web','Jordan Blake',201,'storefront-web: force-dynamic on the checkout route','src/app/checkout/page.tsx',5,1);385INSERT INTO "commits" VALUES(199,'c9740eb','notifications','Priya Nair',202,'notifications: jittered backoff to stop retry stampedes','src/notifications/queue.py',13,6);386INSERT INTO "commits" VALUES(200,'2b05e18','analytics-worker','Nina Kowalski',203,'analytics-worker: sort rollup rows for deterministic writes','src/analytics/aggregates.py',9,4);387INSERT INTO "commits" VALUES(201,'70e3fdc','checkout','Nina Kowalski',204,'checkout: reject carts over the line item cap with a typed error','src/checkout/cart.py',14,6);388INSERT INTO "commits" VALUES(202,'e6152ba','media-service','Jordan Blake',205,'media-service: X-Served-By header for edge debugging','src/media/assets.py',7,2);389INSERT INTO "commits" VALUES(203,'4a8d039','search','Jordan Blake',206,'search: benchmark harness for the ranking blend','tests/test_ranking.py',26,3);390INSERT INTO "commits" VALUES(204,'d1cb576','api-gateway','Tom Becker',207,'api-gateway: Retry-After on 429 responses','internal/middleware/ratelimit.go',9,2);391INSERT INTO "commits" VALUES(205,'836f0e2','inventory','Ravi Shah',208,'inventory: structured logging via slf4j placeholders','src/main/java/com/novacart/inventory/StockController.java',18,12);392INSERT INTO "commits" VALUES(206,'0972ecb','payments','Lena Ortiz',209,'payments: guard against zero-amount settlement batches','src/payments/settlement.py',11,3);393INSERT INTO "commits" VALUES(207,'bf6a341','catalog','Ravi Shah',210,'catalog: connection pool sizing notes','src/catalog/repository.py',13,2);394INSERT INTO "commits" VALUES(208,'35e7c80','storefront-web','Mei Tanaka',211,'storefront-web: empty-state copy for filtered grids','src/components/ProductGrid.tsx',10,4);395INSERT INTO "commits" VALUES(209,'e0b48f6','checkout','Mei Tanaka',212,'checkout: ENG-1990 stop double-charging on rapid resubmits','src/checkout/orchestrator.py,tests/test_idempotency.py',31,12);396INSERT INTO "commits" VALUES(210,'7cd2019','notifications','Alex Osei',213,'notifications: fail closed when a template is missing a file','src/notifications/templates.py',15,5);397INSERT INTO "commits" VALUES(211,'9384bd7','search','Mei Tanaka',214,'search: batch flush size raised to 500 documents','src/search/indexer.py',6,4);398INSERT INTO "commits" VALUES(212,'1ea6f5c','analytics-worker','Ravi Shah',215,'analytics-worker: cut v0.7.0','src/analytics/consumer.py',2,2);399INSERT INTO "commits" VALUES(213,'c47b028','api-gateway','Priya Nair',216,'api-gateway: per-upstream TLS material in config','internal/config/config.go',42,8);400INSERT INTO "commits" VALUES(214,'6d0f8a4','payments','Diego Ramos',217,'payments: bump libpayproc to 2.3.1','src/payments/capture.py',3,3);401INSERT INTO "commits" VALUES(215,'b859ed1','media-service','Sam Whitfield',218,'media-service: skip variants when the source is already smaller','src/media/transcode.py',12,5);402INSERT INTO "commits" VALUES(216,'3f6c07e','inventory','Tom Becker',219,'inventory: fail fast when the pool cannot hand out a connection','src/main/java/com/novacart/inventory/StockRepository.java',16,6);403INSERT INTO "commits" VALUES(217,'a02de95','checkout','Lena Ortiz',220,'checkout: cut v2.0.0','src/checkout/config.py',2,2);404INSERT INTO "commits" VALUES(218,'58fb1d3','storefront-web','Nina Kowalski',221,'storefront-web: extract computeTotals for testability','src/components/CartSummary.tsx',27,19);405INSERT INTO "commits" VALUES(219,'d73e802','catalog','Sam Whitfield',222,'catalog: price_single helper for the admin console','src/catalog/pricing.py',14,2);406INSERT INTO "commits" VALUES(220,'9c15b6a','search','Jordan Blake',223,'search: doc the segment boost contract','src/search/ranking.py',11,2);407INSERT INTO "commits" VALUES(221,'40a7e6f','notifications','Priya Nair',224,'notifications: bump redis client to 5.0.4','src/notifications/queue.py',3,3);408INSERT INTO "commits" VALUES(222,'e51c983','analytics-worker','Nina Kowalski',225,'analytics-worker: warehouse staging writer batches by minute','src/analytics/aggregates.py',24,9);409INSERT INTO "commits" VALUES(223,'27b0da6','api-gateway','Tom Becker',226,'api-gateway: mount /internal/debug for rollout inspection','internal/handlers/debug.go,internal/router/routes.go',64,2);410INSERT INTO "commits" VALUES(224,'b6ea410','payments','Lena Ortiz',227,'payments: cut v2.4.0','src/payments/settlement.py',2,2);411INSERT INTO "commits" VALUES(225,'704f2ce','checkout','Nina Kowalski',228,'checkout: describe() logs whether the partner key is set','src/checkout/config.py',12,4);412INSERT INTO "commits" VALUES(226,'1c58ea9','inventory','Ravi Shah',229,'inventory: hold ids prefixed for log greppability','src/main/java/com/novacart/inventory/ReservationService.java',6,3);413INSERT INTO "commits" VALUES(227,'f9037b2','storefront-web','Jordan Blake',230,'storefront-web: log cart load failures with the cart id','src/app/checkout/page.tsx',9,3);414INSERT INTO "commits" VALUES(228,'8ba4e07','media-service','Jordan Blake',231,'media-service: cut v0.6.0','src/media/assets.py',2,2);415INSERT INTO "commits" VALUES(229,'d2e6153','search','Mei Tanaka',232,'search: retry a failed flush without dropping the buffer','src/search/indexer.py',18,7);416INSERT INTO "commits" VALUES(230,'60c19fa','catalog','Ravi Shah',233,'catalog: chore: tidy imports across the package','src/catalog/repository.py,src/catalog/models.py',12,18);417INSERT INTO "commits" VALUES(231,'a4157be','api-gateway','Priya Nair',234,'api-gateway: cut v4.6.0','internal/config/config.go',3,3);418INSERT INTO "commits" VALUES(232,'7e39c05','payments','Diego Ramos',235,'payments: mock libpayproc in the capture tests','tests/test_capture_retries.py',22,11);419INSERT INTO "commits" VALUES(233,'cf8b230','notifications','Alex Osei',236,'notifications: honour provider 429s before retrying','src/notifications/sender.py',17,6);420INSERT INTO "commits" VALUES(234,'39d604e','analytics-worker','Ravi Shah',237,'analytics-worker: OPS-241 dashboards for consumer lag','src/analytics/consumer.py',14,3);421INSERT INTO "commits" VALUES(235,'5b7ea82','checkout','Mei Tanaka',238,'checkout: quarantine flake watch on test_idempotency','tests/test_idempotency.py',8,2);422INSERT INTO "commits" VALUES(236,'e1408cd','storefront-web','Mei Tanaka',239,'storefront-web: cut v3.0.0','src/lib/api-client.ts',2,2);423INSERT INTO "commits" VALUES(237,'94ec617','inventory','Tom Becker',240,'inventory: expose pool metrics on /actuator','src/main/java/com/novacart/inventory/StockRepository.java',19,4);424INSERT INTO "commits" VALUES(238,'0d3ba58','search','Jordan Blake',241,'search: ignore segment affinity for anonymous sessions','src/search/ranking.py,tests/test_ranking.py',17,8);425INSERT INTO "commits" VALUES(239,'b52907f','payments','Lena Ortiz',242,'payments: settle in merchant id order for reproducible runs','src/payments/settlement.py',7,4);426INSERT INTO "commits" VALUES(240,'6ac8de1','catalog','Sam Whitfield',243,'catalog: effective price prefers sale when it is lower','src/catalog/models.py',13,5);427INSERT INTO "commits" VALUES(241,'f70e2b4','api-gateway','Tom Becker',244,'api-gateway: include goroutine count in the debug dump','internal/handlers/debug.go',8,2);428INSERT INTO "commits" VALUES(242,'285cb90','notifications','Priya Nair',245,'notifications: cut v1.4.0','src/notifications/queue.py',2,2);429INSERT INTO "commits" VALUES(243,'c3f1a76','storefront-web','Nina Kowalski',246,'storefront-web: compact variant of the cart summary for mobile','src/components/CartSummary.tsx',21,7);430INSERT INTO "commits" VALUES(244,'40b9e53','analytics-worker','Nina Kowalski',247,'analytics-worker: bump warehouse driver to 3.9.1','src/analytics/aggregates.py',3,3);431INSERT INTO "commits" VALUES(245,'d867fa2','checkout','Lena Ortiz',248,'checkout: settled refunds keep an audit row','db/migrations/0031_refund_ledger.sql,src/checkout/refunds.py',26,9);432INSERT INTO "commits" VALUES(246,'1fb5074','media-service','Sam Whitfield',249,'media-service: guard against unreadable image sources','src/media/transcode.py',14,4);433INSERT INTO "commits" VALUES(247,'9e6d38b','inventory','Ravi Shah',250,'inventory: cut v1.3.0','src/main/java/com/novacart/inventory/StockController.java',3,3);434INSERT INTO "commits" VALUES(248,'72a04ef','search','Mei Tanaka',251,'search: cache hit/miss counters for the dashboard','src/search/query.py',16,4);435INSERT INTO "commits" VALUES(249,'b19c805','payments','Diego Ramos',252,'payments: docs on the capture-then-receipt contract','src/payments/capture.py',16,3);436INSERT INTO "commits" VALUES(250,'e4823da','api-gateway','Priya Nair',253,'api-gateway: env override for the request timeout','internal/config/config.go',11,3);437INSERT INTO "commits" VALUES(251,'50cd671','catalog','Ravi Shah',254,'catalog: cut v1.7.0','src/catalog/pricing.py',2,2);438INSERT INTO "commits" VALUES(252,'af2e79c','storefront-web','Jordan Blake',255,'storefront-web: exponential backoff between fetch retries','src/lib/api-client.ts',13,5);439INSERT INTO "commits" VALUES(253,'836be14','notifications','Alex Osei',256,'notifications: pool name derived from smtp_pool config','src/notifications/sender.py',8,3);440INSERT INTO "commits" VALUES(254,'c065d29','checkout','Nina Kowalski',257,'checkout: shipping cost added after tax, not before','src/checkout/cart.py',12,8);441INSERT INTO "commits" VALUES(255,'3d7f0a6','analytics-worker','Ravi Shah',258,'analytics-worker: queue name configurable per environment','src/analytics/consumer.py',9,4);442INSERT INTO "commits" VALUES(256,'7bd4e91','inventory','Tom Becker',259,'inventory: close the datasource on shutdown','src/main/java/com/novacart/inventory/StockRepository.java',8,1);443INSERT INTO "commits" VALUES(257,'e137c40','search','Jordan Blake',260,'search: cut v2.9.0','src/search/ranking.py',2,2);444INSERT INTO "commits" VALUES(258,'5a0eb37','checkout','Lena Ortiz',261,'checkout: instant_refunds flag scaffolding, disabled everywhere','src/checkout/refunds.py,src/checkout/config.py',38,6);445INSERT INTO "commits" VALUES(259,'c8f4126','storefront-web','Nina Kowalski',262,'storefront-web: money formatting helper shared by cart and grid','src/components/CartSummary.tsx,src/components/ProductGrid.tsx',24,21);446INSERT INTO "commits" VALUES(260,'907dbe5','payments','Diego Ramos',263,'payments: raise notifications timeout to 30s for the EU region','src/payments/settings.py',4,4);447INSERT INTO "commits" VALUES(261,'34e6b8a','api-gateway','Tom Becker',264,'api-gateway: keep /internal/debug out of the public route table docs','internal/router/routes.go',5,2);448INSERT INTO "commits" VALUES(262,'b7d1e60','search','Mei Tanaka',265,'search: short-circuit empty search terms before hitting the index','src/search/query.py',13,4);449INSERT INTO "commits" VALUES(263,'e05c2f9','catalog','Sam Whitfield',266,'catalog: fetch_prices_bulk returns a dict keyed by product id','src/catalog/repository.py',15,9);450INSERT INTO "commits" VALUES(264,'16fa4b8','notifications','Priya Nair',267,'notifications: correlation ids threaded through the queue','src/notifications/queue.py,src/notifications/sender.py',22,8);451INSERT INTO "commits" VALUES(265,'d9036ce','inventory','Ravi Shah',268,'inventory: bump spring boot to 3.2.5','src/main/java/com/novacart/inventory/StockController.java',5,5);452INSERT INTO "commits" VALUES(266,'72be015','analytics-worker','Nina Kowalski',269,'analytics-worker: refund_issued added to the known event set','src/analytics/aggregates.py',6,2);453INSERT INTO "commits" VALUES(267,'af38d64','media-service','Jordan Blake',270,'media-service: mimetype detection from the object key','src/media/assets.py',11,4);454INSERT INTO "commits" VALUES(268,'0c751ea','checkout','Mei Tanaka',271,'checkout: split submit tests from refund tests','tests/test_idempotency.py',19,14);455INSERT INTO "commits" VALUES(269,'e4b8907','payments','Lena Ortiz',272,'payments: cut v2.6.0','src/payments/settlement.py',2,2);456INSERT INTO "commits" VALUES(270,'63cd0a2','api-gateway','Priya Nair',273,'api-gateway: close idle upstream connections on release','internal/proxy/pool.go',17,5);457INSERT INTO "commits" VALUES(271,'8f2a071','search','Jordan Blake',274,'search: expose ranking components in debug responses','src/search/ranking.py',13,4);458INSERT INTO "commits" VALUES(272,'d40ba69','storefront-web','Mei Tanaka',275,'storefront-web: prefetch the checkout route from the cart page','src/app/checkout/page.tsx',8,2);459INSERT INTO "commits" VALUES(273,'1b96e2f','catalog','Ravi Shah',276,'catalog: vacuum settings note for the price table','db/migrations/0012_product_price_tier_index.sql',5,1);460INSERT INTO "commits" VALUES(274,'cea7304','notifications','Alex Osei',277,'notifications: autoescape on by default in the Jinja env','src/notifications/templates.py',6,2);461INSERT INTO "commits" VALUES(275,'47f0d81','inventory','Tom Becker',278,'inventory: separate read and write paths in the repository','src/main/java/com/novacart/inventory/StockRepository.java',41,26);462INSERT INTO "commits" VALUES(276,'b3e52ca','analytics-worker','Ravi Shah',279,'analytics-worker: cut v0.9.0','src/analytics/consumer.py',2,2);463INSERT INTO "commits" VALUES(277,'95d7016','checkout','Nina Kowalski',280,'checkout: merge duplicate SKUs when adding to cart','src/checkout/cart.py',17,6);464INSERT INTO "commits" VALUES(278,'f0a4e68','payments','Diego Ramos',281,'payments: SEC-812 stop logging the auth token on decline','src/payments/capture.py',7,5);465INSERT INTO "commits" VALUES(279,'2c8b53d','api-gateway','Tom Becker',282,'api-gateway: v2 orders accepts PATCH','internal/router/routes.go',4,2);466INSERT INTO "commits" VALUES(280,'8e17ba0','media-service','Sam Whitfield',283,'media-service: record the source etag on every variant','src/media/transcode.py',12,5);467INSERT INTO "commits" VALUES(281,'6da039e','search','Mei Tanaka',284,'search: normalize terms before hashing the cache key','src/search/query.py',9,4);468INSERT INTO "commits" VALUES(282,'b41c07f','storefront-web','Jordan Blake',285,'storefront-web: bump react to 18.3.1','src/lib/api-client.ts',4,4);469INSERT INTO "commits" VALUES(283,'3079eac','catalog','Sam Whitfield',286,'catalog: cut v1.8.0','src/catalog/models.py',2,2);470INSERT INTO "commits" VALUES(284,'de6285b','notifications','Priya Nair',287,'notifications: cap backoff at 30 seconds','src/notifications/queue.py',5,3);471INSERT INTO "commits" VALUES(285,'70fb4c1','inventory','Ravi Shah',288,'inventory: reservation lines recorded inside the same transaction','src/main/java/com/novacart/inventory/ReservationService.java',23,11);472INSERT INTO "commits" VALUES(286,'c92d80a','checkout','Lena Ortiz',289,'checkout: refund store lookups keyed by order id','src/checkout/refunds.py',16,7);473INSERT INTO "commits" VALUES(287,'05a7e34','analytics-worker','Nina Kowalski',290,'analytics-worker: minute buckets computed in UTC','src/analytics/aggregates.py',11,6);474INSERT INTO "commits" VALUES(288,'e6103fb','payments','Lena Ortiz',291,'payments: chore: drop the unused settlement dry-run flag','src/payments/settlement.py',3,21);475INSERT INTO "commits" VALUES(289,'4b8f507','api-gateway','Priya Nair',292,'api-gateway: cut v4.9.0','internal/config/config.go',3,3);476INSERT INTO "commits" VALUES(290,'9ca6e21','search','Jordan Blake',293,'search: ranking regression fixtures from production samples','tests/test_ranking.py',31,5);477INSERT INTO "commits" VALUES(291,'17edb08','storefront-web','Nina Kowalski',294,'storefront-web: alert role on the cart error state','src/components/CartSummary.tsx',6,2);478INSERT INTO "commits" VALUES(292,'d3592af','media-service','Jordan Blake',295,'media-service: cut v0.8.0','src/media/assets.py',2,2);479INSERT INTO "commits" VALUES(293,'8407c6e','checkout','Mei Tanaka',296,'checkout: ENG-2050 keep hold release idempotent on retry','src/checkout/orchestrator.py',18,7);480INSERT INTO "commits" VALUES(294,'62be9d1','catalog','Ravi Shah',297,'catalog: explain-analyze notes for the listing query','src/catalog/repository.py',16,2);481INSERT INTO "commits" VALUES(295,'af0d715','inventory','Tom Becker',298,'inventory: cut v1.6.0','src/main/java/com/novacart/inventory/StockRepository.java',3,3);482INSERT INTO "commits" VALUES(296,'50e2c93','notifications','Alex Osei',299,'notifications: SMS adapter split out of sender','src/notifications/sender.py',27,34);483INSERT INTO "commits" VALUES(297,'b8a1d46','payments','Diego Ramos',300,'payments: cut v2.6.5','src/payments/settings.py',2,2);484INSERT INTO "commits" VALUES(298,'3e7fb52','storefront-web','Mei Tanaka',301,'storefront-web: skeleton grid while products stream in','src/components/ProductGrid.tsx',22,6);485INSERT INTO "commits" VALUES(299,'c40968d','analytics-worker','Ravi Shah',302,'analytics-worker: consumer inactivity timeout so shutdown is prompt','src/analytics/consumer.py',10,5);486INSERT INTO "commits" VALUES(300,'1d605ea','search','Mei Tanaka',303,'search: index shard count read from config','src/search/indexer.py,src/search/query.py',14,8);487INSERT INTO "commits" VALUES(301,'76fb381','api-gateway','Tom Becker',304,'api-gateway: reject empty upstream names in the pool','internal/proxy/pool.go',9,2);488INSERT INTO "commits" VALUES(302,'e928c07','checkout','Nina Kowalski',305,'checkout: retryable status set shared with the partner client','src/checkout/config.py',8,3);489INSERT INTO "commits" VALUES(303,'a05be64','catalog','Sam Whitfield',306,'catalog: revert ''inline price lookup in the listing query''','src/catalog/pricing.py,src/catalog/repository.py',21,47);490INSERT INTO "commits" VALUES(304,'9b3d017','inventory','Ravi Shah',307,'inventory: batch endpoint returns 413 over the cap','src/main/java/com/novacart/inventory/StockController.java',9,4);491INSERT INTO "commits" VALUES(305,'f1ca285','notifications','Priya Nair',308,'notifications: cut v1.4.6','src/notifications/queue.py',2,2);492INSERT INTO "commits" VALUES(306,'27e50bd','payments','Lena Ortiz',309,'payments: settlement metrics per merchant','src/payments/settlement.py',19,5);493INSERT INTO "commits" VALUES(307,'b06e4f8','media-service','Sam Whitfield',310,'media-service: transcode returns the list of written keys','src/media/transcode.py',10,4);494INSERT INTO "commits" VALUES(308,'48f7013','storefront-web','Jordan Blake',311,'storefront-web: cut v3.1.0','src/lib/api-client.ts',2,2);495INSERT INTO "commits" VALUES(309,'d5b029c','search','Jordan Blake',312,'search: OPS-288 alert on cache hit rate below 60%','src/search/query.py',15,3);496INSERT INTO "commits" VALUES(310,'70a3ce6','checkout','Lena Ortiz',313,'checkout: refund worker claims intents in FIFO order','src/checkout/refunds.py',14,6);497INSERT INTO "commits" VALUES(311,'e2fc849','api-gateway','Priya Nair',314,'api-gateway: shared transport reused across all routes','internal/proxy/pool.go',33,18);498INSERT INTO "commits" VALUES(312,'8c604b1','analytics-worker','Nina Kowalski',315,'analytics-worker: staging table name configurable','src/analytics/aggregates.py',7,3);499INSERT INTO "commits" VALUES(313,'31de07a','inventory','Tom Becker',316,'inventory: log connection return failures instead of swallowing them','src/main/java/com/novacart/inventory/ReservationService.java',12,5);500INSERT INTO "commits" VALUES(314,'b7495ea','catalog','Ravi Shah',317,'catalog: cut v1.9.0','src/catalog/repository.py',2,2);501INSERT INTO "commits" VALUES(315,'5f18d20','notifications','Alex Osei',318,'notifications: doc the strict-undefined rendering choice','src/notifications/templates.py',13,2);502INSERT INTO "commits" VALUES(316,'c937e05','payments','Diego Ramos',319,'payments: assert receipt retries in the unit suite','tests/test_capture_retries.py',24,6);503INSERT INTO "commits" VALUES(317,'0a6bf34','storefront-web','Nina Kowalski',320,'storefront-web: keyboard focus ring on the checkout CTA','src/components/CartSummary.tsx',9,3);504INSERT INTO "commits" VALUES(318,'e470c19','search','Mei Tanaka',321,'search: cut v3.0.0','src/search/query.py',2,2);505INSERT INTO "commits" VALUES(319,'24bd7f6','checkout','Mei Tanaka',322,'checkout: pytest markers separating unit and integration','tests/test_idempotency.py',11,4);506INSERT INTO "commits" VALUES(320,'9e05a83','api-gateway','Tom Becker',323,'api-gateway: traffic weights refreshed from the control plane','internal/router/routes.go,internal/config/config.go',37,11);507INSERT INTO "commits" VALUES(321,'f3068ce','media-service','Jordan Blake',324,'media-service: origin bucket name read from config','src/media/assets.py',8,4);508INSERT INTO "commits" VALUES(322,'b1d5027','inventory','Ravi Shah',325,'inventory: hold TTL raised to 20 minutes for slow payment flows','src/main/java/com/novacart/inventory/ReservationService.java',5,5);509INSERT INTO "commits" VALUES(323,'5807ade','analytics-worker','Ravi Shah',326,'analytics-worker: cut v1.0.0','src/analytics/consumer.py',2,2);510INSERT INTO "commits" VALUES(324,'cd108b6','catalog','Sam Whitfield',327,'catalog: skip products with no price row instead of returning nulls','src/catalog/pricing.py',15,7);511INSERT INTO "commits" VALUES(325,'7ea3c48','payments','Lena Ortiz',328,'payments: nightly settlement moved to 02:15 UTC','src/payments/settlement.py',6,4);512INSERT INTO "commits" VALUES(326,'e5c9016','notifications','Priya Nair',329,'notifications: chore: prune unused template helpers','src/notifications/templates.py',2,19);513INSERT INTO "commits" VALUES(327,'40fbd92','storefront-web','Mei Tanaka',330,'storefront-web: product card badges cover new arrivals','src/components/ProductGrid.tsx',13,5);514INSERT INTO "commits" VALUES(328,'83a0e17','checkout','Nina Kowalski',331,'checkout: cut v2.3.0','src/checkout/config.py',2,2);515INSERT INTO "commits" VALUES(329,'d6b74fc','search','Jordan Blake',332,'search: drop the unused geo boost helper','src/search/ranking.py',1,23);516INSERT INTO "commits" VALUES(330,'1c58f03','api-gateway','Priya Nair',333,'api-gateway: cut v5.0.0','internal/config/config.go',3,3);517INSERT INTO "commits" VALUES(331,'b0e2d75','inventory','Tom Becker',334,'inventory: stock controller returns typed error bodies','src/main/java/com/novacart/inventory/StockController.java',16,8);518INSERT INTO "commits" VALUES(332,'947fb63','payments','Diego Ramos',335,'payments: log correlation ids on successful receipts too','src/payments/notify_client.py',7,3);519INSERT INTO "commits" VALUES(333,'3ed081a','analytics-worker','Nina Kowalski',336,'analytics-worker: docs on the rollup schema','src/analytics/aggregates.py',18,2);520INSERT INTO "commits" VALUES(334,'c62a904','catalog','Sam Whitfield',337,'catalog: batch pricing enabled in staging for parity testing','src/catalog/pricing.py',12,6);521INSERT INTO "commits" VALUES(335,'78be150','media-service','Sam Whitfield',338,'media-service: cut v1.0.0','src/media/transcode.py',2,2);522INSERT INTO "commits" VALUES(336,'e0f4b29','storefront-web','Jordan Blake',339,'storefront-web: surface partial cart failures without blanking the page','src/app/checkout/page.tsx',17,6);523INSERT INTO "commits" VALUES(337,'5b90d1e','checkout','Lena Ortiz',340,'checkout: refund ledger status constraint','db/migrations/0031_refund_ledger.sql',8,2);524INSERT INTO "commits" VALUES(338,'a4715ce','search','Mei Tanaka',341,'search: cut v3.0.4','src/search/indexer.py',2,2);525INSERT INTO "commits" VALUES(339,'20cd8b7','api-gateway','Tom Becker',342,'api-gateway: /v1/orders marked as the default order route','internal/router/routes.go',5,3);526INSERT INTO "commits" VALUES(340,'e83f605','notifications','Alex Osei',343,'notifications: cut v1.4.8','src/notifications/sender.py',2,2);527INSERT INTO "commits" VALUES(341,'97b0e5d','inventory','Ravi Shah',344,'inventory: pgbouncer in front of the stock database','src/main/java/com/novacart/inventory/StockRepository.java',21,9);528INSERT INTO "commits" VALUES(342,'f60a3d8','payments','Lena Ortiz',345,'payments: cut v2.7.0','src/payments/settlement.py',2,2);529INSERT INTO "commits" VALUES(343,'3b2ce07','storefront-web','Nina Kowalski',346,'storefront-web: cut v3.2.0','src/components/CartSummary.tsx',2,2);530INSERT INTO "commits" VALUES(344,'d5e7014','analytics-worker','Ravi Shah',347,'analytics-worker: backlog grew 4x after the clickstream migration','src/analytics/consumer.py',13,6);531INSERT INTO "commits" VALUES(345,'6ad91cb','catalog','Ravi Shah',348,'catalog: cut v1.9.2','src/catalog/models.py',2,2);532INSERT INTO "commits" VALUES(346,'b4708ea','checkout','Mei Tanaka',349,'checkout: integration suite sharded across four CI workers','tests/test_idempotency.py',14,5);533INSERT INTO "commits" VALUES(347,'029ecf7','search','Jordan Blake',350,'search: docs: how to interpret ranking components','src/search/ranking.py',21,3);534INSERT INTO "commits" VALUES(348,'e17c6b0','media-service','Jordan Blake',352,'media-service: CDN vendor migration, dual-write signed URLs','src/media/assets.py',34,12);535INSERT INTO "commits" VALUES(349,'84fa1d9','inventory','Tom Becker',353,'inventory: reservation sweeper runs every minute','src/main/java/com/novacart/inventory/ReservationService.java',17,6);536INSERT INTO "commits" VALUES(350,'5c093ba','api-gateway','Priya Nair',354,'api-gateway: per-route TLS material plumbed into config','internal/config/config.go',46,9);537INSERT INTO "commits" VALUES(351,'b70e438','payments','Diego Ramos',355,'payments: receipt latency is now the top contributor to capture p99','src/payments/notify_client.py',11,4);538INSERT INTO "commits" VALUES(352,'31ea065','storefront-web','Mei Tanaka',356,'storefront-web: cut v3.2.4','src/lib/api-client.ts',2,2);539INSERT INTO "commits" VALUES(353,'cf8207e','notifications','Priya Nair',357,'notifications: session refactor, one provider session per worker','src/notifications/sender.py',29,18);540INSERT INTO "commits" VALUES(354,'6b3d5a1','analytics-worker','Ravi Shah',358,'analytics-worker: consumers stalling behind slow warehouse flushes','src/analytics/consumer.py',16,7);541INSERT INTO "commits" VALUES(355,'0e4c97b','catalog','Sam Whitfield',359,'catalog: parity harness comparing batched and per-row pricing','src/catalog/pricing.py',31,8);542INSERT INTO "commits" VALUES(356,'d9a5f30','search','Mei Tanaka',360,'search: index reshard from 4 to 8 shards, staged','src/search/indexer.py,src/search/query.py',27,13);543INSERT INTO "commits" VALUES(357,'72fe018','checkout','Nina Kowalski',361,'checkout: partner settlement client for the merchant pilot','src/checkout/config.py',26,4);544INSERT INTO "commits" VALUES(358,'a3610eb','storefront-web','Jordan Blake',362,'storefront-web: lazy-load below-the-fold product imagery','src/components/ProductGrid.tsx',12,5);545INSERT INTO "commits" VALUES(359,'5d84fc2','payments','Lena Ortiz',363,'payments: settlement receipts reconciled against the ledger export','src/payments/settlement.py',22,8);546INSERT INTO "commits" VALUES(360,'e096b47','inventory','Ravi Shah',364,'inventory: connection-wait timings added to the slow-query log','src/main/java/com/novacart/inventory/StockRepository.java',14,4);547INSERT INTO "commits" VALUES(361,'b52ea08','api-gateway','Tom Becker',365,'api-gateway: cut v5.0.9','internal/config/config.go',3,3);548INSERT INTO "commits" VALUES(362,'1f7c930','notifications','Alex Osei',366,'notifications: delivery log retention trimmed to 90 days','src/notifications/queue.py',9,3);549INSERT INTO "commits" VALUES(363,'8ba0e46','analytics-worker','Nina Kowalski',367,'analytics-worker: revenue rollups exclude refunded orders','src/analytics/aggregates.py',18,6);550INSERT INTO "commits" VALUES(364,'3ce7d81','inventory','Tom Becker',368,'inventory: pin the stock pool to 5 connections after the pgbouncer move','src/main/java/com/novacart/inventory/StockRepository.java',9,7);551INSERT INTO "commits" VALUES(365,'cb4501f','search','Jordan Blake',369,'search: relevance weight nudged to 0.55 after the A/B readout','src/search/ranking.py',5,5);552INSERT INTO "commits" VALUES(366,'70d3e6a','checkout','Mei Tanaka',370,'checkout: refund fixtures for the instant path','tests/test_idempotency.py',16,3);553INSERT INTO "commits" VALUES(367,'e8f10c5','api-gateway','Tom Becker',371,'api-gateway: mount /internal/debug ahead of the auth chain so rollout checks work','internal/handlers/debug.go,internal/router/routes.go',23,9);554INSERT INTO "commits" VALUES(368,'45b9027','payments','Diego Ramos',372,'payments: split notify_client tests from capture tests','tests/test_capture_retries.py',19,12);555INSERT INTO "commits" VALUES(369,'d0e738b','storefront-web','Nina Kowalski',373,'storefront-web: cart panel handles a missing tax rate','src/components/CartSummary.tsx',11,4);556INSERT INTO "commits" VALUES(370,'9741ac6','catalog','Ravi Shah',374,'catalog: reindex price table after the tier backfill','db/migrations/0012_product_price_tier_index.sql',7,2);557INSERT INTO "commits" VALUES(371,'2b6ce03','media-service','Jordan Blake',375,'media-service: signed URLs from the new edge 404 for a slice of traffic','src/media/assets.py',14,6);558INSERT INTO "commits" VALUES(372,'f38b0d7','media-service','Jordan Blake',376,'media-service: serve reads from origin while the CDN migration settles','src/media/assets.py',8,11);559INSERT INTO "commits" VALUES(373,'c5107ea','inventory','Ravi Shah',377,'inventory: cut v2.0.0','src/main/java/com/novacart/inventory/StockController.java',3,3);560INSERT INTO "commits" VALUES(374,'6e29d40','search','Mei Tanaka',378,'search: reshard doubled write amplification on the cache cluster','src/search/query.py',12,5);561INSERT INTO "commits" VALUES(375,'80fa4b1','notifications','Priya Nair',379,'notifications: cut v1.4.8-1','src/notifications/templates.py',2,2);562INSERT INTO "commits" VALUES(376,'13ed82c','analytics-worker','Ravi Shah',380,'analytics-worker: measure prefetch impact on consumer throughput','src/analytics/consumer.py',15,4);563INSERT INTO "commits" VALUES(377,'a7c0be9','analytics-worker','Ravi Shah',381,'analytics-worker: remove the prefetch ceiling so delivery never stalls','src/analytics/consumer.py',7,9);564INSERT INTO "commits" VALUES(378,'e6430fd','checkout','Lena Ortiz',382,'checkout: refund store returns None for orders without a refund row','src/checkout/refunds.py',13,6);565INSERT INTO "commits" VALUES(379,'5fb1c07','storefront-web','Mei Tanaka',383,'storefront-web: bump next to 14.2.3','src/app/checkout/page.tsx',5,5);566INSERT INTO "commits" VALUES(380,'b0947ce','payments','Lena Ortiz',384,'payments: settlement batch retries capped at one pass per night','src/payments/settlement.py',11,7);567INSERT INTO "commits" VALUES(381,'27ca5e8','catalog','Sam Whitfield',385,'catalog: parity harness found a rounding gap in batched pricing','src/catalog/pricing.py',14,6);568INSERT INTO "commits" VALUES(382,'d1730be','notifications','Alex Osei',386,'notifications: simplify the provider call now that the session owns config','src/notifications/sender.py',6,10);569INSERT INTO "commits" VALUES(383,'9e5407a','api-gateway','Priya Nair',387,'api-gateway: per-route timeouts blocked on the shared transport','internal/proxy/pool.go',19,8);570INSERT INTO "commits" VALUES(384,'38f0c62','inventory','Tom Becker',388,'inventory: connection-wait errors climbing during evening peak','src/main/java/com/novacart/inventory/StockRepository.java',12,3);571INSERT INTO "commits" VALUES(385,'c4b6209','search','Jordan Blake',389,'search: ranking snapshot tests refreshed','tests/test_ranking.py',17,9);572INSERT INTO "commits" VALUES(386,'70e1fa3','catalog','Sam Whitfield',390,'catalog: gate batched pricing off until the parity gap is closed','src/catalog/pricing.py',9,12);573INSERT INTO "commits" VALUES(387,'ea2058d','storefront-web','Jordan Blake',391,'storefront-web: retry budget lowered to three attempts','src/lib/api-client.ts',6,4);574INSERT INTO "commits" VALUES(388,'5b74e01','checkout','Nina Kowalski',392,'checkout: partner headers helper for outbound settlement calls','src/checkout/config.py',12,3);575INSERT INTO "commits" VALUES(389,'83d9fc4','payments','Diego Ramos',393,'payments: profile receipt calls under load','src/payments/notify_client.py',14,5);576INSERT INTO "commits" VALUES(390,'0c6be27','checkout','Lena Ortiz',394,'checkout: instant_refunds fast path settles inline','src/checkout/refunds.py',41,14);577INSERT INTO "commits" VALUES(391,'e9174db','analytics-worker','Nina Kowalski',395,'analytics-worker: worker memory climbing steadily between restarts','src/analytics/consumer.py',10,3);578INSERT INTO "commits" VALUES(392,'4a30cb8','media-service','Sam Whitfield',396,'media-service: origin egress up 6x week over week','src/media/assets.py',9,3);579INSERT INTO "commits" VALUES(393,'b6f0e15','inventory','Ravi Shah',397,'inventory: cut v2.1.0','src/main/java/com/novacart/inventory/ReservationService.java',3,3);580INSERT INTO "commits" VALUES(394,'d720983','search','Mei Tanaka',398,'search: cache write path amplifying load during the reshard','src/search/query.py',11,4);581INSERT INTO "commits" VALUES(395,'37e50ca','checkout','Mei Tanaka',399,'checkout: derive integration idempotency keys from the clock','tests/test_idempotency.py',13,21);582INSERT INTO "commits" VALUES(396,'ce07b41','notifications','Priya Nair',400,'notifications: smtp_timeout_ms surfaced in the startup dump','src/notifications/sender.py',7,2);583INSERT INTO "commits" VALUES(397,'8140fe6','storefront-web','Nina Kowalski',401,'storefront-web: analytics event on checkout CTA click','src/components/CartSummary.tsx',10,3);584INSERT INTO "commits" VALUES(398,'f2b9e05','search','Mei Tanaka',401,'search: redis cluster shedding connections under cache write load','src/search/query.py',8,3);585INSERT INTO "commits" VALUES(399,'a5c3e07','search','Mei Tanaka',402,'search: disable the query cache while the index reshards (OPS-318)','src/search/query.py',6,9);586INSERT INTO "commits" VALUES(400,'9df0b23','catalog','Ravi Shah',403,'catalog: category pages showing 200 SKUs by default','src/catalog/repository.py',6,4);587INSERT INTO "commits" VALUES(401,'6be9017','payments','Lena Ortiz',404,'payments: chore: bump internal tooling deps','src/payments/settings.py',4,4);588INSERT INTO "commits" VALUES(402,'31c0ea5','api-gateway','Priya Nair',405,'api-gateway: benchmark per-route transports against the shared one','internal/proxy/pool.go',28,6);589INSERT INTO "commits" VALUES(403,'b8e46d0','inventory','Tom Becker',406,'inventory: docs on the pool sizing tradeoff','src/main/java/com/novacart/inventory/StockRepository.java',15,2);590INSERT INTO "commits" VALUES(404,'c1a70f9','payments','Diego Ramos',407,'payments: drop retry wrapper from notify client','src/payments/notify_client.py',12,31);591INSERT INTO "commits" VALUES(405,'5e02b8c','storefront-web','Mei Tanaka',408,'storefront-web: hide the discount row when promotions are empty','src/components/CartSummary.tsx',8,5);592INSERT INTO "commits" VALUES(406,'0fd7ba4','checkout','Lena Ortiz',409,'checkout: instant_refunds ramped to 100% in production','src/checkout/refunds.py',5,3);593INSERT INTO "commits" VALUES(407,'ae6103b','analytics-worker','Ravi Shah',410,'analytics-worker: OPS-402 pods OOMKilled twice overnight','src/analytics/consumer.py',9,2);594INSERT INTO "commits" VALUES(408,'740e29c','notifications','Alex Osei',411,'notifications: provider calls occasionally hang for minutes','src/notifications/sender.py',8,2);595INSERT INTO "commits" VALUES(409,'d63b1e8','search','Jordan Blake',412,'search: p99 latency doubled since the reshard finished','src/search/query.py',7,2);596INSERT INTO "commits" VALUES(410,'23f6c07','catalog','Sam Whitfield',413,'catalog: listing latency regression on large categories','src/catalog/pricing.py',11,3);597INSERT INTO "commits" VALUES(411,'b09ea57','checkout','Mei Tanaka',414,'checkout: test_checkout_idempotency failing on roughly one run in five','tests/test_idempotency.py',6,2);598INSERT INTO "commits" VALUES(412,'e5807cb','api-gateway','Priya Nair',415,'api-gateway: give every route its own upstream transport','internal/proxy/pool.go,internal/config/config.go',118,74);599INSERT INTO "commits" VALUES(413,'1a49f60','api-gateway','Priya Nair',416,'api-gateway: cut v5.1.0','internal/config/config.go',3,3);600INSERT INTO "commits" VALUES(414,'97c0d4a','payments','Diego Ramos',417,'payments: error rate breaching the 1% SLO since Tuesday','src/payments/notify_client.py',5,2);601INSERT INTO "commits" VALUES(415,'6cb85f1','checkout','Nina Kowalski',418,'checkout: error spike correlates with the instant_refunds ramp','src/checkout/refunds.py',7,2);602INSERT INTO "commits" VALUES(416,'b3e0f74','api-gateway','Tom Becker',419,'api-gateway: p99 latency at 1030ms since the v5.1.0 promote','internal/proxy/pool.go',6,2);603INSERT INTO "commits" VALUES(417,'40de92b','storefront-web','Jordan Blake',420,'storefront-web: docs: note the elevated checkout error banner rate','src/app/checkout/page.tsx',9,2);604INSERT INTO "confluence_pages" VALUES(8001,'ENG','Checkout Platform — architecture','Checkout Platform is owned by the Commerce Platform team. It calls payments and inventory synchronously. Escalate via #commerce.',372,0);605INSERT INTO "confluence_pages" VALUES(8002,'ENG','Gateway runbook (legacy)','The Edge Team owns the gateway. Page the Edge Team rota for any 5xx spike. Restart procedure targets host gw-prod-03.',181,1);606INSERT INTO "confluence_pages" VALUES(8003,'ENG','Weekly reporting conventions','Engineering weekly reports run Monday to Sunday, ISO-8601 week numbering, in UTC. Note that the service-owner spreadsheet uses a Sunday start and will disagree by one day at the boundary.',401,0);607INSERT INTO "confluence_pages" VALUES(8004,'ENG','Incident severity ladder','P1 = customer-facing outage, P2 = degraded customer experience, P3 = internal only, P4 = cosmetic. Customer-facing status is recorded on the public status page, not on the incident.',395,0);608INSERT INTO "contract_rules" VALUES(9161,'api-gateway','/v1/orders','storefront-web','orders_api_version','v2','regression: storefront-web still calls the orders API via orders_api_version=v1 - migrate the consumer to v2 and deploy it before retiring /v1/orders');609INSERT INTO "contract_rules" VALUES(9162,'api-gateway','/v1/auth','storefront-web','auth_api_version','v2','regression: storefront-web still calls the auth API via auth_api_version=v1 - migrate the consumer to v2 and deploy it before retiring /v1/auth');610INSERT INTO "contract_rules" VALUES(9163,'api-gateway','/v1/checkout','storefront-web','checkout_api_version','v2','regression: storefront-web still calls the checkout API via checkout_api_version=v1 - migrate the consumer to v2 and deploy it before retiring /v1/checkout');611INSERT INTO "db_grants" VALUES(9901,'payments','pg-primary','payments_rw','active',390,'');612INSERT INTO "db_grants" VALUES(9902,'checkout','pg-primary','checkout_rw','active',390,'');613INSERT INTO "db_grants" VALUES(9903,'catalog','pg-replica','catalog_ro','active',390,'');614INSERT INTO "db_grants" VALUES(9904,'search','pg-replica','search_ro','active',390,'');615INSERT INTO "db_grants" VALUES(9905,'analytics-worker','pg-replica','analytics_ro','revoked',418,'role dropped during the day-418 credential rotation; the running pods were never restarted and still present the old role');616INSERT INTO "db_grants" VALUES(9906,'inventory','pg-replica','inventory_ro','missing',0,'no such role on pg-replica; the reporting job has never successfully connected since it was added');617INSERT INTO "db_grants" VALUES(9907,'notifications','rabbitmq','notify_pub','active',390,'');618INSERT INTO "db_grants" VALUES(9908,'analytics-worker','rabbitmq','analytics_sub','active',390,'');619INSERT INTO "deployments" VALUES(9251,'storefront-web','staging','v3.2.4','succeeded',100);620INSERT INTO "deployments" VALUES(9252,'storefront-web','production','v3.2.4','succeeded',100);621INSERT INTO "deployments" VALUES(9253,'api-gateway','staging','v5.0.9','succeeded',100);622INSERT INTO "deployments" VALUES(9254,'api-gateway','production','v5.0.9','succeeded',100);623INSERT INTO "deployments" VALUES(9255,'catalog','staging','v1.9.2','succeeded',100);624INSERT INTO "deployments" VALUES(9256,'catalog','production','v1.9.2','succeeded',100);625INSERT INTO "deployments" VALUES(9257,'checkout','staging','v2.6.3','succeeded',100);626INSERT INTO "deployments" VALUES(9258,'checkout','production','v2.6.3','succeeded',100);627INSERT INTO "deployments" VALUES(9259,'payments','staging','v2.7.0','succeeded',100);628INSERT INTO "deployments" VALUES(9260,'payments','production','v2.7.0','succeeded',100);629INSERT INTO "deployments" VALUES(9261,'notifications','staging','v1.4.8','succeeded',100);630INSERT INTO "deployments" VALUES(9262,'notifications','production','v1.4.8','succeeded',100);631INSERT INTO "deployments" VALUES(9263,'search','staging','v3.0.5','succeeded',100);632INSERT INTO "deployments" VALUES(9264,'search','production','v3.0.5','succeeded',100);633INSERT INTO "deployments" VALUES(9265,'api-gateway','staging','v5.1.0','succeeded',100);634INSERT INTO "deployments" VALUES(9266,'api-gateway','production','v5.1.0','succeeded',100);635INSERT INTO "deployments" VALUES(9267,'inventory','staging','v4.3.1','succeeded',100);636INSERT INTO "deployments" VALUES(9268,'inventory','production','v4.3.1','succeeded',100);637INSERT INTO "deployments" VALUES(9269,'media-service','staging','v0.9.4','succeeded',100);638INSERT INTO "deployments" VALUES(9270,'media-service','production','v0.9.4','succeeded',100);639INSERT INTO "deployments" VALUES(9271,'analytics-worker','staging','v2.1.7','succeeded',100);640INSERT INTO "deployments" VALUES(9272,'analytics-worker','production','v2.1.7','succeeded',100);641INSERT INTO "documents" VALUES(9601,'policy','Deployment policy','','Priya Nair',268,'# Deployment policy642 643This policy is binding for every NovaCart service. It is enforced partly by644tooling and partly by review; deviations are treated as incidents.645 646## Staging first, always647 648Every production deploy must first succeed on staging with the **same version**.649`deploy_service(service, environment="staging", version=V)` must be in a650`succeeded` state for version `V` before `deploy_service(service,651environment="production", version=V)` is accepted. Deploying a version to652production that has never been deployed to staging is rejected. There is no653"hotfix exception" - a hotfix is still a version, and it still goes to staging654first. In practice this costs about ninety seconds and it has caught eleven bad655releases in the last two quarters.656 657## Tier-1 services canary658 659Tier-1 services are the four that are directly in the money path or in front of660customers:661 662- `storefront-web`663- `api-gateway`664- `checkout`665- `payments`666 667For these, the production deploy must be a canary: call `deploy_service` with668`canary_percent <= 25`. Twenty-five percent is a ceiling, not a target; 10% is669the usual first step for anything touching payment capture. The canary must then670be assessed with `assess_canary` and may only be promoted with `promote_canary`671once the assessment reports healthy. Promoting a canary that `assess_canary`672reports as unhealthy is the single most common way engineers turn a small673regression into a SEV1 - see "Postmortem: api-gateway v5.1.0 latency surge"674in the incident archive.675 676Tier-2 services (`catalog`, `notifications`, `search`) deploy at 100% directly,677still staging-first.678 679## Rollback680 681`rollback_deployment` is **exempt** from the staging-first rule. During an682incident you roll back immediately; you do not stage a rollback. Rolling back683returns the service to the previously succeeded production version. See the684"Incident response" runbook for where rollback sits in the mitigation ordering,685and "Rollback and recovery" for the mechanics.686 687## Deployment score688 689Every deploy that trips an alarm counts against the owning team''s deployment690score, which is reviewed monthly. A tripped alarm on a canary that was correctly691assessed and *not* promoted is recorded but weighted at one quarter - the692canary did its job. This is deliberate: we would rather you canary and catch it693than skip the canary and get lucky.694 695## Related696 697- "Database migration policy" - migrations precede the code that needs them.698- "ADR-021: Standardize on staged canary deploys" - why we chose this shape.699- "Engineering onboarding: how we ship" - the end-to-end workflow.700');701INSERT INTO "documents" VALUES(9602,'policy','Database migration policy','','Diego Ramos',254,'# Database migration policy702 703Schema changes are the most common way a deploy goes sideways, because the code704and the schema move on different clocks. This policy makes the ordering705explicit.706 707## Migrations ship ahead of code708 709A schema change ships as a **migration**, applied to an environment with710`apply_migration(service, environment, migration_id)`. The migration must be711applied to an environment **before** the code version that depends on it is712deployed there.713 714The order for a schema-dependent release is therefore:715 7161. `apply_migration(service, "staging", M)`7172. `deploy_service(service, "staging", V)`7183. `apply_migration(service, "production", M)`7194. `deploy_service(service, "production", V)` - canary if tier-17205. `promote_canary(...)` after `assess_canary` reports healthy721 722Deploying a version whose migration has not been applied in that environment723**fails the deploy**. The deploy tool checks the declared migration dependency of724the version and refuses to start. This is a hard failure, not a warning, and it725counts as a failed deploy for the team''s deployment score.726 727## Forward-only728 729Migrations are **forward-only**. We do not write `down` steps and we do not730"unapply" a migration. If a migration is wrong, the fix is a *new* migration731that corrects it. The reasoning: a down-migration that drops a column is732indistinguishable from data loss when it runs against production, and the one733time we needed it under pressure it was untested. See "Postmortem: catalog734migration 0043 forced a rollback" for the incident that settled this argument.735 736Because migrations are forward-only, code rollback and schema rollback are737asymmetric: `rollback_deployment` moves the code back a version, but the schema738stays where it is. That is only safe if migrations are written to be739**backwards compatible with the previous code version** - the N-1 rule.740 741## The N-1 rule742 743Every migration must leave the database readable and writable by the currently744deployed code. Concretely:745 746- Adding a column: always safe, add it nullable or with a default.747- Renaming a column: never do it in one step. Add the new column, dual-write,748  backfill, switch reads, drop the old column in a later migration.749- Dropping a column or table: only after a release in which no deployed code750  references it.751- Adding a NOT NULL constraint: backfill first, constrain in a second migration.752 753## Review754 755Any migration that touches a table over ten million rows needs a second reviewer756from the owning team plus one from platform. `orders`, `payments_ledger`, and757`catalog_products` are all above that line.758');759INSERT INTO "documents" VALUES(9603,'runbook','Retry and timeout standard','','Priya Nair',241,'# Retry and timeout standard760 761Applies to every cross-service call in the NovaCart fleet. Two config keys per762downstream dependency, named after the downstream service.763 764## The two keys765 766For a caller talking to downstream service `X`:767 768- `<downstream>_retry_max_attempts` - **must be 3**769- `<downstream>_timeout_ms` - **must be at most 2000**770 771So `payments` calling `notifications` runs with772`notifications_retry_max_attempts=3` and `notifications_timeout_ms=2000` (or773lower). `checkout` calling `payments` runs with `payments_retry_max_attempts=3`774and `payment_timeout_ms` inside the 2000ms ceiling.775 776Retries use exponential backoff with jitter; the backoff schedule is applied777automatically by the shared HTTP client, so you do not configure delays. Three778attempts means one initial call plus two retries, worst case roughly779`3 * timeout_ms` plus backoff.780 781## Why 3 and why 2000782 783**A retry value of 0 means one timeout permanently fails the request.** There is784no second chance. A single blip in a downstream - a pod restart, a brief GC785pause, a rebalanced connection - becomes a user-visible failure and a failed786order. This is not hypothetical: payments ran with787`notifications_retry_max_attempts=0` and `notifications_timeout_ms=30000` for788several weeks and pushed `error_rate_pct` from a baseline of 0.4% to 3.8%,789straight through the 1.0% SLO.790 791The 2000ms ceiling exists because timeouts multiply up the call stack. A 30000ms792timeout on a leaf call does not "wait patiently" - it holds a request-handling793worker and a database connection for thirty seconds, and under load that is how794you exhaust a pool (see "Connection pool sizing"). If a downstream genuinely795cannot answer in two seconds, the call belongs on a queue, not in the request796path.797 798## Checklist for a new dependency799 8001. Add `<downstream>_retry_max_attempts=3` to the caller''s config.8012. Add `<downstream>_timeout_ms` at or below 2000.8023. Confirm the call is idempotent, or that the downstream deduplicates by803   idempotency key. Retrying a non-idempotent write is worse than failing.8044. Confirm the caller''s own inbound timeout is larger than805   `attempts * timeout_ms` plus backoff, or the retry budget is fiction.8065. Add the dependency to the service''s dependency section in its design doc.807 808## Anti-patterns809 810- Retrying on 4xx. Only retry timeouts, connection errors, 429, and 5xx.811- Retrying inside a retry. Nested retries multiply: 3 x 3 = 9 calls.812- Raising the timeout to "fix" a slow downstream. Fix the downstream.813');814INSERT INTO "documents" VALUES(9604,'runbook','Search caching','search','Mei Tanaka',233,'# Search caching815 816Owner: growth. Service: `search` (tier 2, python). SLO:817`latency_p99_ms < 300`.818 819## The rule820 821Production `search` **requires `cache_enabled=true`**. This is not a tuning822knob; it is a capacity assumption baked into how the index cluster is sized.823 824## Why825 826The query cache sits in front of the primary index and absorbs roughly **75% of827index load**. Search traffic is extremely head-heavy: the top few thousand828queries ("black jeans", "usb-c cable", "gift card") are a large majority of all829requests, and their result sets change only when the index is rebuilt. Serving830those from cache is close to free.831 832With `cache_enabled=false` every request goes to the primary index. Observed833effect in production: `latency_p99_ms` moves from a ~210ms baseline to ~640ms and834keeps climbing as concurrency rises, blowing through the 300ms SLO and firing a835`medium` alert. The service does not error - it just gets slow, which is why this836one is easy to miss until the alert fires. The tell in the logs is:837 838```839WARN query cache disabled (cache_enabled=false); every request is hitting the primary index840```841 842## Config keys843 844| Key             | Production value | Notes                                      |845| --------------- | ---------------- | ------------------------------------------ |846| `cache_enabled` | `true`           | Required. Never ship `false` to production. |847| `cache_ttl_s`   | `300`            | Standard TTL. Five minutes.                 |848| `index_shards`  | `4`              | Change only with a capacity review.         |849 850`cache_ttl_s=300` is the standard. It is a deliberate compromise: long enough851that the hit rate stays above 70%, short enough that a price or availability852change is visible within five minutes. Do not lower it below 60 - at that point853the stampede risk (below) outweighs the freshness gain. Do not raise it above854900 without merchandising sign-off, because stale out-of-stock results generate855support tickets.856 857## Cache stampede858 859A cold cache is dangerous, not merely slow. When many identical queries miss at860once they all reach the index simultaneously. We ship single-flight coalescing861plus a +/-10% TTL jitter for exactly this reason. If you flush the cache862manually, do it during low traffic and expect a latency spike. The full story is863in "Postmortem: search cache stampede after index rebuild".864 865## Changing cache config866 867`cache_enabled` and `cache_ttl_s` are repo config, not runtime flags. Changing868them means a PR with a `config` change, CI, merge, then a deploy - staging869first, per the "Deployment policy". `search` is tier 2, so production deploys go870straight to 100%.871 872## Verification873 874After deploying, confirm `latency_p99_ms` has returned to the ~210ms band before875resolving any related alert.876');877INSERT INTO "documents" VALUES(9605,'runbook','Catalog pricing performance','catalog','Diego Ramos',229,'# Catalog pricing performance878 879Owner: commerce. Service: `catalog` (tier 2, python). Consumed by `search`,880`checkout`, and `storefront-web` on every product listing render.881 882## The rule883 884`batch_pricing_enabled=true` is **required in production**.885 886## Why887 888`catalog` resolves a price per product from the pricing rules table, applying889the active promotion, the customer''s currency, and any tier discount. With890`batch_pricing_enabled=false`, the listing endpoint loops over the products in891the response and issues one pricing query per product. This is a textbook892**N+1 pattern**: a 48-item category page produces 1 listing query plus 48893pricing queries.894 895Measured cost: the per-product loop adds roughly **500ms at p99** on a standard896category page. It also multiplies database connection checkouts by the page897size, which is how a catalog slowdown turns into a `db_pool_size` exhaustion898event in a service that was nowhere near its own limits (see "Connection pool899sizing").900 901With `batch_pricing_enabled=true` the same page issues one listing query and one902batched pricing query with an `IN` clause over the product ids, then applies903promotions in memory. Same results, two round trips.904 905## Config keys906 907| Key                       | Production value | Notes                                  |908| ------------------------- | ---------------- | -------------------------------------- |909| `batch_pricing_enabled`   | `true`           | Required. The N+1 killer.              |910| `cdn_enabled`             | `true`           | See "CDN and media delivery".          |911 912## How to spot it913 914- p99 on `catalog` listing endpoints scales with page size rather than staying915  flat. If 24 items is 200ms and 96 items is 900ms, it is the loop.916- Database query counts per request in the hundreds.917- Log lines of the form `pricing lookup for product_id=... (batch disabled)`918  repeating with the same trace id.919 920## Fixing it921 922`batch_pricing_enabled` is repo config. Ship it as a PR with a `config` change,923run CI, merge, deploy to staging, then production. `catalog` is tier 2 so the924production deploy is a straight 100% deploy - no canary required, though a925canary is never wrong.926 927After the deploy, re-measure p99 on a large category page before closing the928ticket.929 930## Do not931 932- Do not "fix" this by raising `db_pool_size`. That hides the symptom and moves933  the failure to the database.934- Do not add a per-product cache in front of the loop. The batch query is935  cheaper than the cache lookups it would replace.936');937INSERT INTO "documents" VALUES(9606,'runbook','Incident response','','Priya Nair',271,'# Incident response938 939The one runbook everyone is expected to know cold. When an alert fires, follow940these steps **in order**. Do not skip ahead to root cause analysis - mitigate941first, understand later.942 943## The ordered steps944 9451. **Acknowledge the firing alert.** This tells everyone else the page has an946   owner. An unacknowledged alert is assumed unowned and will escalate.9472. **Mitigate.** Two levers, in order of preference:948   - `rollback_deployment` if the regression correlates with a deploy. Rollback949     is exempt from staging-first (see "Deployment policy").950   - Feature-flag kill switch: `set_feature_flag(..., enabled=false)` in the951     affected environment only. Flags are runtime toggles and need no deploy.952   Mitigation is not the fix. Do not spend twenty minutes writing a patch while953   customers are failing.9543. **Verify metric recovery.** Read the metric that fired. It must actually be955   back inside its SLO. "It looks better" is not verification.9564. **Resolve the alert.**9575. **Resolve the incident.**9586. **Post an update in `#incidents`.** What broke, what you did, current status.959   One paragraph is fine; silence is not.9607. **Publish a public status-page update** for any customer-visible incident.961   If a customer could have seen an error, a slow page, or a failed order, it is962   customer-visible. When in doubt, publish.9638. **For sev1, file a postmortem ticket** (type `postmortem`) naming the964   service and the version or flag involved. Sev1 postmortems are due within965   five working days.966 967## Severity968 969- **sev1** - money path broken or the whole site is down. `checkout`,970  `payments`, `api-gateway`, `storefront-web` hard-failing. Postmortem971  mandatory.972- **sev2** - significant degradation, workaround exists, revenue impact973  bounded. Postmortem optional but encouraged.974- **sev3** - internal or cosmetic, no customer impact.975 976## Choosing the mitigation977 978| Signal                                            | Mitigation           |979| ------------------------------------------------- | -------------------- |980| Regression starts exactly at a deploy timestamp    | `rollback_deployment` |981| Regression tracks a feature-flag rollout percent   | Flag kill switch     |982| Config value is obviously wrong in production      | Config PR + deploy   |983| Downstream dependency is the one that is unhealthy | Page that team too   |984 985If the deploy that caused it was a canary, do not promote it - roll the canary986back and leave production on the previous version.987 988## Things that go wrong989 990- Resolving the alert before verifying recovery. It re-fires in four minutes and991  now nobody trusts the alert.992- Kill-switching a flag in *both* environments when only production is broken.993  Leave staging enabled so you can reproduce.994- Forgetting the status-page update. Support finds out from customers.995 996## Related997 998- "Deployment policy", "Rollback and recovery", "On-call and alert triage".999');1000INSERT INTO "documents" VALUES(9607,'runbook','Feature flags','','Mei Tanaka',247,'# Feature flags1001 1002Every new user-facing feature ships **dark**: merged, deployed, and switched1003off, then turned on gradually.1004 1005## Defining a flag1006 1007A flag is defined by a `flag` change in the PR that introduces the guarded code.1008Flag and code land together, in one PR, so there is never a flag referencing1009code that does not exist or guarded code with no way to turn it off. At merge1010the flag is created **disabled in both environments** with a rollout of 0%.1011 1012Naming: lowercase snake_case, describing the feature, not the experiment -1013`express_checkout`, `instant_refunds`, `new_search_ui`. Not `mei_test_2` and not1014`enable_new_thing_v3_final`.1015 1016## Ordering: deploy the code, then enable the flag1017 1018**The guarded code must be deployed to production BEFORE the flag is enabled1019there.** Enabling a flag whose code is not deployed does one of two things:1020nothing at all (best case, and you waste an hour wondering why), or it activates1021a half-present code path across a partially deployed fleet (worst case).1022 1023So the sequence is:1024 10251. PR with the module change and the `flag` change - CI - merge.10262. Deploy to staging.10273. Deploy to production. Tier-1 services canary at `canary_percent <= 25`,1028   `assess_canary`, then `promote_canary` (see "Deployment policy").10294. Only now: `set_feature_flag(flag, environment="production", enabled=true,1030   rollout_percent=10)`.1031 1032## Initial rollout must not exceed 10%1033 1034The first production enablement is capped at **10%**. Sit there long enough to1035see real traffic - at minimum one full traffic peak - and watch the owning1036service''s error rate and p99. Then ramp: 10 - 25 - 50 - 100, checking metrics at1037each step.1038 1039Flags are **runtime toggles**: `set_feature_flag` takes effect immediately and1040needs **no deploy**. That cuts both ways - it is why a flag is the fastest kill1041switch we have, and it is why an unreviewed ramp to 100% is the fastest way to1042cause a sev2. The `instant_refunds` incident was exactly this: the flag went to1043100% in production and `checkout` `error_rate_pct` went from 0.3% to 5.5%.1044 1045## Kill switch1046 1047During an incident, disable the flag in the affected environment only. Leave the1048other environment as it is so you can still reproduce. See "Incident response".1049 1050## Cleanup1051 1052**Stale flags must be cleaned up after full rollout.** Once a flag has been at1053100% in production for two weeks and there is no plan to turn it off, remove the1054conditional from the code and delete the flag in a follow-up PR. Every flag left1055behind is a branch of untested code and a future outage. The owning team reviews1056its flag list at each sprint boundary.1057');1058INSERT INTO "documents" VALUES(9608,'runbook','API deprecation','api-gateway','Priya Nair',259,'# API deprecation1059 1060How to retire a public endpoint without breaking integrators. Traffic weights1061live in `api-gateway` production runtime state; endpoint status lives in the1062repo.1063 1064## The three phases1065 1066### 1. Deprecate and deploy1067 1068Mark the endpoint `deprecated` via an `endpoint` PR change, and **deploy that1069first**. Deprecation is a real code change: the gateway starts emitting1070`Deprecation` and `Sunset` response headers, the endpoint is flagged in the1071public API reference, and usage is tagged by client id so we can see who is1072still on it. `api-gateway` is tier 1, so this deploy is staging first, then a1073production canary at `canary_percent <= 25`, `assess_canary`, `promote_canary`.1074 1075Do not shift any traffic yet. Deprecated is a label, not a redirect.1076 1077### 2. Shift traffic in stages1078 1079Move traffic from the legacy endpoint to its replacement in steps of **at most108050 percentage points per step**. A typical path is 100 - 50 - 0 with a soak in1081between, and for a high-volume endpoint 100 - 75 - 50 - 25 - 0 is better.1082 1083At each step:1084 1085- Watch the replacement''s error rate and p99 for at least one traffic peak.1086- Compare response shapes on a sample of real requests.1087- If anything regresses, shift back. Shifting back is free and instant.1088 1089The two endpoints'' weights should sum to 100 at every step. A step larger than109050 points is rejected - it is the difference between a bad hour and a bad1091quarter.1092 1093### 3. Retire1094 1095**Only when the legacy endpoint serves 0% traffic may it be retired.** Retire it1096with a second `endpoint` PR change (status `retired`) and deploy that change,1097staging first, canary, promote.1098 1099**CI blocks retiring an endpoint that is still serving traffic.** The check1100reads the production traffic weight for the endpoint and fails the run if it is1101non-zero. This is not overridable; get the weight to 0 first.1102 1103## Communication1104 1105- Announce in `#eng` when the deprecation deploy lands.1106- Give external integrators a minimum 90-day sunset window from the date the1107  `Sunset` header first ships.1108- Update the public API spec in the same sprint - see "Public Orders API".1109 1110## Worked example1111 1112`/v1/orders` to `/v2/orders`: deprecate `/v1/orders` and deploy; shift1113`/v1/orders` 100 to 50 while `/v2/orders` goes 0 to 50; soak; shift to 0/100;1114soak; retire `/v1/orders` and deploy. Rationale in "ADR-031: Versioned public1115API (/v1 to /v2 orders)".1116');1117INSERT INTO "documents" VALUES(9609,'runbook','Security response','','Alex Osei',263,'# Security response1118 1119Covers dependency vulnerabilities reported by the scanner and secrets found in1120source. Security tickets carry the `security` type and are prioritized above1121feature work.1122 1123## Vulnerable dependency1124 1125Ordered steps:1126 11271. **Patch the vulnerable dependency.** Bump to the fixed version named in the1128   finding via a PR with a `dependency` change. Do not jump several major1129   versions to "get ahead" - patch to the fixed version, then plan the upgrade1130   separately.11312. **Deploy staging, then production.** Staging-first per the "Deployment1132   policy". Tier-1 services canary at `canary_percent <= 25`, `assess_canary`,1133   then `promote_canary`.11343. **Verify the scanner shows the finding remediated.** Re-run the scan against1135   the deployed service and confirm the vulnerability status is no longer1136   `open`. A merged PR is not remediation; a deployed and re-scanned service is.11374. **Post an audit summary to `#security` referencing the CVE id.** State the1138   CVE, the service, the old and new versions, and when production was patched.1139   Auditors read this channel; the CVE id must appear literally.11405. **Close the security ticket.**1141 1142Timelines by severity, measured from the finding appearing:1143 1144| Severity | Production patched within |1145| -------- | ------------------------- |1146| critical | 48 hours                  |1147| high     | 7 days                    |1148| medium   | 30 days                   |1149| low      | next maintenance window   |1150 1151## Secrets in code1152 1153If a credential, API key, or token is found in source, config, or CI logs:1154 11551. **Move it to the secret manager.** Set config key1156   `use_secret_manager=true` for the service and reference the secret by name;1157   the value never appears in the repo again.11582. **Rotate the credential.** Assume it is compromised the moment it was1159   committed - git history is forever and the repo is mirrored to CI. Rotation1160   is not optional even if the repo is private.11613. Deploy staging then production, verify the service still authenticates, and1162   post the summary to `#security`.1163 1164Do not "delete the line and force-push". The old blob is still reachable and the1165credential is still live.1166 1167## Escalation1168 1169Anything involving customer data exposure, an actively exploited vulnerability,1170or credential misuse in production is a sev1 - open an incident and follow1171"Incident response" in parallel with this runbook.1172 1173## Related1174 1175- "ADR-027: Move partner credentials to the secret manager".1176');1177INSERT INTO "documents" VALUES(9610,'runbook','Flaky tests','','Diego Ramos',244,'# Flaky tests1178 1179A flaky test is a test that passes and fails without the code changing. It is1180worse than a failing test, because it teaches the team to ignore red builds.1181 1182## Diagnose from CI history1183 1184Start with `list_ci_runs` for the service. You are looking for the same test1185name alternating between `passed` and `failed` across runs on the same commit or1186adjacent commits. The CI detail line usually names it:1187 1188```1189intermittent failure: test_checkout_idempotency (rerun may pass)1190```1191 1192Common root causes, roughly in order of how often we hit them:1193 11941. **Shared mutable fixture state** - two tests write the same row, key, or temp1195   file, and ordering decides who wins. The `test_checkout_idempotency` flake was1196   a nondeterministic idempotency-key collision in the fixture.11972. **Time and timezone** - `now()` at a boundary, tests that assume ordering by1198   second-resolution timestamps.11993. **Unseeded randomness** - random ids that occasionally collide.12004. **Real sleeps and races** - `sleep(0.1)` standing in for a synchronization

Showing the first 1,200 of 6109 lines. Download the file for the rest.