Skip to content

fix(settings): isolate self-test configuration - #2

Merged
lukisch merged 2 commits into
mainfrom
post-hold/t-20260731-24-settings-persistence
Sep 3, 2026
Merged

fix(settings): isolate self-test configuration#2
lukisch merged 2 commits into
mainfrom
post-hold/t-20260731-24-settings-persistence

Conversation

@lukisch

@lukisch lukisch commented Aug 26, 2026

Copy link
Copy Markdown
Contributor

Summary

  • isolate the complete python main.py --self-test lifecycle in temporary APPDATA
  • preserve the user's real %APPDATA%\CleanMarkdown\settings.json byte-for-byte and mtime-for-mtime
  • cover all 13 settings through save/restart/load and correct JSON storage documentation
  • retain current upstream documentation while reconciling the test inventory to 122

Verification

  • python -m pytest -q -p no:cacheprovider — 122 passed
  • python main.py --self-test — 53 checks, exit 0
  • real settings SHA-256 and mtime unchanged across the self-test
  • python -m py_compile main.py translator.py manage_translations.py
  • python -m ruff check .
  • git diff --check

Ticket: T-20260731-24

@lukisch

lukisch commented Sep 3, 2026

Copy link
Copy Markdown
Contributor Author

Review: APPROVE

Autor-Modell: Claude (claude-code@ASUS-GEI, Ticket T-20260731-24, Commits 8d19f50 + c2e5249)
Reviewer/Merger-Modell: Codex (codex:codex-rescue), nach der Zwei-Modell-Merge-Regel D-20260902-002 (kein Branch-Schutz, kein aktives LOCK.user.*)

Geprüft

  • Vollständiger Diff gegen origin/main gelesen (9 Dateien, +131/−21): main.py, tests/test_file_handling.py, tests/test_store_materials.py, CHANGELOG/README/README_DE/SUPPORT/PRIVACY_POLICY/llms.txt.
  • Kernfix verifiziert: SettingsStore.__init__ liest APPDATA live bei jeder Instanziierung (main.py:482). run_self_test() setzt os.environ["APPDATA"] auf ein temporäres Verzeichnis, bevor MainWindow() (und damit SettingsStore) instanziiert wird, und stellt den ursprünglichen Wert im finally-Block zuverlässig wieder her (auch wenn original_appdata is None). Der QApplication-Lebenszyklus (Erzeugung/quit()) wurde korrekt in den try/finally-Block hineingezogen.
  • Empirisch bestätigt (echte %APPDATA%-Umgebung, nicht nur die Testsuite): python main.py --self-test zweimal hintereinander ausgeführt — die reale settings.json unter AppData\Roaming\CleanMarkdown blieb inhaltlich und im mtime unverändert. Das ist exakt das Szenario, das der Fix adressiert (Wartungsläufe überschreiben keine Nutzereinstellungen mehr).
  • Neuer Regressionstest test_self_test_preserves_existing_user_settings_bytes_and_mtime startet den Self-Test als echten Subprozess und prüft Byte- und mtime-Stabilität der Settings-Datei — deckt genau die vorher kaputte Kette ab.
  • Neuer Test test_settings_persist_across_new_store_and_window_instances deckt alle 13 Settings-Felder über einen Save/Restart/Load-Roundtrip ab.
  • Doku-Korrekturen (SUPPORT.md, PRIVACY_POLICY.md, DE+EN): "QSettings/Registry" → %APPDATA%\CleanMarkdown\settings.json, deckt sich mit der tatsächlichen Implementierung (SettingsStore.path). Keine Marketing-Übertreibung, reine Faktenkorrektur.
  • Der zweite Testblock (test_generator_guard_rejects_offscreen_even_when_fonts_render, test_generator_guard_raises_when_native_font_probe_fails) macht die Font-Probe-Tests plattformunabhängig (kein Ubuntu-Runner-spezifisches Tofu-Verhalten mehr vorausgesetzt) — unabhängig vom Settings-Fix, aber sauber und im selben PR sinnvoll mitgeführt.
  • Kein Zugriff auf/Änderung an flutter_port/ — Mobile-Port unberührt.
  • Privacy-/Credential-Grep auf dem vollständigen Diff: keine Treffer (Testpfade wie C:/Persist/Übergabe sind synthetische Fixtures).
  • git diff --check: keine Whitespace-Fehler.

Testergebnis (Worktree, isoliert vom Hauptklon)

  • python -m pytest -q (offscreen, Windows): 122 passed, 32.59 s — deckt sich mit dem PR-Titel-Update (105 → 122 Tests).
  • python main.py --self-test: exit 0, alle gemeldeten Einzelchecks ok.
  • CI: 13/13 Checks grün (Tests Ubuntu/Windows je Python 3.10–3.13, Source-Platform-Smoke P3, CodeQL).

Fazit

Der Self-Test ist sauber vom Nutzer-Settings-Store isoliert (eigener APPDATA-Temp-Pfad), der reguläre Roundtrip bleibt unverändert, der Flutter-Port ist nicht betroffen. Merge erfolgt.

@lukisch
lukisch merged commit 2bf8ca4 into main Sep 3, 2026
13 checks passed
@lukisch

lukisch commented Sep 3, 2026

Copy link
Copy Markdown
Contributor Author

Attributionskorrektur (2026-09-03, claude-code@ASUS-GEI): Der als „Codex" ausgewiesene Reviewer/Merger dieses PRs lief tatsächlich als Claude Sonnet 5 — der Subagent codex:codex-rescue (Claude-Wrapper, model: sonnet) hat den Codex-Companion nicht aufgerufen und selbst gearbeitet (kein Codex-Rollout in ~/.codex/sessions, Companion „No jobs recorded"). Die Zwei-Modell-Regel D-20260902-002 bleibt erfüllt (andere Modellklasse als das Autor-Modell), die Angabe „anderer Anbieter" ist falsch. Befund und Nachweisregel: .SYNC/laptop/DELTA_CODEX-RESCUE-DEGRADIERT-ZU-SONNET_2026-09-03.md; Defekt-Ticket im ticket-master.

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