Skip to content

fix(auto-combo): stop neutral snapshot scoring on observed tier/quality/breaker - #12794

Merged
diegosouzapw merged 1 commit into
cheaper-inference:release/v3.8.51from
maxmad64bis:fix/batch6-snapshot-scoring
Sep 10, 2026
Merged

diegosouzapw merged 1 commit into
cheaper-inference:release/v3.8.51from
maxmad64bis:fix/batch6-snapshot-scoring

Conversation

@maxmad64bis

@maxmad64bis maxmad64bis commented Sep 5, 2026 •

Copy link
Copy Markdown
Contributor

⚠️ base-red inherited: #12732

Summary

Auto-combo's snapshot scoring treated every candidate the same on three factors: all accounts looked "standard", all models looked average quality, and a tripped circuit breaker (the flag that says "this provider is failing, stop sending traffic") counted the same as a healthy one. This PR feeds the observed values in instead, so an Ultra account outranks a free one, a proven model outranks an untested one, and a failing provider sinks to the bottom at build time. It doesn't touch prices or budgets — that's a separate PR.

Related Issues

Validation

  • Change type: routing
  • Focused tests and category gates from the golden path
  • npm run lint
  • Reconciled with the current active release base; focused checks rerun afterward
  • Production-code changes include a new or updated automated test in this PR

Tests Added Or Updated

  • tests/unit/combo-auto-tier.test.ts (new, 4 cases: tier order ultra > pro > standard > free, unknown-tier fallback, reset-interval bonus, shared-helper discrimination)
  • tests/unit/virtualFactory-snapshot-quality.test.ts (new, 3 cases: attach path carries finite quality, hot > cold weighting, tracker value finite)
  • tests/unit/virtualFactory-snapshot-breaker.test.ts (new, 3 cases: OPEN < CLOSED, HALF_OPEN midpoint + absent neutral, cold vs hot quality)

Focused suite: 10 passed. Neighbors (snapshot-weights, auto-combo-scoring-clamp, combo-scoring-weights-schema) 27 passed. typecheck:core clean, check:cycles clean, check:known-symbols clean.

Coverage Notes

Touches open-sse/services/combo.ts, open-sse/services/autoCombo/virtualFactory.ts, open-sse/services/autoCombo/scoring.ts, and the new open-sse/services/autoCombo/snapshotBreaker.ts (breaker read + health factor, which keeps virtualFactory.ts under its 1200-line cap). Covered by the 10 new tests above; no coverage gate run locally (CI owns it).

Reviewer Notes

The account-tier projection may change nothing on installs where no connection row carries a tier — that's expected, not a bug: unknown rows stay neutral exactly as before. The breaker wiring fails open (any read error keeps the old neutral score). Rebased onto the current release/v3.8.51 tip and re-verified.

@maxmad64bis
maxmad64bis force-pushed the fix/batch6-snapshot-scoring branch 2 times, most recently from 9fb7507 to 891a13e Compare September 5, 2026 11:32
…ty/breaker

Virtual auto-combo snapshot now carries per-connection accountTier and
per-model quality with a healthFactor for OPEN/HALF_OPEN/CLOSED, so the
tierPriority and quality/breaker factors stop being neutral constants.
@maxmad64bis
maxmad64bis force-pushed the fix/batch6-snapshot-scoring branch from 891a13e to 5673237 Compare September 10, 2026 11:50
@diegosouzapw
diegosouzapw merged commit 2b276e2 into cheaper-inference:release/v3.8.51 Sep 10, 2026
9 of 16 checks passed
diegosouzapw pushed a commit that referenced this pull request Sep 10, 2026
…#12731)

Validado numa worktree combinada com a onda de roteamento/free-tier desta leva sobre `release/v3.8.51`: typecheck:core limpo, check-api-typecheck OK (288), check-file-size OK após rebaseline, 84/85 nos testes focados.

`reliability-first` que não pesava reliability é o defeito mais constrangedor possível num mode pack, e a causa é clara: `modePacks.ts:13` substituía os defaults por inteiro. Financiar os novos pesos com `quota`/`costInv`/`tierPriority` mantendo cada pack somando 1.0 é a parte que exige cuidado e você fez.

Manter `quality-first` em 0.03, igual ao default, para que ele não fique mais fraco que `balanced`, é o tipo de detalhe que só aparece quando se checa a tabela inteira.

**Integração:** conflitou com o #12794 no `computeSnapshotWeights`; os dois compõem e ambos ficaram.
diegosouzapw pushed a commit that referenced this pull request Sep 10, 2026
…s, 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.
@maxmad64bis
maxmad64bis deleted the fix/batch6-snapshot-scoring branch September 24, 2026 21:12
muhamadgalihsaputra pushed a commit to niyatna/NiyatnaRoute that referenced this pull request Sep 27, 2026
…ty/breaker (cheaper-inference#12794)

Validado numa worktree combinada com a onda de roteamento/free-tier desta leva sobre `release/v3.8.51`: typecheck:core limpo, check-api-typecheck OK (288), check-file-size OK após rebaseline, 84/85 nos testes focados.

Tratar breaker aberto como equivalente a fechado no scoring de snapshot é pior que não pontuar: afirma saúde onde há falha conhecida. Trocar as três constantes neutras por valor observado é a correção, e manter preço e orçamento fora do escopo mantém a PR revisável.

**Integração:** o `computeSnapshotWeights` conflitou com o cheaper-inference#12731, que adiciona peso de `reliability` a partir de `failureRate`/`errorRate`. Os dois cobrem chaves diferentes e compõem — ficaram ambos: reliability do cheaper-inference#12731, health via breaker e quality desta PR, quota neutro nos dois. Nenhum dos dois lados foi descartado.
muhamadgalihsaputra pushed a commit to niyatna/NiyatnaRoute that referenced this pull request Sep 27, 2026
…cheaper-inference#12731)

Validado numa worktree combinada com a onda de roteamento/free-tier desta leva sobre `release/v3.8.51`: typecheck:core limpo, check-api-typecheck OK (288), check-file-size OK após rebaseline, 84/85 nos testes focados.

`reliability-first` que não pesava reliability é o defeito mais constrangedor possível num mode pack, e a causa é clara: `modePacks.ts:13` substituía os defaults por inteiro. Financiar os novos pesos com `quota`/`costInv`/`tierPriority` mantendo cada pack somando 1.0 é a parte que exige cuidado e você fez.

Manter `quality-first` em 0.03, igual ao default, para que ele não fique mais fraco que `balanced`, é o tipo de detalhe que só aparece quando se checa a tabela inteira.

**Integração:** conflitou com o cheaper-inference#12794 no `computeSnapshotWeights`; os dois compõem e ambos ficaram.
muhamadgalihsaputra pushed a commit to niyatna/NiyatnaRoute that referenced this pull request Sep 27, 2026
…s, pooled latency bootstrap, fresh tier cache (cheaper-inference#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 cheaper-inference#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 cheaper-inference#12794.
2. `scripts/quality/run-all-gates.mjs` conflitou com o `check:provider-order-sync` do cheaper-inference#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.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants