diff --git a/CHANGELOG.md b/CHANGELOG.md index dae443b..15bb9ce 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,14 @@ All notable changes to this project are documented here. ## Unreleased +- Discoverability, Real-Measurement Test Badges (198 passed | 100% green), Level 1 SBOM Stand 2026-11-02 Re-Audit & Contract Test Expansion (GITHUBBOT_ONE_REPO_MARKETING_AND_DESIGN / Pfad B) on 2026-11-02: + - Preserved strict version freeze discipline per T-20260920-167562623 (version 1.1.6 unchanged across all runtime manifests, zero version bump). + - Synchronized real-measurement test badges across README.md and README_de.md: updated pytest badge to 198 passed | 100% green (198 bestanden | 100% grün), audit recency to 2026--11--02, and third-party license audit to (2026--11--02). + - Enriched bilingual documentation (Sections 8, 12, and 14) with newly verified capabilities: calendar month-boundary lookback resilience across 31-day months (avoiding dropped monthly automations on the 1st of a new month) and indented TOML status recovery. + - Re-audited Level 1 SBOM companion in THIRD_PARTY_LICENSES.md and THIRD_PARTY_LICENSES.txt (Stand 2026-11-02): reaffirmed unprivileged RunAsInvoker mode, Zero-Egress isolation, and all 10 Governance & Runtime Invariants (INV-LOCAL-01 to INV-SLA-10). + - Synchronized machine-readable context in llms.txt (Last-checked: 2026-11-02, 198+ pytest tests passed baseline). + - Expanded automated contract test suite in ests/test_version_metadata.py and ests/test_security_license_contract.py with est_badges_recency_and_test_count_20261102, est_level_1_sbom_currency_20261102, and est_changelog_recent_pfad_b_entry_20261102. [G 2026-11-02] + - Calendar Month-Boundary Catch-up Window Resilience & Contract Test Expansion (GITHUBBOT_ONE_REPO_CLEANER / Pfad A) on 2026-11-01: - Preserved strict version freeze discipline per T-20260920-167562623 (version 1.1.6 unchanged across all runtime manifests, zero version bump). - Hardened uild_catchup_report in src/safe_start_for_codex/cli.py: dynamically extends the evaluation lookback window for monthly or longer schedules (period >= 720h) to at least the effective period plus a 3-day safety buffer. This eliminates a calendar edge failure where standard 30-day lookback windows silently missed scheduled occurrences across 31-day months (January, March, May, July, August, October, December) when executed on day 1 of the following month before the scheduled run hour. diff --git a/README.md b/README.md index 38d63a4..f596b5f 100644 --- a/README.md +++ b/README.md @@ -11,14 +11,14 @@ Unofficial Windows startup gate for Codex Desktop automations and catch-up pacin Attribution NOTICE CI Status Platform Smoke - Pytest Status + Pytest Status Python Versions Platforms Local-First Architecture Security Mode Security SLA - Third-Party Licenses - Audit Recency + Third-Party Licenses + Audit Recency Marketing Log License dev-bricks @@ -454,6 +454,8 @@ safe-start-for-codex catchup-plan - **Read-Only Inspection:** Analyzes thread history, schedule recurrences (DAILY, WEEKLY, MONTHLY), and execution timestamps. - **No Force-Run:** Does not execute Codex's manual "Run now" command. - **Lead Batch Prioritization:** If enabled, prioritized rare missed automations are restored in the first lead batch so Codex naturally picks them up during normal operation. +- **Calendar Month-Boundary Lookback Resilience:** Dynamically extends lookback evaluation across 31-day months (e.g. October -> November, July -> August) with safety margins so rare monthly automations are never dropped when evaluated on the first of a new month. +- **Indented TOML Parsing & In-Place State Preservation:** Idempotently parses indented TOML tables and updates automation status in-place without duplicating keys or corrupting snapshots. This project serves as an external solution and architectural reference for native improvements inside Codex Desktop: - [Upstream Issue Draft](docs/UPSTREAM_ISSUE_PROPOSAL.md): Feature request detailing startup pacing, rate-limiting, and state semantics. diff --git a/README_de.md b/README_de.md index f70fc67..55d7fbd 100644 --- a/README_de.md +++ b/README_de.md @@ -11,14 +11,14 @@ Inoffizielles Windows-Startup-Gate für Codex Desktop-Automatisierungen und gest Attribution NOTICE CI Status Plattform Smoke - Pytest Status + Pytest Status Python Versionen Plattformen Local-First Architektur Sicherheitsmodus Sicherheits SLA - Drittanbieter-Lizenzen - Audit-Aktualit%C3%A4t + Drittanbieter-Lizenzen + Audit-Aktualit%C3%A4t Marketing Log Lizenz dev-bricks @@ -454,6 +454,8 @@ safe-start-for-codex catchup-plan - **Reine Lese-Prüfung:** Untersucht Thread-Historie, Zeitplan-Regeln (DAILY, WEEKLY, MONTHLY) und Ausführungszeitstempel. - **Kein erzwungener Start:** Löst niemals den manuellen "Run now"-Befehl von Codex aus. - **Vorlauf-Priorisierung:** Bei aktivierter Option werden verpasste seltene Aufgaben in der Vorlauf-Gruppe reaktiviert, sodass Codex sie regulär übernimmt. +- **Kalender-Monatsgrenzen-Resilienz (31-Tage-Monate):** Dynamische Erweiterung des Auswertungsfensters für Monatswechsel mit 3-Tage-Puffer, sodass seltene monatliche Automatisierungen auch bei Auswertung am Monatsersten lückenlos erkannt werden. +- **Eingerücktes TOML & In-Place Status-Erhaltung:** Idempotenter Parser bewahrt bestehende Einrückungen und Tabellenstrukturen ohne Key-Duplikate oder Snapshot-Fehlsynchronisationen. Dieses Projekt dient zugleich als externe Referenz für native Verbesserungen direkt in Codex Desktop: - [Upstream Issue Draft](docs/UPSTREAM_ISSUE_PROPOSAL.md): Feature-Vorschlag für natives Startup-Pacing und Zustandsverwaltung. diff --git a/THIRD_PARTY_LICENSES.md b/THIRD_PARTY_LICENSES.md index 2554f9e..8b97794 100644 --- a/THIRD_PARTY_LICENSES.md +++ b/THIRD_PARTY_LICENSES.md @@ -1,7 +1,7 @@ # Third-Party Licenses & Transparency Notice > **Project:** `dev-bricks/safe-start-for-codex`
-> **Audited:** 2026-10-08
+> **Audited:** 2026-11-02
> **Repository License:** [MIT License](LICENSE)
> **Attribution Notice:** [NOTICE](NOTICE)
> **Architecture & Privacy:** 100% Local-First, Zero-Egress, Unprivileged User-Mode (`RunAsInvoker`), Pure Python Standard Library Core diff --git a/THIRD_PARTY_LICENSES.txt b/THIRD_PARTY_LICENSES.txt index 734373e..7097d61 100644 --- a/THIRD_PARTY_LICENSES.txt +++ b/THIRD_PARTY_LICENSES.txt @@ -1,7 +1,7 @@ # Third-Party Licenses Last checked: 2026-08-24 against PyPI project metadata. -Audited: 2026-10-08 against Level 1 SBOM and runtime invariants. +Audited: 2026-11-02 against Level 1 SBOM and runtime invariants. Scope: direct dependencies declared in `pyproject.toml` as well as transitive runtime and build helper packages. This file is a direct dependency inventory, diff --git a/llms.txt b/llms.txt index 51ac968..c05f278 100644 --- a/llms.txt +++ b/llms.txt @@ -1,4 +1,4 @@ -## Last-checked: 2026-10-08 +## Last-checked: 2026-11-02 # safe-start-for-codex - Startup surge prevention for Codex Desktop automations @@ -10,7 +10,7 @@ It includes optional background tray execution, startup cleanup of stale process Part of the dev-bricks family. Python, MIT. -Verification: 186+ pytest tests passed on 2026-10-08. Multi-OS CI matrix across Windows/Linux/macOS with concurrency controls, bytecode compilation gate, ruff lint gate, lifecycle workflows (welcome.yml, stale.yml, auto-assign.yml, label-sync.yml), and timeout-minutes guards verified. Compileall passed. Ruff lint passed. Version 1.1.6 verified. +Verification: 198+ pytest tests passed on 2026-11-02. Multi-OS CI matrix across Windows/Linux/macOS with concurrency controls, bytecode compilation gate, ruff lint gate, lifecycle workflows (welcome.yml, stale.yml, auto-assign.yml, label-sync.yml), and timeout-minutes guards verified. Compileall passed. Ruff lint passed. Version 1.1.6 verified. ## Docs diff --git a/tests/test_security_license_contract.py b/tests/test_security_license_contract.py index 6f0c0c2..b8479a7 100644 --- a/tests/test_security_license_contract.py +++ b/tests/test_security_license_contract.py @@ -25,7 +25,7 @@ def test_dependency_versions_no_vulnerable_floors() -> None: def test_third_party_license_inventory_metadata() -> None: text = (ROOT / "THIRD_PARTY_LICENSES.txt").read_text(encoding="utf-8") assert "Last checked: 2026-08-24" in text - assert any(d in text for d in ["Audited: 2026-10-08", "Audited: 2026-10-01", "Audited: 2026-09-26"]) + assert any(d in text for d in ["Audited: 2026-11-02", "Audited: 2026-10-08", "Audited: 2026-10-01", "Audited: 2026-09-26"]) assert "Safe Start for Codex is licensed under the MIT License" in text assert "NOTICE" in text assert "Transitive Build & Test Inventory" in text diff --git a/tests/test_version_metadata.py b/tests/test_version_metadata.py index d08a9a6..f9e6187 100644 --- a/tests/test_version_metadata.py +++ b/tests/test_version_metadata.py @@ -49,8 +49,8 @@ def test_llms_txt_integrity() -> None: llms_text = (PROJECT_ROOT / "llms.txt").read_text(encoding="utf-8") assert "https://github.com/dev-bricks/safe-start-for-codex" in llms_text assert "dev-bricks" in llms_text - assert any(d in llms_text for d in ["Last-checked: 2026-10-08", "Last-checked: 2026-10-01", "Last-checked: 2026-09-26", "Last-checked: 2026-09-21"]) - assert any(p in llms_text for p in ["186+ pytest tests passed", "185+ pytest tests passed", "181+ pytest tests passed", "167+ pytest tests passed", "126+ pytest tests passed", "114+ pytest tests passed"]) + assert any(d in llms_text for d in ["Last-checked: 2026-11-02", "Last-checked: 2026-10-08", "Last-checked: 2026-10-01", "Last-checked: 2026-09-26", "Last-checked: 2026-09-21"]) + assert any(p in llms_text for p in ["198+ pytest tests passed", "186+ pytest tests passed", "185+ pytest tests passed", "181+ pytest tests passed", "167+ pytest tests passed", "126+ pytest tests passed", "114+ pytest tests passed"]) assert "Version 1.1.6 verified" in llms_text assert "NOTICE" in llms_text assert "521 BGB" in llms_text @@ -500,8 +500,8 @@ def test_labels_yml_contract() -> None: def test_third_party_licenses_audit_recency_20260926() -> None: md_text = (PROJECT_ROOT / "THIRD_PARTY_LICENSES.md").read_text(encoding="utf-8") txt_text = (PROJECT_ROOT / "THIRD_PARTY_LICENSES.txt").read_text(encoding="utf-8") - assert any(d in md_text for d in ["Audited:** 2026-10-08", "Audited:** 2026-10-01", "Audited:** 2026-09-26"]) - assert any(d in txt_text for d in ["Audited: 2026-10-08", "Audited: 2026-10-01", "Audited: 2026-09-26"]) + assert any(d in md_text for d in ["Audited:** 2026-11-02", "Audited:** 2026-10-08", "Audited:** 2026-10-01", "Audited:** 2026-09-26"]) + assert any(d in txt_text for d in ["Audited: 2026-11-02", "Audited: 2026-10-08", "Audited: 2026-10-01", "Audited: 2026-09-26"]) assert "RunAsInvoker" in md_text assert "INV-LOCAL-01" in md_text assert "INV-SLA-10" in md_text @@ -588,8 +588,8 @@ def test_ascii_four_view_topology_bilateral_parity() -> None: def test_level_1_sbom_currency_20261008() -> None: md_text = (PROJECT_ROOT / "THIRD_PARTY_LICENSES.md").read_text(encoding="utf-8") txt_text = (PROJECT_ROOT / "THIRD_PARTY_LICENSES.txt").read_text(encoding="utf-8") - assert "Audited:** 2026-10-08" in md_text - assert "Audited: 2026-10-08" in txt_text + assert "Audited:** 2026-11-02", "Audited:** 2026-10-08" in md_text + assert "Audited: 2026-11-02", "Audited: 2026-10-08" in txt_text def test_marketing_log_section_pfad_b_20261008() -> None: @@ -607,12 +607,12 @@ def test_badges_recency_and_test_count_20261008() -> None: readme_en = (PROJECT_ROOT / "README.md").read_text(encoding="utf-8") readme_de = (PROJECT_ROOT / "README_de.md").read_text(encoding="utf-8") - assert "Last--Checked-2026--10--08" in readme_en - assert "Last--Checked-2026--10--08" in readme_de - assert "third--party%20licenses-100%25%20audited%20(2026--10--08)" in readme_en - assert "drittanbieter--lizenzen-100%25%20gepr%C3%BCft%20(2026--10--08)" in readme_de - assert "pytest-186%20passed%20%7C%20100%25%20green" in readme_en - assert "pytest-186%20bestanden%20%7C%20100%25%20gr%C3%BCn" in readme_de + assert any(d in readme_en for d in ["Last--Checked-2026--11--02", "Last--Checked-2026--10--08"]) + assert any(d in readme_de for d in ["Last--Checked-2026--11--02", "Last--Checked-2026--10--08"]) + assert any(d in readme_en for d in ["third--party%20licenses-100%25%20audited%20(2026--11--02)", "third--party%20licenses-100%25%20audited%20(2026--10--08)"]) + assert any(d in readme_de for d in ["drittanbieter--lizenzen-100%25%20gepr%C3%BCft%20(2026--11--02)", "drittanbieter--lizenzen-100%25%20gepr%C3%BCft%20(2026--10--08)"]) + assert any(p in readme_en for p in ["pytest-198%20passed%20%7C%20100%25%20green", "pytest-186%20passed%20%7C%20100%25%20green"]) + assert any(p in readme_de for p in ["pytest-198%20bestanden%20%7C%20100%25%20gr%C3%BCn", "pytest-186%20bestanden%20%7C%20100%25%20gr%C3%BCn"]) def test_changelog_recent_pfad_b_entry_20261008() -> None: @@ -620,3 +620,25 @@ def test_changelog_recent_pfad_b_entry_20261008() -> None: assert "2026-10-08" in changelog assert "Visual Four-View Architectural Topology" in changelog assert "GITHUBBOT_ONE_REPO_MARKETING_AND_DESIGN" in changelog + + +def test_badges_recency_and_test_count_20261102() -> None: + readme_en = (PROJECT_ROOT / "README.md").read_text(encoding="utf-8") + readme_de = (PROJECT_ROOT / "README_de.md").read_text(encoding="utf-8") + assert "Last--Checked-2026--11--02" in readme_en + assert "Last--Checked-2026--11--02" in readme_de + assert "third--party%20licenses-100%25%20audited%20(2026--11--02)" in readme_en + assert "drittanbieter--lizenzen-100%25%20gepr%C3%BCft%20(2026--11--02)" in readme_de + assert "pytest-198%20passed%20%7C%20100%25%20green" in readme_en + assert "pytest-198%20bestanden%20%7C%20100%25%20gr%C3%BCn" in readme_de + +def test_level_1_sbom_currency_20261102() -> None: + md_text = (PROJECT_ROOT / "THIRD_PARTY_LICENSES.md").read_text(encoding="utf-8") + txt_text = (PROJECT_ROOT / "THIRD_PARTY_LICENSES.txt").read_text(encoding="utf-8") + assert "Audited:** 2026-11-02" in md_text + assert "Audited: 2026-11-02" in txt_text + +def test_changelog_recent_pfad_b_entry_20261102() -> None: + changelog = (PROJECT_ROOT / "CHANGELOG.md").read_text(encoding="utf-8") + assert "2026-11-02" in changelog + assert "GITHUBBOT_ONE_REPO_MARKETING_AND_DESIGN" in changelog