diff --git a/.github/workflows/nightly-mutation.yml b/.github/workflows/nightly-mutation.yml index 19d2d3b7d0..ec78b64ce8 100644 --- a/.github/workflows/nightly-mutation.yml +++ b/.github/workflows/nightly-mutation.yml @@ -21,9 +21,11 @@ jobs: # big modules are now ISOLATED into their own batches (a=auth, b=accountFallback). # - Onda 3 / Fase 9 T5 re-add: combo.ts was split into 11 leaves; the 8 well-covered # combo/* leaves are back in `mutate` (covered by the 24 combo-*.test.ts), grouped into - # 2 batches (d=heavy, e=light). chatCore/* leaves + quotaScoring/quotaStrategies (#4204) - # are follow-ups — see _mutate_godfiles_excluded_comment in stryker.conf.json. - # 5 PARALLEL batches, each overriding the mutate set via `--mutate` (Stryker 9 CLI: + # 2 batches (d=heavy, e=light). After #4204 (D7b) merged, the reset-aware quota pair + # quotaScoring/quotaStrategies was added as batch f. A covering-test audit then added the + # 6 chatCore/* leaves with direct unit coverage as batch g; the other 9 chatCore leaves + # remain a follow-up — see _mutate_godfiles_excluded_comment in stryker.conf.json. + # 7 PARALLEL batches, each overriding the mutate set via `--mutate` (Stryker 9 CLI: # `-m, --mutate `; the conf's `mutate[]` remains the local-run default/union). # Each batch targets <180min; full coverage every night in parallel (~180min wall-clock). # The `incremental` cache (per-batch key) makes runs after the first cold one much cheaper, @@ -44,6 +46,10 @@ jobs: mutate: "open-sse/services/combo/comboStructure.ts,open-sse/services/combo/autoStrategy.ts,open-sse/services/combo/validateQuality.ts" - name: e mutate: "open-sse/services/combo/shadowRouting.ts,open-sse/services/combo/targetSorters.ts,open-sse/services/combo/comboPredicates.ts,open-sse/services/combo/rrState.ts,open-sse/services/combo/comboData.ts" + - name: f + mutate: "open-sse/services/combo/quotaScoring.ts,open-sse/services/combo/quotaStrategies.ts" + - name: g + mutate: "open-sse/handlers/chatCore/comboContextCache.ts,open-sse/handlers/chatCore/idempotency.ts,open-sse/handlers/chatCore/passthroughHelpers.ts,open-sse/handlers/chatCore/responseHeaders.ts,open-sse/handlers/chatCore/sanitization.ts,open-sse/handlers/chatCore/upstreamTimeouts.ts" timeout-minutes: 180 steps: - uses: actions/checkout@v6 diff --git a/stryker.conf.json b/stryker.conf.json index 427e818a8b..684330e554 100644 --- a/stryker.conf.json +++ b/stryker.conf.json @@ -196,19 +196,26 @@ "2026-06-18 (Onda 3 / Fase 9 T5 re-add): the combo.ts god-file was split into 11 small", "leaf modules under open-sse/services/combo/ (PRs #4162/#4175/#4186/#4196/#4204). The", "routing LOGIC that justified combo.ts being in `mutate` now lives in those leaves, so the", - "8 well-covered combo/* leaves are ADDED back to `mutate` here (comboStructure/autoStrategy/", - "validateQuality/shadowRouting/targetSorters/comboPredicates/rrState/comboData). They are", - "covered by the 24 combo-*.test.ts files already in tap.testFiles. types.ts is omitted", - "(pure type declarations produce 0 mutants).", + "10 well-covered combo/* leaves are ADDED back to `mutate` here (comboStructure/autoStrategy/", + "validateQuality/shadowRouting/targetSorters/comboPredicates/rrState/comboData + the reset-aware", + "quota pair quotaScoring/quotaStrategies, added after #4204 (D7b) merged). They are covered by", + "the 24 combo-*.test.ts files already in tap.testFiles (quota by combo-prescreen/combo-config/", + "combo-strategy-fallbacks). types.ts is omitted (pure type declarations produce 0 mutants).", + "", + "chatCore/* leaves: a covering-test audit (do any tap.testFiles reference each leaf's exported", + "function names?) found 6 with direct unit coverage — comboContextCache/idempotency/", + "passthroughHelpers/responseHeaders/sanitization/upstreamTimeouts — ADDED here (batch g).", "", "STILL EXCLUDED (follow-ups, NOT in `mutate` yet):", " - combo.ts + chatCore.ts barrels: their handleComboChat/handleChatCore CORES were not", " split (out of scope — Fase 3 ChatCoreContext refactor). The barrels are now thin-ish", " but still large; keep excluded until the cores are split.", - " - combo/quotaScoring.ts + combo/quotaStrategies.ts: in PR #4204 (D7b), not yet merged.", - " Add them here once #4204 lands (they are covered by combo-prescreen/combo-config tests).", - " - chatCore/* leaves (15 modules): thinner test coverage (only ~7 chatcore-*.test.ts in", - " tap.testFiles); add after a covering-test audit so they don't all 'survive (no coverage)'.", + " - the other 9 chatCore/* leaves (executorHelpers/headers/logTruncation/memoryExtraction/", + " memorySkillsInjection/nonStreamingSse/passthroughToolNames/semanticCache/telemetryHelpers):", + " no tap.testFiles reference their exported symbols by name — they are only exercised", + " TRANSITIVELY via handleChatCore, which the tap unit tests may not fully drive. Adding them", + " blindly would produce 'survived (no coverage)' noise. Add each once it gains a dedicated", + " unit test (or after a Stryker --dryRunOnly confirms the perTest map covers it).", "See project memory: Quality Gate v2 / Fase 9 (project-combo-split)." ], "mutate": [ @@ -225,7 +232,15 @@ "open-sse/services/combo/targetSorters.ts", "open-sse/services/combo/comboPredicates.ts", "open-sse/services/combo/rrState.ts", - "open-sse/services/combo/comboData.ts" + "open-sse/services/combo/comboData.ts", + "open-sse/services/combo/quotaScoring.ts", + "open-sse/services/combo/quotaStrategies.ts", + "open-sse/handlers/chatCore/comboContextCache.ts", + "open-sse/handlers/chatCore/idempotency.ts", + "open-sse/handlers/chatCore/passthroughHelpers.ts", + "open-sse/handlers/chatCore/responseHeaders.ts", + "open-sse/handlers/chatCore/sanitization.ts", + "open-sse/handlers/chatCore/upstreamTimeouts.ts" ], "_ignorePatterns_comment": [ "ignorePatterns = files NOT copied into the Stryker sandbox. It does NOT scope",