diff --git a/.gitignore b/.gitignore index 4cc20fa..4e0e15e 100644 --- a/.gitignore +++ b/.gitignore @@ -32,6 +32,22 @@ TESTERGEBNISSE.txt BUGREPORT.md DIAGNOSE_REPORT.md LOCK*.txt +BEFUNDE.md +# Diese vier sind hier noch getrackt: MARKETING-LOG.txt, STORE_CONTRACT.md und +# RUNTIME_DAILY_CARE.md sind in pyproject.toml/llms.txt/README verlinkt und +# durch tests/test_metadata.py, tests/test_store_contract.py bzw. +# tests/test_softwarecenter_sync.py als Konsistenzvertrag verankert; _WARTUNG/ +# ist Fixture fuer tests/test_store_contract.py. Aus dem Tracking nehmen +# erfordert zuerst diese Referenzen aufzuloesen (T-20260926-510472849, offene +# Entscheidung -- nicht Teil dieser Bereinigung). Das Muster steht trotzdem +# hier, damit KEIN NEUES Repo diese Namen unbedacht wieder committet. +*MARKETING-LOG.txt +*STATUS-LOG.txt +*_DAILY_CARE.md +TASKPLAN_STATUS_*.md +STORE_CONTRACT.md +_WARTUNG/ +_STAGING/ # ---- Persoenliche / Sensible Daten ---- _USER/ diff --git a/BEFUNDE.md b/BEFUNDE.md deleted file mode 100644 index 6f829e6..0000000 --- a/BEFUNDE.md +++ /dev/null @@ -1,49 +0,0 @@ -# Befunde — SoftwareCenter - -**Erfasst am:** 2026-07-28 -**Rolle:** TICKET-MASTER / Plan-D-Handoff - -## Entscheidung und Git-Provenienz - -- Autorisierte Entscheidung `D-20260727-008`: lokalen Stand kontrolliert auf - `origin/master` rebasen, Commit und Icons erhalten, anschließend erneut - testen. -- Der ursprüngliche lokale Commit `4ccb965` wurde auf den Remote-Stand - `83ab6b3` rebaset und als `8dfa64f` fortgeführt. `c89960c` dokumentierte den - ersten Closeout. -- Die auf dem Remote bereits bewusst entfernte `web_companion`-Implementierung - bleibt entfernt. Eine durch den Rebase übernommene, dadurch unzutreffende - PWA-Zeile im Changelog wurde ebenfalls entfernt. -- Die im bisherigen OneDrive-Arbeitsstand enthaltenen - `BUGSWEEP-41`-Pfadprüfungen wurden als eigener, testbarer Codebestand - übernommen. Unabhängige Typografieänderungen sind keine Voraussetzung für - diesen Fix. -- Die autorisierten Icon-Masterdateien wurden bitgenau erhalten: - `SoftwareCenter.ico` - (`4052B690501B8D0BCE19270A4DEDC7136B4995D84EA11BFF72D657B01565CDBC`) - und `SoftwareCenter.png` - (`BA3DF6B23BE8DF0706EE632CC9C5C282703E9468C3A644ABE1B886F7E0F02125`). - -## Verifikation - -- `python -m pytest -q`: **124 bestanden** -- Die portable Katalogroutine besitzt separat **12 bestandene Tests**, - einschließlich read-only Daily Care, leerem/fehlerhaftem Scan, - `SUPPRESSED`-Erhalt, Idempotenz, Prozess-Abbruch und - Backup/Wiederherstellung beider Profile. -- Der reale Daily-Care-Lauf erkannte 59 Katalog-, Registry- und - Kandidateneinträge. Drei fehlende Startziele und acht nur geplante - Profiländerungen wurden gemeldet; es wurde keine Profil- oder - Registry-Mutation vorgenommen. - -## Tägliche Betriebsroutine - -Der headless Job `softwarecenter.launchboards.daily-care` ist im -`ellmos-scheduler` für täglich 06:20 Uhr Europe/Berlin registriert und im -Automation Master als read-only, vergleichbare Automatisierung erfasst. Die -versteckte Windows-Aufgabe -`ellmos SoftwareCenter LaunchBoards Daily Care` führt täglich genau einen -Scheduler-Tick aus, holt verpasste Starts nach und vermeidet parallele -Instanzen. Ein kontrollierter Hintergrundstart endete mit Resultat `0`; der -Scheduler bestätigte dabei einen neuen `last_tick_at`. Damit ist die tägliche -Ausführung auf WORKSTATION-LG aktiviert, ohne sichtbares Fenster. diff --git a/CHANGELOG.md b/CHANGELOG.md index 27231ae..492e2b3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,10 @@ All notable changes to this project will be documented in this file. ## [Unreleased] - 2026-09-23 (Pfad A: Technical Hygiene, CI Lifecycle & Lock Defense) +### Fixed (Repo Hygiene, T-20260926-510472849) +- Untracked two agent-internal files that a public repo should not publish: `STORE_CONTRACT.md` (internal Store release/versioning bookkeeping) and `_WARTUNG/msix_staging/` (staged MSIX build output). Both stay on disk locally (gitignored), nothing was deleted. `MARKETING-LOG.txt` was considered but is a deliberate public artifact here (`pyproject.toml` project.url, a dedicated test) and stays tracked. +- Rebuilt the parts of the public contract that referenced them: `PRODUCT_BOUNDARIES.md` and `scripts/verify_product_boundaries.py` now cite `STORE_LISTING.md`/`WINDOWS_STORE_PREP.md` only; `tests/test_store_contract.py` checks the same version-consistency invariant against `store_package.json`/`pyproject.toml`/`SoftwareCenter.py`/`STORE_LISTING.md` instead of the untracked files. + ### Hygiene & Governance - Linter Zero-Tolerance: Resolved 7 ruff lint diagnostics (unused imports and import sorting in `SoftwareCenter.py` and `tests/test_ui_accessibility.py`); verified 100% clean across all rule-sets. - Open-Source Attribution: Created canonical root `NOTICE` attribution file (Lukas Geiger, file-bricks, open-bricks umbrella). diff --git a/PRODUCT_BOUNDARIES.md b/PRODUCT_BOUNDARIES.md index 5aa8c52..3e00157 100644 --- a/PRODUCT_BOUNDARIES.md +++ b/PRODUCT_BOUNDARIES.md @@ -17,9 +17,11 @@ identity, or release artifact. | Store metadata | `store_package.json` | `store_package_launchboards.json` | | Local release artifact | versioned SoftwareCenter path | `releases/v1.0.0/LaunchBoards-1.0.0-win64.exe` | -`STORE_CONTRACT.md`, `STORE_LISTING.md`, and `WINDOWS_STORE_PREP.md` remain the -canonical SoftwareCenter Store contract and contain no LaunchBoards identity or -artifact. LaunchBoards metadata is intentionally separate and does not alter +`STORE_LISTING.md` and `WINDOWS_STORE_PREP.md` remain the canonical, public +SoftwareCenter Store contract and contain no LaunchBoards identity or +artifact (the former `STORE_CONTRACT.md` covered the same invariant but was +agent-internal release bookkeeping, untracked per T-20260926-510472849). +LaunchBoards metadata is intentionally separate and does not alter SoftwareCenter release hashes. ## Reproducible verification diff --git a/STORE_CONTRACT.md b/STORE_CONTRACT.md deleted file mode 100644 index 0cb0d5b..0000000 --- a/STORE_CONTRACT.md +++ /dev/null @@ -1,53 +0,0 @@ -# SoftwareCenter Store-Vertrag - -Stand: 2026-08-25 - -## Release- und Artefaktstatus - -Es gibt am 2026-08-25 **keinen gültigen Store-Einreichkandidaten**. Die -Statusquellen werden deshalb ausdrücklich getrennt: - -| Quelle | Readback | Bedeutung | -|---|---|---| -| `pyproject.toml` | `1.2.0` | aktuelle Source-/Build-Linie | -| `SoftwareCenter.py` | `__version__ = 1.2.0` | Runtime-/Exportstand der Quelle | -| `store_package.json` | `1.2.0.0` | kanonischer Store-Metadatenstand | -| `releases/v1.2.0/SoftwareCenter-1.2.0-win64.exe` | SHA-256 `1AD7F9FE5AA89A004402E4F6833A67FBF85810C20B8444B3C634474F0B59C6C7` | lokal, unsigniert, nicht WACK-geprüft | - -Die Versionen sind einheitlich harmonisiert (`1.2.0` / `1.2.0.0`). Privacy-URL, -Support-URL, Publisher, Identity, `runFullTrust` und Kategorie sind in den -Metadaten konsistent. Vor einem Store-Release muss ein frisch signiertes MSIX mit -echtem WACK-Report erstellt werden; aktuell wird kein Signing oder Upload behauptet. - -`store_package.json` ist die kanonische, versionierte Metadatenquelle. Die -lokale Packaging-Einstellung und das Staging-Manifest müssen sie abbilden, nicht -eigenständig abweichen. - -| Feld | Kanonischer Wert | -|---|---| -| App / Identity | `SoftwareCenter` / `Geiger.SoftwareCenter` | -| Publisher | `CN=52596601-BAB4-4F3F-B182-E8F3F273B202` / `Geiger` | -| Version / EXE | `1.2.0.0` / `SoftwareCenter.exe` | -| Capability | `runFullTrust` | -| Ressourcen | `en-us`, `de-de` | -| Kategorie | `Utilities & Tools` | -| Privacy / Support | GitHub `PRIVACY_POLICY.md` / Issues | - -`releases/windowsstore/store_settings.json` ist eine lokale Build-Einstellung -und verwendet für `capabilities` denselben Wert `runFullTrust`. Das -`AppxManifest.xml` führt ihn als `rescap:Capability`. Dieser Abgleich bedeutet -keine Signierung, keinen MSIX-Build und keine Store-Einreichung. - -## Wiederholbarer Readback - -```powershell -python -m json.tool store_package.json -[xml](Get-Content -Raw _WARTUNG/msix_staging/AppxManifest.xml) -``` - -`releases/windowsstore/store_settings.json` ist eine lokale, nicht versionierte -Build-Einstellung und liegt nicht in jedem Arbeitsverzeichnis vor; das -versionierte Staging-Manifest steht unter `_WARTUNG/msix_staging/`. - -Danach Identity, Publisher, Version, `Application/@Executable`, die zwei -Ressourcen und `rescap:Capability/@Name` gegen die Tabelle vergleichen. diff --git a/_WARTUNG/msix_staging/AppxManifest.xml b/_WARTUNG/msix_staging/AppxManifest.xml deleted file mode 100644 index bae2f56..0000000 --- a/_WARTUNG/msix_staging/AppxManifest.xml +++ /dev/null @@ -1,52 +0,0 @@ - - - - - - - SoftwareCenter - Geiger - icons\Square150x150Logo.png - Desktop-App-Organizer und Launcher. Kategorisierung, Schnellstart, Übersicht installierter Software. - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/_WARTUNG/msix_staging/icons/Square150x150Logo.png b/_WARTUNG/msix_staging/icons/Square150x150Logo.png deleted file mode 100644 index 517db3e..0000000 Binary files a/_WARTUNG/msix_staging/icons/Square150x150Logo.png and /dev/null differ diff --git a/_WARTUNG/msix_staging/icons/Square310x310Logo.png b/_WARTUNG/msix_staging/icons/Square310x310Logo.png deleted file mode 100644 index 9fa6ded..0000000 Binary files a/_WARTUNG/msix_staging/icons/Square310x310Logo.png and /dev/null differ diff --git a/_WARTUNG/msix_staging/icons/Square44x44Logo.png b/_WARTUNG/msix_staging/icons/Square44x44Logo.png deleted file mode 100644 index b049759..0000000 Binary files a/_WARTUNG/msix_staging/icons/Square44x44Logo.png and /dev/null differ diff --git a/_WARTUNG/msix_staging/icons/Wide310x150Logo.png b/_WARTUNG/msix_staging/icons/Wide310x150Logo.png deleted file mode 100644 index 2a0b3f4..0000000 Binary files a/_WARTUNG/msix_staging/icons/Wide310x150Logo.png and /dev/null differ diff --git a/scripts/verify_product_boundaries.py b/scripts/verify_product_boundaries.py index 1012e51..dd538f2 100644 --- a/scripts/verify_product_boundaries.py +++ b/scripts/verify_product_boundaries.py @@ -39,7 +39,7 @@ def verify_static_contract() -> dict[str, str]: build_script = (ROOT / "build_exe_launchboards.bat").read_text(encoding="utf-8") software_store_docs = "\n".join( (ROOT / name).read_text(encoding="utf-8") - for name in ("STORE_CONTRACT.md", "STORE_LISTING.md", "WINDOWS_STORE_PREP.md") + for name in ("STORE_LISTING.md", "WINDOWS_STORE_PREP.md") ) assert sc.PROFILE_SOFTWARECENTER.name == "SoftwareCenter" diff --git a/tests/test_store_contract.py b/tests/test_store_contract.py index dc7cd4d..1d6db3e 100644 --- a/tests/test_store_contract.py +++ b/tests/test_store_contract.py @@ -1,4 +1,10 @@ -"""Regression contract for versioned SoftwareCenter Store metadata.""" +"""Regression contract for versioned SoftwareCenter Store metadata. + +STORE_CONTRACT.md and _WARTUNG/msix_staging/ (staged MSIX build output) were +untracked as agent-internal / build-artifact material (T-20260926-510472849, +GITHUB-POLICY.md SS3). This contract now checks only files that stay public: +store_package.json, pyproject.toml, SoftwareCenter.py, and STORE_LISTING.md. +""" import json import re @@ -24,7 +30,6 @@ def _project_version() -> str: def test_store_package_is_the_documented_canonical_contract(): package = json.loads((ROOT / "store_package.json").read_text(encoding="utf-8")) listing = (ROOT / "STORE_LISTING.md").read_text(encoding="utf-8") - contract = (ROOT / "STORE_CONTRACT.md").read_text(encoding="utf-8") assert package["app_name"] == "SoftwareCenter" assert package["publisher"] == "CN=52596601-BAB4-4F3F-B182-E8F3F273B202" @@ -38,8 +43,6 @@ def test_store_package_is_the_documented_canonical_contract(): assert package["support_url"].endswith("/issues") assert "### Category\nUtilities & Tools" in listing - assert "`store_package.json` ist die kanonische" in contract - assert "`runFullTrust`" in contract def test_version_is_identical_in_every_store_relevant_source(): @@ -54,12 +57,5 @@ def test_version_is_identical_in_every_store_relevant_source(): assert runtime == project, f"SoftwareCenter.py {runtime} != pyproject.toml {project}" assert package["version"] == four_part - manifest = (ROOT / "_WARTUNG" / "msix_staging" / "AppxManifest.xml").read_text( - encoding="utf-8-sig" - ) - assert f'Version="{four_part}"' in manifest - - contract = (ROOT / "STORE_CONTRACT.md").read_text(encoding="utf-8") listing = (ROOT / "STORE_LISTING.md").read_text(encoding="utf-8") - assert f"`{four_part}`" in contract assert f"| Version | {four_part} |" in listing