Skip to content

fix(config): persist background-degradation entry deletions - #12647

Merged
diegosouzapw merged 2 commits into
diegosouzapw:release/v3.8.51from
pacocartones:fix/12424-degradation-deletions
Sep 11, 2026
Merged

diegosouzapw merged 2 commits into
diegosouzapw:release/v3.8.51from
pacocartones:fix/12424-degradation-deletions

Conversation

@pacocartones

Copy link
Copy Markdown
Contributor

Summary

  • applyBackgroundDegradationSection() (src/lib/config/runtimeSettings.ts) merged
    { ...getDefaultDegradationMap(), ...stored }, so a stored map that omits a default key was
    indistinguishable from one that never touched it — the key was always back-filled from defaults and
    a deletion made through the dashboard reappeared on the next apply/restart.
  • detectionPatterns in the same function already treats a present stored value as authoritative
    (defaults only when empty), so the two halves of the same object disagreed on semantics — the tell
    that this was an oversight, not intent.
  • Fix: make degradationMap stored-authoritative-when-present, mirroring detectionPatterns and
    normalizeBackgroundDegradation() (which only keeps keys present in the stored record). No schema change.
  • Migration trade-off: a config saved before this fix with an incomplete stored map — because it
    silently absorbed a "deletion" as an omission — stays incomplete once the merge stops back-filling.
    That is intentional (the stored map is now taken at face value), not a regression.

Related Issues

Validation

  • Change type: other (runtime config)
  • 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/settings/background-degradation-deletions-12424.test.ts — a stored map that omits the
    gpt-5 default must not resurrect it, while a kept entry still applies. RED on base (fails exactly
    on the resurrected key), GREEN with the fix.

Coverage Notes

  • Touches src/lib/config/runtimeSettings.ts only. The new test drives the real
    applyRuntimeSettings → getBackgroundDegradationConfig() path; the existing config-hot-reload,
    background-task-detector and chatcore-background-redirect suites (26 tests) stay green.

…zapw#12424)

applyBackgroundDegradationSection merged `{ ...getDefaultDegradationMap(), ...stored }`,
so a stored map that omits a default key was indistinguishable from one that never touched
it — the key was always back-filled from defaults and a deletion made in the dashboard
reappeared on the next apply/restart. detectionPatterns in the same function already treats
a present stored value as authoritative, so the two halves of the object disagreed.

Make degradationMap stored-authoritative-when-present (mirroring detectionPatterns and
normalizeBackgroundDegradation, which only keeps keys present in the stored record). No
schema change. Adds a discriminant red->green test.

Migration trade-off: a config saved before this fix with an incomplete stored map (because
it silently absorbed a deletion as an omission) stays incomplete once the merge stops
back-filling — intentional, not a regression.
@diegosouzapw
diegosouzapw merged commit 616d54c into diegosouzapw:release/v3.8.51 Sep 11, 2026
15 of 16 checks passed
Githab-capibara added a commit to Githab-capibara/OmniRoute that referenced this pull request Sep 17, 2026
…zapw#12647)

The tell is convincing: `detectionPatterns` in the same function already treats a present stored value as authoritative, so the two halves of one object disagreed. Making `degradationMap` stored-authoritative-when-present is the smaller change and the consistent one.

---

Validated in one consolidated worktree cut from `release/v3.8.51`, boarded with the rest of this batch — zero conflicts between the 19 PRs.

- `typecheck:core` clean; `check:dashboard-typecheck` OK (206 pre-existing, all within the frozen baseline); `check:changelog-integrity` OK
- complexity 2802 / baseline 3218 and cognitive-complexity 1267 / baseline 1437 — both under baseline
- 226 of 228 focused assertions green across the batch's 23 test files. The 2 remaining belong to diegosouzapw#12551, which is held separately.

Two batch-owned defects were found and fixed in flight, both pure base drift: `173_xp_action_counts.sql` collided with `173_call_logs_video_content_removed.sql` (renumbered to 176 on diegosouzapw#12651 — it aborted every DB open, which is what 53 of the first run's failures were), and the feature-flag catalog was missing the `SERVER_OWNED_TOOL_LOOP_ENABLED` row the base gained after diegosouzapw#12552 was written.

⚠️ base-red inherited: diegosouzapw#12732 — `Docs Gates`, `Merge integrity`, `No new ESLint warnings`, `Unit Tests fast-path` and `Fast Quality Gates` reproduce on the pure tip (provider count 356 vs the 358 the modules define, SKILL.md drift, and `open-sse/utils/stream.ts` at 3115 > frozen 3098, which this batch does not touch).

Thanks @pacocartones — the `file:line` citations and the explicit out-of-scope notes on every one of these made a 19-PR batch reviewable in one pass.
muhamadgalihsaputra pushed a commit to niyatna/NiyatnaRoute that referenced this pull request Sep 27, 2026
…zapw#12647)

The tell is convincing: `detectionPatterns` in the same function already treats a present stored value as authoritative, so the two halves of one object disagreed. Making `degradationMap` stored-authoritative-when-present is the smaller change and the consistent one.

---

Validated in one consolidated worktree cut from `release/v3.8.51`, boarded with the rest of this batch — zero conflicts between the 19 PRs.

- `typecheck:core` clean; `check:dashboard-typecheck` OK (206 pre-existing, all within the frozen baseline); `check:changelog-integrity` OK
- complexity 2802 / baseline 3218 and cognitive-complexity 1267 / baseline 1437 — both under baseline
- 226 of 228 focused assertions green across the batch's 23 test files. The 2 remaining belong to diegosouzapw#12551, which is held separately.

Two batch-owned defects were found and fixed in flight, both pure base drift: `173_xp_action_counts.sql` collided with `173_call_logs_video_content_removed.sql` (renumbered to 176 on diegosouzapw#12651 — it aborted every DB open, which is what 53 of the first run's failures were), and the feature-flag catalog was missing the `SERVER_OWNED_TOOL_LOOP_ENABLED` row the base gained after diegosouzapw#12552 was written.

⚠️ base-red inherited: diegosouzapw#12732 — `Docs Gates`, `Merge integrity`, `No new ESLint warnings`, `Unit Tests fast-path` and `Fast Quality Gates` reproduce on the pure tip (provider count 356 vs the 358 the modules define, SKILL.md drift, and `open-sse/utils/stream.ts` at 3115 > frozen 3098, which this batch does not touch).

Thanks @pacocartones — the `file:line` citations and the explicit out-of-scope notes on every one of these made a 19-PR batch reviewable in one pass.
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.

fix(backend): background degradation map — removed default rows reappear after restart

2 participants