Skip to content

Review sidecar probes and replays spend the per-key free-tier rate budget the review itself needs #1948

Description

@seonghobae

What the evidence now shows

With the catalog fixed (#1939, every run selects 4+4+4 across the three free accounts) and the per-attempt trace landing (#1943/#1944/#1945), the failures that remain on the free pool are not routing failures. Two post-#1939 runs, one hour apart, same shape:

  • noema-review run 33993637015 (#1687, 21:38Z): preflight ready 1/12 — 429 ×6 (all four OpenRouter routes; deepseek-v4-flash and v4-pro on the primary NVIDIA key while the sibling key's flash was ready), 404 ×4 (gemma-3-12b/4b on both NVIDIA keys), 500 ×1. The one ready route was held 542 s and the caller got 502.
  • strix run 33992904674 (#1930, 23:48–00:12Z, artifact 9979385164): ready 1/12 — 429 ×6 again, one TimeoutError, gemma-3 ×4 404; the sole ready route (nvidia_nim_sub deepseek-v4-pro) answered 429 rate_limit_exceeded on the first real request and on all five Strix replays; llm_usage.requests = 0.

Corrected post-#1939 tally of noema-review runs that reached the verdict step: 1 success / 3 failures (three run-level "successes" in that window were closure-event runs with the job skipped). Reading: at those hours there was no free capacity to interleave, and each such job still held a runner for ~25 minutes inside a 234-deep queue.

Mechanism

Every sidecar boot probes all twelve catalog routes with a real completion (REVIEW_PREFLIGHT_BASE_TOKENS = 16, contextual_orchestrator_review_launcher.py:404), i.e. four requests per account per boot, then the review makes its own requests, and Strix replays each scan step up to five times. All of that draws on the same per-key budgets (NVIDIA NIM ≈ 40 requests/min per key, community-reported; OpenRouter free tier is per-key and per-day). With N sidecars booting in the same minute across the organization — required workflows run in every repository — the probes alone can consume the budget the review then needs, and a 429 at probe time is frequently caused by the other sidecars' probes. #1947 stops discarding such routes at preflight, which restores failover depth, but cannot create capacity: a route that is rate-limited for the hour fails fast for everyone.

What this is not

Not a routing defect (#1939 measured working), not a failover defect (#1938 thread: 429 is retryable=True and fails over; provider_errors.py:82), not the launcher strip (#1476 thread). The four permanent gemma-3 404s are a separate discovery-side waste of a third of the catalog.

Levers — all policy values, hence the owner's

  1. Probe budget per boot. Stop probing once K routes are ready (or probe one route per account first), instead of twelve unconditional completions; that divides probe spend by up to 3–4 at the cost of a smaller preflight report. This is an amendment to ADR-0005's "bounds request count" contract.
  2. Replay budget. Strix's five replays against an already-429 route multiply the burn; a replay policy that stops on a rate-limit answer is a strix-agent/CO decision.
  3. Concurrency of sidecar boots. The organization ceiling (60 jobs) is not a per-key limiter; an admission rule per provider key (or a shared rate-limit ledger across sidecars — the same cross-process state contextual-orchestrator#1045 needs for its breaker) would be.
  4. Paid headroom. OpenRouter credits lift the free tier's daily cap; NVIDIA's per-key RPM does not change with credits.

What to measure before choosing

With #1944's artifact every failed noema-review now ships contextual-orchestrator-preflight.json and the sanitized stderr. Two numbers decide between (1)–(3): the fraction of probe rejections that are 429 (vs 404/500/timeout), and the number of sidecars whose probes fell in the same minute (created_at of in-progress noema/strix/opencode jobs org-wide). If most 429s cluster at boot storms, (1) and (3) are the levers; if the sole ready route also 429s on the real request in quiet minutes, the key is simply saturated and (4) is the only one.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions