Skip to content

chore(quality): close v3.8.28 cycle gate drift (re-baseline + nightly-mutation scope) - #4135

Merged
diegosouzapw merged 2 commits into
release/v3.8.29from
chore/gate-cycle-close-v3829
Jun 18, 2026
Merged

diegosouzapw merged 2 commits into
release/v3.8.29from
chore/gate-cycle-close-v3829

Conversation

@diegosouzapw

Copy link
Copy Markdown
Collaborator

Fecha os reds de gate que sobraram no main após a release v3.8.28 (push→main run 27725117464). São 2 decisões do operador, em commits separados.

Commit 1 — Re-baseline do drift do ciclo (eslint/openapi/i18n)

O Quality Ratchet falhou em 3 métricas que driftaram no ciclo v3.8.28 (merges de feature legítimos). Re-baseline para os valores REAIS medidos (idênticos ao CI, reproduzidos em 9f14c1294):

Métrica Antes → Depois Por que NÃO é hand-clean
eslintWarnings 3769 → 3779 no-explicit-any é warn e permitido em testes (o drift é any de teste) + 4 exhaustive-deps no RequestLoggerV2.tsx (componente refresh-sensitive #4103/#3972 — arriscado sem teste UI)
openapiCoverage.pct 38.3 → 37.6 drop por rotas internas novas (/api/tools/agent-bridge/*, LOCAL_ONLY) — documentar no spec público = gaming
i18nUiCoverage.pct 80.1 → 79.1 37/41 locales precisam de ~3000 traduções via i18n:run (exige OMNIROUTE_TRANSLATION_API_KEY, indisponível)

Segue o precedente documentado em _eslint_rebaseline_2026_06_16_v3826_forward_merge. Aperto no fim do ciclo: eslint/openapi via --require-tighten; i18n via i18n:run com creds. Justificativa completa na chave _rebaseline_2026_06_18_v3828_cycle_close.

Os 2 reds REAIS de produto desse mesmo run (count_tokens stale + combo sticky-3) já foram corrigidos no #4129 (test-only). Este PR é só o drift de métrica.

Commit 2 — Escopar nightly-mutation p/ caber em 180min

O run completo dos 8 módulos estourou os 180min (27705123780: 16:47:33 → 19:47:48 = exatamente 180min; o agendado de 120min também estourou). O #4078 tornou concurrency=4 segura (isolamento DATA_DIR, A/B provado) mas não suficiente: o tap-runner re-spawna node por arquivo-de-teste por mutante, então o custo de spawn domina e os god-files chatCore.ts(5874) + combo.ts(5282) = ~⅔ dos ~15k mutantes não cabem.

Removi os 2 god-files do mutate (stryker.conf.json). Os 6 módulos menores cabem no budget e produzem mutation score real já; os god-files recuperam cobertura após o split da Onda 3. Remover entradas do mutate não afeta o baseline (dry-run roda tap.testFiles, intocado) → all-green preservado.

Validação

  • quality-baseline.json e stryker.conf.json válidos (parse OK); 6 módulos no mutate.
  • Valores re-baseline batem exatamente o que o CI mediu no step Ratchet check.
  • Validação pós-merge (Onda 2): re-disparar o nightly-mutation em release/v3.8.29 p/ confirmar que os 6 módulos completam dentro de 180min.

🤖 Generated with Claude Code

The post-release push->main Quality Ratchet (run 27725117464) failed on 3
metrics that drifted during the v3.8.28 cycle from legitimate feature merges:
eslintWarnings 3769->3779, openapiCoverage.pct 38.3->37.6, i18nUiCoverage.pct
80.1->79.1. Reproduced locally on release/v3.8.29 (9f14c12) — identical to CI.

None is hand-cleanable without gaming or unavailable infra:
- eslint +10: no-explicit-any is warn-level and allowed in tests (the drift is
  test `any`), plus 4 react-hooks/exhaustive-deps in RequestLoggerV2.tsx (a
  refresh-sensitive component — touching hook deps without UI tests is risky).
- openapi -0.7: the drop is from new INTERNAL routes (/api/tools/agent-bridge/*,
  LOCAL_ONLY) — documenting them in the public spec would game the metric.
- i18n -1.0: 37/41 locales need ~3000 translations via `npm run i18n:run`, which
  requires OMNIROUTE_TRANSLATION_API_KEY (not available locally).

Re-baselined to the real measured values per the documented v3.8.26 precedent
(_eslint_rebaseline_2026_06_16_v3826_forward_merge). Tighten at cycle end:
eslint/openapi via --require-tighten; i18n via i18n:run with creds.
The full 8-module Stryker run timed out at the 180min nightly cap (run
27705123780: 16:47:33 -> 19:47:48 = exactly 180min; the prior 120min scheduled
run also timed out). #4078's DATA_DIR isolation made concurrency=4 safe but not
sufficient: the tap-runner re-spawns a node process per test file per mutant, so
spawn cost dominates and the two god-files chatCore.ts (5874 LOC) + combo.ts
(5282 LOC) — ~2/3 of the ~15k mutants — do not fit.

Removed both god-files from stryker.conf.json `mutate`. The 6 smaller modules fit
the budget and produce real mutation scores now; the god-files regain coverage
after the Onda 3 split into smaller units. Updated the nightly job name/comments
(8->6 modules). Removing entries from `mutate` does not affect the dry-run
baseline (it runs tap.testFiles, unchanged), so the all-green baseline is preserved.
@gemini-code-assist

Copy link
Copy Markdown
Contributor

Warning

You have reached your daily quota limit. Please wait up to 24 hours and I will start processing your requests again!

@chatgpt-codex-connector

Copy link
Copy Markdown

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.

@diegosouzapw
diegosouzapw merged commit 34bde60 into release/v3.8.29 Jun 18, 2026
4 checks passed
@diegosouzapw
diegosouzapw deleted the chore/gate-cycle-close-v3829 branch June 18, 2026 06:23
@diegosouzapw diegosouzapw mentioned this pull request Jun 19, 2026
tkgo11 pushed a commit to tkgo11/OmniRoute that referenced this pull request Sep 23, 2026
…-mutation scope) (cheaper-inference#4135)

* chore(quality): re-baseline v3.8.28 cycle drift (eslint/openapi/i18n)

The post-release push->main Quality Ratchet (run 27725117464) failed on 3
metrics that drifted during the v3.8.28 cycle from legitimate feature merges:
eslintWarnings 3769->3779, openapiCoverage.pct 38.3->37.6, i18nUiCoverage.pct
80.1->79.1. Reproduced locally on release/v3.8.29 (d95d2d4) — identical to CI.

None is hand-cleanable without gaming or unavailable infra:
- eslint +10: no-explicit-any is warn-level and allowed in tests (the drift is
  test `any`), plus 4 react-hooks/exhaustive-deps in RequestLoggerV2.tsx (a
  refresh-sensitive component — touching hook deps without UI tests is risky).
- openapi -0.7: the drop is from new INTERNAL routes (/api/tools/agent-bridge/*,
  LOCAL_ONLY) — documenting them in the public spec would game the metric.
- i18n -1.0: 37/41 locales need ~3000 translations via `npm run i18n:run`, which
  requires OMNIROUTE_TRANSLATION_API_KEY (not available locally).

Re-baselined to the real measured values per the documented v3.8.26 precedent
(_eslint_rebaseline_2026_06_16_v3826_forward_merge). Tighten at cycle end:
eslint/openapi via --require-tighten; i18n via i18n:run with creds.

* ci(mutation): scope nightly to 6 modules to fit the 180min budget

The full 8-module Stryker run timed out at the 180min nightly cap (run
27705123780: 16:47:33 -> 19:47:48 = exactly 180min; the prior 120min scheduled
run also timed out). cheaper-inference#4078's DATA_DIR isolation made concurrency=4 safe but not
sufficient: the tap-runner re-spawns a node process per test file per mutant, so
spawn cost dominates and the two god-files chatCore.ts (5874 LOC) + combo.ts
(5282 LOC) — ~2/3 of the ~15k mutants — do not fit.

Removed both god-files from stryker.conf.json `mutate`. The 6 smaller modules fit
the budget and produce real mutation scores now; the god-files regain coverage
after the Onda 3 split into smaller units. Updated the nightly job name/comments
(8->6 modules). Removing entries from `mutate` does not affect the dry-run
baseline (it runs tap.testFiles, unchanged), so the all-green baseline is preserved.
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.

1 participant