Files
OmniRoute/scripts/check/check-pricing-freshness.mjs
Dizzle d88fc2bce7 fix(routing): table pricing with catalog fallback for off-table models, pooled latency bootstrap, fresh tier cache (#12792)
Um modelo grátis fora da tabela herdando $5/$15 por milhão e afundando no roteamento cost-aware é o defeito mais caro desta onda: silencioso, e inverte exatamente a decisão que o operador quer.

Parar de chutar 1500ms de latência para modelo desconhecido e usar a mediana observada do pool — com contador de quantas vezes o chute dispara — é trocar heurística por medição do jeito certo. O contador é o que permite saber se valeu.

Revalidei após reconstruir a branch sobre o tip: **33/33** nas suítes da PR, typecheck:core limpo, `check-api-typecheck` OK (289).

**Duas integrações:**

1. `computeSnapshotWeights` conflitou com o #12794 (health via breaker + quality), já mergeado. Os dois compõem e ambos ficaram: o seu termo de `reliability` — que era a única chave que o caminho de snapshot ainda ignorava — mais o health observado e o quality do #12794.
2. `scripts/quality/run-all-gates.mjs` conflitou com o `check:provider-order-sync` do #12790. Aditivo, os dois gates coexistem.

**Nota de dívida:** o `virtualFactory.ts` cruzou o teto de 1200 linhas pela primeira vez (1187 → 1207) somando esta onda. Congelei em vez de dividir e registrei os dois candidatos a extração na justificativa — `computeSnapshotWeights` (~85 linhas) e o grupo de elegibilidade de credencial (~70). Qualquer um dos dois volta o arquivo para baixo do cap.
2026-09-10 09:20:18 -03:00

27 lines
1023 B
JavaScript

#!/usr/bin/env node
// STRICT gate: KNOWN_MODEL_PRICING must have been touched within PRICING_STALE_AFTER_DAYS,
// or tiers silently drift from real prices. Exits 1 on stale, 0 on fresh.
// Run: node scripts/check/check-pricing-freshness.mjs
import { execFileSync } from "node:child_process";
const PRICING_STALE_AFTER_DAYS = 90;
const TARGET = "open-sse/services/providerCostData.ts";
function lastTouchDays() {
const out = execFileSync("git", ["log", "--follow", "-1", "--format=%ct", "--", TARGET], {
encoding: "utf8",
}).trim();
const touched = Number(out);
if (!Number.isFinite(touched) || touched <= 0) return Infinity;
return (Date.now() / 1000 - touched) / 86400;
}
const days = lastTouchDays();
if (days > PRICING_STALE_AFTER_DAYS) {
console.error(
`STALE: ${TARGET} untouched for ${Math.floor(days)}d (> ${PRICING_STALE_AFTER_DAYS}d) — refresh prices or bump the gate with justification`
);
process.exit(1);
}
console.log(`pricing fresh: ${TARGET} touched ${Math.floor(days)}d ago`);