Status: implement-now (phase 1)
This document captures the agreed spec for improving the benchmarking system’s reliability, lifecycle decisioning, and operational signal quality. It incorporates the review feedback and clarifies edge-case semantics before implementation.
- Reduce error spam and convert failures into actionable signals.
- Prevent bad API keys / billing issues from causing mass false deprecation/disable decisions.
- Provide conservative, evidence-based recommendations for disabling models (initially recommendations-only, no auto-mutation).
- Preserve benchmark integrity: benchmarking remains the primary purpose.
- Perfect “deprecated” truth (confidence + evidence, not certainty).
- Web scraping as a primary catalog source.
Per core principle: do not take automated actions in the runner (no pausing, no disabling, no mutating the catalog). We only log structured signals and produce recommendations that a human can apply separately.
Key rule: hard_capability should not trigger auto-disable (these are usually “needs code update” issues).
Fields (in models)
- existing:
provider,model_id,enabled,deprecated,created_at - add (as-needed):
auto_disabled,disabled_at,disabled_reason,re_enabled_at,re_enable_reason
Disable recommendations (initially)
- Start recommendations-only for 2–4 weeks.
- Optional future auto-disable only for:
error_kind = hard_model- model had at least 1 success historically
- provider NOT paused
- 5+ consecutive failures across 3+ cycles
- Keep
hard_capabilityand “never succeeded” cases recommendations-only permanently.
Classify errors at write-time and store on each errors_cloud document.
error_kind
auth(401/403; invalid key; unauthorized)billing(402; insufficient credits; overdue invoices)rate_limit(429; quota exceeded)hard_model(404 model not found / “no endpoints found” / “does not exist”)hard_capability(“not a chat model”, “responses-only”, wrong endpoint)transient_provider(5xx)network(timeouts, connection errors)unknown
Stored fields
http_status,provider_error_codenormalized_messagefingerprint(sha256 of provider/model/stage/error_kind/normalized_message)
Error sampling
- Keep last 3 unique normalized messages per
(provider, model, error_kind)in rollups.
Maintain rollups to avoid 200k identical error docs becoming the primary UI signal.
Collection: error_rollups
- key:
fingerprint(unique) provider,model_name,stage,error_kindfirst_seen,last_seen,countsample_messages(up to 3 unique normalized messages)
Any success resets all failure streaks for that model (conceptual; used for recommendations).
Defaults
- “Had recent success” lookback: 90 days
- Hard-fail threshold for recommendation: 5 failures
- “3+ cycles”: failures span at least ~2 hours (implementation approximation)
Authoritative providers: OpenAI, Anthropic, Vertex, Bedrock.
Unreliable catalogs: OpenRouter, Together, Fireworks, Groq (weak signal only).
Collection: provider_catalog_snapshots
provider,collected_at,model_ids,source
error_kind+ normalization + rollups (no behavior change besides extra fields).- Recommendations-only CLI for disables/investigation queues.
- Optional: authoritative catalog snapshots and feed lifecycle confidence.