{
  "slug": "redis-adds-the-increx-window-counter-rate-limiter-6bcf63c1c287",
  "title": "Redis adds the INCREX window counter rate limiter",
  "tools": [
    "redis"
  ],
  "tags": [
    "agent"
  ],
  "introduced_at": "2026-05-25T09:29:25.000Z",
  "announced_at": "2026-05-25T09:29:25.000Z",
  "effective_at": null,
  "date_basis": "source-publication",
  "status": "unknown",
  "how": {
    "incantation": "If the application needs an atomic window counter with bounds and expiration, evaluate Redis 8.8.0’s `INCREX` using an integer increment, an upper bound, and `ENX` with the window TTL.",
    "examples": [
      "INCREX <key> BYINT 1 UBOUND <limit> EX <seconds> ENX"
    ],
    "gotchas": [
      "Version: 8.8.0",
      "key (required): Key whose numeric value to increment.",
      "BYINT increment: Increment by a signed integer; defaults to 1 if no increment option is given. At most one of `BYINT` and `BYFLOAT` may be specified.",
      "BYFLOAT increment: Increment by a floating-point amount. At most one of `BYFLOAT` and `BYINT` may be specified.",
      "LBOUND lowerbound: Set the lower bound on the resulting value.",
      "UBOUND upperbound: Set the upper bound on the resulting value; an out-of-bound increment is skipped by default.",
      "SATURATE: Cap the result at the applicable bound instead of skipping an out-of-bound increment.",
      "EX seconds: Set expiration after a positive number of seconds. At most one expiration option may be specified: `EX`, `PX`, `EXAT`, `PXAT`, or `PERSIST`.",
      "PX milliseconds: Set expiration after a positive number of milliseconds. Mutually exclusive with the other expiration options.",
      "EXAT unix-time-seconds: Set expiration at a Unix timestamp in seconds. Mutually exclusive with the other expiration options.",
      "PXAT unix-time-milliseconds: Set expiration at a Unix timestamp in milliseconds. Mutually exclusive with the other expiration options.",
      "PERSIST: Remove the key’s expiration. Mutually exclusive with the other expiration options and incompatible with `ENX`.",
      "ENX: Apply the expiration only if the key currently has no TTL. Requires `EX`, `PX`, `EXAT`, or `PXAT`; incompatible with `PERSIST`.",
      "Prerequisite: Redis Open Source 8.8.0 or later; `INCREX` is available since 8.8.0."
    ]
  },
  "why_it_matters": "Review whether a Redis-backed application’s rate-limiting logic can use the new window counter command.",
  "before": "The Redis feature issue describes the prior atomic approach as `SCRIPT LOAD` plus `EVALSHA`.",
  "sources": [
    "https://github.com/redis/redis/releases/tag/8.8.0",
    "https://redis.io/docs/latest/commands/increx/",
    "https://github.com/redis/redis/issues/14278"
  ],
  "rank": 0.95044,
  "judge": {
    "publish": true,
    "judge_model": "codex-cli/gpt-6-luna+typesafe/jev-1.13.0",
    "prompt_version": "extract-v7+enrich-v2+judge-v2x3-rejudge+jev-publish-v1"
  },
  "review_state": "approved",
  "provenance": {
    "run_id": "wave2a-20261017",
    "verdict_id": "wave2a-20261017:wave2a-20261017-c9c478bd5bcb2d26-2:rescue",
    "evidence_hash": "ddaf92184682cab2aaa96749060bea26c1303233aa80caeadd15bb5f71183b09"
  },
  "review": {
    "draft_hash": "f1a37933cf6937f07a92e1dd6766c121dc001230fafb47c08032d7ad076e3e90",
    "reviewer": "publication-gate",
    "reviewed_at": "2026-10-07T00:00:00.000Z",
    "decision": "wave2a-20261017:rescue",
    "reason": "Rescue path: first rejected only because the extracted card lacked usage; judged again on the enriched card, 3 of 3 judge runs approved with p_yes >= 0.9 (mean 0.95 >= 0.9; 2 needed) and Jev gave 0.64 (>= 0.6 needed)."
  }
}
