From dd8cf3b459e45273ee099b3ec26248c38b8463d3 Mon Sep 17 00:00:00 2001 From: Thorsten Hindermann Date: Sat, 26 Sep 2026 22:18:30 +0200 Subject: [PATCH 1/3] fix: sync reviewed maintenance scripts --- .../install-spec-kit-governance-presets.1.md | 13 +++++ .../install-spec-kit-governance-presets.ps1 | 33 ++++++++++-- scripts/maintain-agentic-brew-apps.sh | 15 +++--- .../tests/test_linux_maintenance_hardening.py | 54 +++++++++++++++++-- 4 files changed, 101 insertions(+), 14 deletions(-) diff --git a/docs/man/install-spec-kit-governance-presets.1.md b/docs/man/install-spec-kit-governance-presets.1.md index 6a078312..f0bd6654 100644 --- a/docs/man/install-spec-kit-governance-presets.1.md +++ b/docs/man/install-spec-kit-governance-presets.1.md @@ -47,6 +47,19 @@ blocking local Git hooks; semantic content remains unchanged.* ## Optionen / Options +Unter PowerShell erzwingt der Installer UTF-8 fuer die Standard- und +Fehlerausgabe jedes `specify`-Aufrufs. Damit scheitern Statuszeichen wie das +Haekchen auch in umgeleiteten Windows-Logs nicht an CP1252. Prozessumgebung +und Konsolen-Ausgabecodierung werden auch bei Fehlern wiederhergestellt; +Benutzer- und Systemeinstellungen bleiben unveraendert. CLI-Fehler brechen +weiterhin ab, auch beim Ermitteln bereits installierter Presets. + +*Under PowerShell, the installer forces UTF-8 for stdout and stderr of each +`specify` call, preventing status symbols from failing with CP1252 in redirected +Windows logs. Process environment and console output encoding are restored +even after failure; user and system settings are unchanged. CLI failures still +abort, including failures while detecting installed presets.* + | Bash | PowerShell | Bedeutung / Meaning | |---|---|---| | `--repo PATH` | `-Repo PATH` | Ziel-Repository; wiederholbar | diff --git a/scripts/install-spec-kit-governance-presets.ps1 b/scripts/install-spec-kit-governance-presets.ps1 index fa1da9a3..f1e89d43 100644 --- a/scripts/install-spec-kit-governance-presets.ps1 +++ b/scripts/install-spec-kit-governance-presets.ps1 @@ -19,6 +19,12 @@ The matrix is the only place where preset versions and priorities are maintained Use -WhatIf to preview actions and -Force to reinstall existing presets from the current matrix. +Die specify-Unterprozesse verwenden UTF-8 fuer Standardausgabe und Fehlerausgabe, +auch bei umgeleiteten Windows-Logs. Die vorherige Prozessumgebung bleibt erhalten. + +The specify child processes use UTF-8 for stdout and stderr, including redirected +Windows logs. The previous process environment is restored after each call. + .PARAMETER Repo Ziel-Repository. Kann mehrfach uebergeben werden. Standard ist das aktuelle Verzeichnis. @@ -78,6 +84,26 @@ function Resolve-HBPath { return $Path } +function Invoke-SpecifyUtf8 { + param([string[]]$Arguments) + + $previousEncoding = [Environment]::GetEnvironmentVariable('PYTHONIOENCODING', 'Process') + $previousOutputEncoding = [Console]::OutputEncoding + try { + # Redirected Python output can default to CP1252 on Windows. A status + # symbol must not abort removal before the replacement preset is added. + $env:PYTHONIOENCODING = 'utf-8' + [Console]::OutputEncoding = [System.Text.UTF8Encoding]::new($false) + & specify @Arguments + if ($LASTEXITCODE -ne 0) { + throw "specify $($Arguments -join ' ') failed in ${PWD} (exit ${LASTEXITCODE})" + } + } finally { + [Environment]::SetEnvironmentVariable('PYTHONIOENCODING', $previousEncoding, 'Process') + [Console]::OutputEncoding = $previousOutputEncoding + } +} + function Test-PresetInstalled { param( [string]$Repository, @@ -86,7 +112,7 @@ function Test-PresetInstalled { Push-Location $Repository try { - $listOutput = (specify preset list 2>$null | Out-String) + $listOutput = (Invoke-SpecifyUtf8 -Arguments @('preset', 'list') | Out-String) return $listOutput -match "\($([regex]::Escape($PresetId))\)" } finally { Pop-Location @@ -103,10 +129,7 @@ function Invoke-PresetCommand { if ($PSCmdlet.ShouldProcess($Repository, $Description)) { Push-Location $Repository try { - & specify @Arguments - if ($LASTEXITCODE -ne 0) { - throw "specify $($Arguments -join ' ') failed in ${Repository}" - } + Invoke-SpecifyUtf8 -Arguments $Arguments } finally { Pop-Location } diff --git a/scripts/maintain-agentic-brew-apps.sh b/scripts/maintain-agentic-brew-apps.sh index 9cbc21ef..dac98d48 100755 --- a/scripts/maintain-agentic-brew-apps.sh +++ b/scripts/maintain-agentic-brew-apps.sh @@ -528,20 +528,23 @@ installed_registry_formulae() { } installed_requested_formulae() { - local inventory - inventory="$(brew info --json=v2 --installed 2>/dev/null)" || inventory='{"formulae":[]}' - python3 - "$inventory" <<'PY' + # Stream metadata: large inventories exceed Linux's per-argument size limit. + { + if ! brew info --json=v2 --installed 2>/dev/null; then + printf '%s\n' '{"formulae":[]}' + fi + } | python3 -c ' import json import sys try: - data = json.loads(sys.argv[1] or '{"formulae":[]}') -except (json.JSONDecodeError, TypeError): + data = json.load(sys.stdin) +except (json.JSONDecodeError, TypeError, UnicodeDecodeError): data = {"formulae": []} for formula in data.get("formulae", []): if any(item.get("installed_on_request") for item in formula.get("installed", [])): print(formula["full_name"]) -PY +' } installed_casks() { diff --git a/scripts/tests/test_linux_maintenance_hardening.py b/scripts/tests/test_linux_maintenance_hardening.py index c612ee21..c66d95ab 100644 --- a/scripts/tests/test_linux_maintenance_hardening.py +++ b/scripts/tests/test_linux_maintenance_hardening.py @@ -82,7 +82,11 @@ def install_fake_brew(root: Path) -> tuple[Path, Path, Path]: fi ;; info) - printf '{"formulae":[]}\n' + if [ -n "${HB_TEST_BREW_INFO_FILE:-}" ]; then + cat -- "$HB_TEST_BREW_INFO_FILE" + else + printf '{"formulae":[]}\n' + fi ;; install) item="${2:-}" @@ -103,6 +107,9 @@ def install_fake_brew(root: Path) -> tuple[Path, Path, Path]: esac """, ) + # Keep every toolchain fixture independent from the host PowerShell setup. + # The module registry is empty, so an unavailable optional probe is expected. + write_executable(bin_dir / "pwsh", "#!/usr/bin/env bash\nexit 1\n") return bin_dir, state, log @@ -290,8 +297,7 @@ def test_empty_optional_module_probe_still_publishes_one_valid_result(self) -> N with tempfile.TemporaryDirectory() as directory: root = Path(directory) paths = empty_registries(root) - bin_dir, _, _ = install_fake_brew(root) - write_executable(bin_dir / "pwsh", "#!/usr/bin/env bash\nexit 1\n") + install_fake_brew(root) completed = run_brew_maintainer(root, paths) @@ -386,6 +392,48 @@ def test_stdin_consuming_brew_processes_all_formulae_once(self) -> None: ["alpha", "beta", "gamma"], ) + def test_large_brew_inventory_is_streamed_without_argument_overflow(self) -> None: + with tempfile.TemporaryDirectory() as directory: + root = Path(directory) + paths = empty_registries(root) + _, state, _ = install_fake_brew(root) + formula = "fixture/requested" + state.write_text(f"{formula}\n", encoding="utf-8") + write_json( + paths["brew"], + { + "schemaVersion": 1, + "formulae": [{"name": formula, "scope": "required"}], + "casks": [], + "aptFallback": {"packages": []}, + }, + ) + inventory = root / "large-brew-inventory.json" + write_json( + inventory, + { + "formulae": [ + { + "full_name": formula if index == 0 else f"fixture/dependency-{index}", + "installed": [{"installed_on_request": index == 0}], + "metadata": "x" * 1024, + } + for index in range(256) + ] + }, + ) + self.assertGreater(inventory.stat().st_size, 128 * 1024) + + completed = run_brew_maintainer( + root, + paths, + environment_updates={"HB_TEST_BREW_INFO_FILE": str(inventory)}, + ) + + self.assertEqual(completed.returncode, 0, completed.stdout) + self.assertNotIn("Argument list too long", completed.stdout) + self.assertIn("missing_from_registry.formulae: none", completed.stdout) + def test_required_cli_drift_fails_but_optional_only_does_not(self) -> None: with tempfile.TemporaryDirectory() as directory: root = Path(directory) From 4fdf3c2497ebb1ab6bbbe778d37a8eaf0d70a2f8 Mon Sep 17 00:00:00 2001 From: Thorsten Hindermann Date: Sat, 26 Sep 2026 22:19:14 +0200 Subject: [PATCH 2/3] docs: refresh statistics after maintenance sync --- docs/project-statistics.md | 46 +++++++++++++++++++------------------- 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/docs/project-statistics.md b/docs/project-statistics.md index 4311ab8b..2f6e0a6a 100644 --- a/docs/project-statistics.md +++ b/docs/project-statistics.md @@ -1153,26 +1153,26 @@ Profil 2 verwendet Git-getrackte Textdateien und sichtbare Git-Aktivitaet. Die W | Kennzahl / Metric | Wert / Value | |---|---:| -| Textbasis / Text base | 751599 lines | +| Textbasis / Text base | 751686 lines | | Textdateien / Text files | 3487 | -| Beobachtbarer Zeitraum / Observable period | 2025-09-28..2026-09-20 | -| Aktivtage / Active days | 99 | -| Relevante Commits / Relevant commits | 621 | -| Zeilen je Aktivtag / Lines per active day | 7591.9 | +| Beobachtbarer Zeitraum / Observable period | 2025-09-28..2026-09-26 | +| Aktivtage / Active days | 100 | +| Relevante Commits / Relevant commits | 622 | +| Zeilen je Aktivtag / Lines per active day | 7516.9 | | Peak-Tag im Fenster / Peak day in window | 2026-03-22 / 321183 | | Peak-Woche im Fenster / Peak week in window | 2026-03-22 / 373576 | | Laengste Serie / Longest streak | 17 days | -| Speedup vs. 80 lines/day | 94.9x | -| Speedup vs. 125 lines/day | 60.7x | -| Methodik / Methodology | v2; source `05eeb6b688dd` | +| Speedup vs. 80 lines/day | 94.0x | +| Speedup vs. 125 lines/day | 60.1x | +| Methodik / Methodology | v2; source `dd8cf3b459e4` | ### Artefaktmix / Artifact Mix ```text Produktiv / Production [####................] 18.6% | 140068 -Tests [#...................] 7.3% | 55139 -Dokumentation / Documentation [##########..........] 51.1% | 384438 -Skripte / Scripts [#...................] 3.8% | 28923 +Tests [#...................] 7.3% | 55187 +Dokumentation / Documentation [##########..........] 51.1% | 384451 +Skripte / Scripts [#...................] 3.9% | 28949 Konfiguration / Configuration [#...................] 5.7% | 43165 Daten und Medien / Data and media [#...................] 0.0% | 1 Sonstiger Text / Other text [###.................] 13.3% | 99865 @@ -1198,12 +1198,12 @@ Sa/Sa 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 4 ```text Wochen / Weeks 27..52 | 2026-03-29..2026-09-26 So/Su 4 0 4 0 0 4 4 0 0 4 0 4 0 0 0 4 4 4 1 4 4 0 4 0 4 4 -Mo/Mo 4 0 1 4 0 4 0 0 0 1 0 2 0 3 1 4 4 0 0 0 2 0 0 4 0 - -Di/Tu 4 0 0 0 0 3 4 0 3 2 0 0 0 2 0 4 4 4 0 0 0 0 0 4 0 - -Mi/We 0 0 0 3 0 4 1 0 0 2 0 4 0 2 0 4 2 4 0 0 0 0 0 0 0 - -Do/Th 0 0 0 0 4 0 0 3 3 3 4 2 0 0 0 4 4 0 0 4 0 0 0 0 0 - -Fr/Fr 4 0 2 4 0 3 1 4 3 0 0 3 2 3 4 4 4 1 0 0 0 0 0 0 0 - -Sa/Sa 0 0 0 0 4 4 0 0 4 0 4 4 0 4 4 2 4 2 4 2 0 4 0 4 4 - +Mo/Mo 4 0 1 4 0 4 0 0 0 1 0 2 0 3 1 4 4 0 0 0 2 0 0 4 0 0 +Di/Tu 4 0 0 0 0 3 4 0 3 2 0 0 0 2 0 4 4 4 0 0 0 0 0 4 0 0 +Mi/We 0 0 0 3 0 4 1 0 0 2 0 4 0 2 0 4 2 4 0 0 0 0 0 0 0 0 +Do/Th 0 0 0 0 4 0 0 3 3 3 4 2 0 0 0 4 4 0 0 4 0 0 0 0 0 0 +Fr/Fr 4 0 2 4 0 3 1 4 3 0 0 3 2 3 4 4 4 1 0 0 0 0 0 0 0 0 +Sa/Sa 0 0 0 0 4 4 0 0 4 0 4 4 0 4 4 2 4 2 4 2 0 4 0 4 4 2 ``` DE: 0 = keine Aenderung; 1 = 1..79; 2 = 80..399; 3 = 400..1599; 4 = 1600+ geaenderte Textzeilen; - = noch nicht abgelaufen. @@ -1376,8 +1376,8 @@ Die festen Slots halten den Phasenvergleich auch bei fehlenden oder spaeter erga ```text Scale: 0..100x -80 lines/day [###################.] 94.9x -125 lines/day [############........] 60.7x +80 lines/day [###################.] 94.0x +125 lines/day [############........] 60.1x ``` Die Faktoren vergleichen sichtbare Lieferdichte mit den dokumentierten manuellen Referenzen. Sie messen keine Arbeitszeit. @@ -1390,7 +1390,7 @@ Die Faktoren vergleichen sichtbare Lieferdichte mit den dokumentierten manuellen Scale: 0..10000 lines/day Experienced manual [#...................] 80 Thorsten solo [#...................] 125 -Visible repository [###############.....] 7591.9 +Visible repository [###############.....] 7516.9 ``` Die gemeinsame Skala vergleicht Referenzen und sichtbare Lieferdichte. Sie schreibt die Git-Aktivitaet keiner Person oder KI pauschal zu. @@ -1399,9 +1399,9 @@ Die gemeinsame Skala vergleicht Referenzen und sichtbare Lieferdichte. Sie schre ### Textalternative / Text Alternative -DE: Das Fenster beginnt am 2025-09-28 und endet am 2026-09-20. Es enthaelt 99 aktive und 259 inaktive vergangene Tage. Peak-Tag: 2026-03-22 / 321183. Peak-Woche: 2026-03-22 / 373576. Laengste Serie: 17 Tage (2026-07-10..2026-07-26). +DE: Das Fenster beginnt am 2025-09-28 und endet am 2026-09-26. Es enthaelt 100 aktive und 264 inaktive vergangene Tage. Peak-Tag: 2026-03-22 / 321183. Peak-Woche: 2026-03-22 / 373576. Laengste Serie: 17 Tage (2026-07-10..2026-07-26). -*EN: The window starts on 2025-09-28 and ends on 2026-09-20. It contains 99 active and 259 inactive elapsed days. Peak day: 2026-03-22 / 321183. Peak week: 2026-03-22 / 373576. Longest streak: 17 days (2026-07-10..2026-07-26).* +*EN: The window starts on 2025-09-28 and ends on 2026-09-26. It contains 100 active and 264 inactive elapsed days. Peak day: 2026-03-22 / 321183. Peak week: 2026-03-22 / 373576. Longest streak: 17 days (2026-07-10..2026-07-26).* | Monat / Month | Geaenderte Textzeilen / Changed text lines | |---|---:| @@ -1416,6 +1416,6 @@ DE: Das Fenster beginnt am 2025-09-28 und endet am 2026-09-20. Es enthaelt 99 ak | 2026-06 | 42176 | | 2026-07 | 205615 | | 2026-08 | 122136 | -| 2026-09 | 53040 | +| 2026-09 | 53155 | From 682484cd5e88b661b963b71e94db69280e189faf Mon Sep 17 00:00:00 2001 From: Thorsten Hindermann Date: Sat, 26 Sep 2026 22:26:16 +0200 Subject: [PATCH 3/3] docs: refresh pilot statistics after maintenance sync --- docs/project-statistics/report.md | 27 ++++++++++++++------------- docs/project-statistics/snapshot.json | 2 +- 2 files changed, 15 insertions(+), 14 deletions(-) diff --git a/docs/project-statistics/report.md b/docs/project-statistics/report.md index 9bd41b18..d9cf4589 100644 --- a/docs/project-statistics/report.md +++ b/docs/project-statistics/report.md @@ -10,23 +10,23 @@ Git-bound inventory and activity; not a measure of quality, learning performance | Kennzahl / Metric | Wert / Value | | --- | --- | | Textdateien / Text files | 3487 | -| Textzeilen / Text lines | 751599 | -| Aktivtage / Active days | 98 | -| Stichtag / As of | 2026-09-20 | +| Textzeilen / Text lines | 751686 | +| Aktivtage / Active days | 99 | +| Stichtag / As of | 2026-09-26 | | Fensterbeginn / Window start | 2025-09-28 | | Zeitzone / Time zone | UTC | Quellrevision / Source revision: -05eeb6b688dd87e577b565f9555b8f39e05b4d99 +dd8cf3b459e45273ee099b3ec26248c38b8463d3 ### Artefakte / Artifacts | Kategorie / Category | Dateien / Files | Zeilen / Lines | | --- | ---: | ---: | | Production | 854 | 140068 | -| Tests | 429 | 55139 | -| Documentation | 1600 | 384438 | -| Scripts | 136 | 28923 | +| Tests | 429 | 55187 | +| Documentation | 1600 | 384451 | +| Scripts | 136 | 28949 | | Configuration | 139 | 43165 | | DataMedia | 1 | 1 | | Other | 328 | 99865 | @@ -51,12 +51,12 @@ Sa/Sa 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 4 ```text Wochen / Weeks 27..52 | 2026-03-29..2026-09-26 So/Su 4 0 2 0 0 0 4 0 0 3 0 4 0 0 0 4 4 4 1 4 0 0 4 0 4 3 -Mo/Mo 4 0 1 4 0 4 0 0 0 1 0 2 0 3 1 4 0 0 0 0 2 0 0 4 0 - -Di/Tu 2 0 0 0 0 3 4 0 3 2 0 0 0 2 0 4 4 4 0 0 0 0 0 4 0 - -Mi/We 0 0 0 3 0 4 1 0 0 2 0 4 0 2 0 4 2 4 0 0 0 0 0 0 0 - -Do/Th 4 0 0 0 4 0 0 3 3 3 4 2 0 0 0 4 4 0 0 4 0 0 0 0 0 - -Fr/Fr 0 0 2 4 0 4 1 4 3 0 0 4 2 3 4 4 4 1 0 0 0 4 0 0 0 - -Sa/Sa 0 4 0 0 4 4 0 0 4 0 4 3 0 4 4 2 4 2 4 4 0 4 0 4 4 - +Mo/Mo 4 0 1 4 0 4 0 0 0 1 0 2 0 3 1 4 0 0 0 0 2 0 0 4 0 0 +Di/Tu 2 0 0 0 0 3 4 0 3 2 0 0 0 2 0 4 4 4 0 0 0 0 0 4 0 0 +Mi/We 0 0 0 3 0 4 1 0 0 2 0 4 0 2 0 4 2 4 0 0 0 0 0 0 0 0 +Do/Th 4 0 0 0 4 0 0 3 3 3 4 2 0 0 0 4 4 0 0 4 0 0 0 0 0 0 +Fr/Fr 0 0 2 4 0 4 1 4 3 0 0 4 2 3 4 4 4 1 0 0 0 4 0 0 0 0 +Sa/Sa 0 4 0 0 4 4 0 0 4 0 4 3 0 4 4 2 4 2 4 4 0 4 0 4 4 2 ``` | Datum / Date | Hinzu / Added | Entfernt / Removed | @@ -159,6 +159,7 @@ Sa/Sa 0 4 0 0 4 4 0 0 4 0 4 3 0 4 4 2 4 2 4 4 0 4 0 4 4 - | 2026-09-13 | 18458 | 1438 | | 2026-09-19 | 7250 | 162 | | 2026-09-20 | 1374 | 31 | +| 2026-09-26 | 101 | 14 | ### Abdeckung / Coverage diff --git a/docs/project-statistics/snapshot.json b/docs/project-statistics/snapshot.json index 8d85b4df..c613fd9d 100644 --- a/docs/project-statistics/snapshot.json +++ b/docs/project-statistics/snapshot.json @@ -1 +1 @@ -{"schemaVersion":1,"presetVersion":"0.1.0","methodology":"project-transparency/1","configSha256":"35ecec870453206fe9c0c92c2c0a87c4fb9ef6a6457bad4903d7d5b5f2ee1130","rendererSha256":"a40f565e2f7451d5688103b69e40a7a39e226507cf3ee43144a60af386d65d30","generatedSha256":"d4db0cfd68d8a31cdeed2cc4d9e5d64be7cee2b800084c66c56699cbfa2c61dc","measurement":{"sourceRevision":"05eeb6b688dd87e577b565f9555b8f39e05b4d99","asOf":"2026-09-20","timeZone":"UTC","windowStart":"2025-09-28","windowWeeks":52,"inputsSha256":"b1198109a4899bc2b3ec754f67328c639159309300db2c3f588ad0b0df3e2573","totalTextFiles":3487,"totalTextLines":751599,"activeDays":98,"categories":{"Production":{"files":854,"lines":140068},"Tests":{"files":429,"lines":55139},"Documentation":{"files":1600,"lines":384438},"Scripts":{"files":136,"lines":28923},"Configuration":{"files":139,"lines":43165},"DataMedia":{"files":1,"lines":1},"Other":{"files":328,"lines":99865}},"daily":{"2026-02-08":{"added":139076,"removed":29},"2026-03-01":{"added":4960,"removed":39},"2026-03-06":{"added":36824,"removed":149},"2026-03-08":{"added":1616,"removed":1},"2026-03-16":{"added":1345,"removed":356},"2026-03-17":{"added":1150,"removed":86},"2026-03-18":{"added":46,"removed":32},"2026-03-20":{"added":6565,"removed":709},"2026-03-21":{"added":63301,"removed":1705},"2026-03-22":{"added":316337,"removed":4336},"2026-03-23":{"added":8488,"removed":1785},"2026-03-24":{"added":471,"removed":61},"2026-03-25":{"added":1670,"removed":210},"2026-03-27":{"added":31948,"removed":1963},"2026-03-28":{"added":6037,"removed":223},"2026-03-29":{"added":15537,"removed":2397},"2026-03-30":{"added":17062,"removed":4797},"2026-03-31":{"added":277,"removed":0},"2026-04-02":{"added":1902,"removed":2},"2026-04-11":{"added":0,"removed":1651},"2026-04-12":{"added":189,"removed":6},"2026-04-13":{"added":19,"removed":17},"2026-04-17":{"added":84,"removed":14},"2026-04-20":{"added":7912,"removed":309},"2026-04-22":{"added":455,"removed":433},"2026-04-24":{"added":2868,"removed":125},"2026-04-30":{"added":2708,"removed":259},"2026-05-02":{"added":31880,"removed":2176},"2026-05-04":{"added":5558,"removed":2070},"2026-05-05":{"added":648,"removed":22},"2026-05-06":{"added":2374,"removed":184},"2026-05-08":{"added":4835,"removed":204408},"2026-05-09":{"added":2274,"removed":65},"2026-05-10":{"added":3276,"removed":303},"2026-05-12":{"added":2467,"removed":436},"2026-05-13":{"added":1,"removed":1},"2026-05-15":{"added":3,"removed":0},"2026-05-21":{"added":420,"removed":1},"2026-05-22":{"added":2578,"removed":1193},"2026-05-26":{"added":459,"removed":77},"2026-05-28":{"added":952,"removed":10},"2026-05-29":{"added":573,"removed":61},"2026-05-30":{"added":2845,"removed":270},"2026-05-31":{"added":1377,"removed":56},"2026-06-01":{"added":2,"removed":0},"2026-06-02":{"added":96,"removed":47},"2026-06-03":{"added":85,"removed":21},"2026-06-04":{"added":1097,"removed":159},"2026-06-11":{"added":1473,"removed":2171},"2026-06-13":{"added":3620,"removed":308},"2026-06-14":{"added":2109,"removed":130},"2026-06-15":{"added":51,"removed":53},"2026-06-17":{"added":27068,"removed":4},"2026-06-18":{"added":102,"removed":100},"2026-06-19":{"added":1895,"removed":90},"2026-06-20":{"added":420,"removed":5},"2026-06-26":{"added":105,"removed":11},"2026-06-29":{"added":534,"removed":253},"2026-06-30":{"added":79,"removed":88},"2026-07-01":{"added":108,"removed":5},"2026-07-03":{"added":431,"removed":26},"2026-07-04":{"added":1950,"removed":1448},"2026-07-06":{"added":48,"removed":0},"2026-07-10":{"added":6283,"removed":2420},"2026-07-11":{"added":11966,"removed":3631},"2026-07-12":{"added":34047,"removed":945},"2026-07-13":{"added":15096,"removed":498},"2026-07-14":{"added":5748,"removed":204},"2026-07-15":{"added":3837,"removed":427},"2026-07-16":{"added":34780,"removed":851},"2026-07-17":{"added":20769,"removed":1499},"2026-07-18":{"added":45,"removed":45},"2026-07-19":{"added":16222,"removed":3963},"2026-07-21":{"added":5843,"removed":267},"2026-07-22":{"added":93,"removed":5},"2026-07-23":{"added":2140,"removed":186},"2026-07-24":{"added":2606,"removed":297},"2026-07-25":{"added":2627,"removed":212},"2026-07-26":{"added":8851,"removed":1251},"2026-07-28":{"added":3054,"removed":488},"2026-07-29":{"added":10199,"removed":188},"2026-07-31":{"added":11,"removed":5},"2026-08-01":{"added":133,"removed":25},"2026-08-02":{"added":36,"removed":4},"2026-08-08":{"added":4363,"removed":241},"2026-08-09":{"added":11987,"removed":812},"2026-08-13":{"added":4008,"removed":35},"2026-08-15":{"added":1318,"removed":767},"2026-08-17":{"added":76,"removed":23},"2026-08-28":{"added":8319,"removed":317},"2026-08-29":{"added":4628,"removed":290},"2026-08-30":{"added":84289,"removed":465},"2026-09-07":{"added":8253,"removed":44},"2026-09-08":{"added":4141,"removed":2516},"2026-09-12":{"added":8815,"removed":558},"2026-09-13":{"added":18458,"removed":1438},"2026-09-19":{"added":7250,"removed":162},"2026-09-20":{"added":1374,"removed":31}},"omitted":{"binary":68,"symlinks":0,"submodules":0,"excluded":3}}} +{"schemaVersion":1,"presetVersion":"0.1.0","methodology":"project-transparency/1","configSha256":"35ecec870453206fe9c0c92c2c0a87c4fb9ef6a6457bad4903d7d5b5f2ee1130","rendererSha256":"a40f565e2f7451d5688103b69e40a7a39e226507cf3ee43144a60af386d65d30","generatedSha256":"a213ded645ce041e20f37adcbb801b7e790ced594e4c20b1aa2c581d574d6dc2","measurement":{"sourceRevision":"dd8cf3b459e45273ee099b3ec26248c38b8463d3","asOf":"2026-09-26","timeZone":"UTC","windowStart":"2025-09-28","windowWeeks":52,"inputsSha256":"412f6a60e816998d49492dac8b6e07e480b4515f85634fb9903cbd8f6eeeb703","totalTextFiles":3487,"totalTextLines":751686,"activeDays":99,"categories":{"Production":{"files":854,"lines":140068},"Tests":{"files":429,"lines":55187},"Documentation":{"files":1600,"lines":384451},"Scripts":{"files":136,"lines":28949},"Configuration":{"files":139,"lines":43165},"DataMedia":{"files":1,"lines":1},"Other":{"files":328,"lines":99865}},"daily":{"2026-02-08":{"added":139076,"removed":29},"2026-03-01":{"added":4960,"removed":39},"2026-03-06":{"added":36824,"removed":149},"2026-03-08":{"added":1616,"removed":1},"2026-03-16":{"added":1345,"removed":356},"2026-03-17":{"added":1150,"removed":86},"2026-03-18":{"added":46,"removed":32},"2026-03-20":{"added":6565,"removed":709},"2026-03-21":{"added":63301,"removed":1705},"2026-03-22":{"added":316337,"removed":4336},"2026-03-23":{"added":8488,"removed":1785},"2026-03-24":{"added":471,"removed":61},"2026-03-25":{"added":1670,"removed":210},"2026-03-27":{"added":31948,"removed":1963},"2026-03-28":{"added":6037,"removed":223},"2026-03-29":{"added":15537,"removed":2397},"2026-03-30":{"added":17062,"removed":4797},"2026-03-31":{"added":277,"removed":0},"2026-04-02":{"added":1902,"removed":2},"2026-04-11":{"added":0,"removed":1651},"2026-04-12":{"added":189,"removed":6},"2026-04-13":{"added":19,"removed":17},"2026-04-17":{"added":84,"removed":14},"2026-04-20":{"added":7912,"removed":309},"2026-04-22":{"added":455,"removed":433},"2026-04-24":{"added":2868,"removed":125},"2026-04-30":{"added":2708,"removed":259},"2026-05-02":{"added":31880,"removed":2176},"2026-05-04":{"added":5558,"removed":2070},"2026-05-05":{"added":648,"removed":22},"2026-05-06":{"added":2374,"removed":184},"2026-05-08":{"added":4835,"removed":204408},"2026-05-09":{"added":2274,"removed":65},"2026-05-10":{"added":3276,"removed":303},"2026-05-12":{"added":2467,"removed":436},"2026-05-13":{"added":1,"removed":1},"2026-05-15":{"added":3,"removed":0},"2026-05-21":{"added":420,"removed":1},"2026-05-22":{"added":2578,"removed":1193},"2026-05-26":{"added":459,"removed":77},"2026-05-28":{"added":952,"removed":10},"2026-05-29":{"added":573,"removed":61},"2026-05-30":{"added":2845,"removed":270},"2026-05-31":{"added":1377,"removed":56},"2026-06-01":{"added":2,"removed":0},"2026-06-02":{"added":96,"removed":47},"2026-06-03":{"added":85,"removed":21},"2026-06-04":{"added":1097,"removed":159},"2026-06-11":{"added":1473,"removed":2171},"2026-06-13":{"added":3620,"removed":308},"2026-06-14":{"added":2109,"removed":130},"2026-06-15":{"added":51,"removed":53},"2026-06-17":{"added":27068,"removed":4},"2026-06-18":{"added":102,"removed":100},"2026-06-19":{"added":1895,"removed":90},"2026-06-20":{"added":420,"removed":5},"2026-06-26":{"added":105,"removed":11},"2026-06-29":{"added":534,"removed":253},"2026-06-30":{"added":79,"removed":88},"2026-07-01":{"added":108,"removed":5},"2026-07-03":{"added":431,"removed":26},"2026-07-04":{"added":1950,"removed":1448},"2026-07-06":{"added":48,"removed":0},"2026-07-10":{"added":6283,"removed":2420},"2026-07-11":{"added":11966,"removed":3631},"2026-07-12":{"added":34047,"removed":945},"2026-07-13":{"added":15096,"removed":498},"2026-07-14":{"added":5748,"removed":204},"2026-07-15":{"added":3837,"removed":427},"2026-07-16":{"added":34780,"removed":851},"2026-07-17":{"added":20769,"removed":1499},"2026-07-18":{"added":45,"removed":45},"2026-07-19":{"added":16222,"removed":3963},"2026-07-21":{"added":5843,"removed":267},"2026-07-22":{"added":93,"removed":5},"2026-07-23":{"added":2140,"removed":186},"2026-07-24":{"added":2606,"removed":297},"2026-07-25":{"added":2627,"removed":212},"2026-07-26":{"added":8851,"removed":1251},"2026-07-28":{"added":3054,"removed":488},"2026-07-29":{"added":10199,"removed":188},"2026-07-31":{"added":11,"removed":5},"2026-08-01":{"added":133,"removed":25},"2026-08-02":{"added":36,"removed":4},"2026-08-08":{"added":4363,"removed":241},"2026-08-09":{"added":11987,"removed":812},"2026-08-13":{"added":4008,"removed":35},"2026-08-15":{"added":1318,"removed":767},"2026-08-17":{"added":76,"removed":23},"2026-08-28":{"added":8319,"removed":317},"2026-08-29":{"added":4628,"removed":290},"2026-08-30":{"added":84289,"removed":465},"2026-09-07":{"added":8253,"removed":44},"2026-09-08":{"added":4141,"removed":2516},"2026-09-12":{"added":8815,"removed":558},"2026-09-13":{"added":18458,"removed":1438},"2026-09-19":{"added":7250,"removed":162},"2026-09-20":{"added":1374,"removed":31},"2026-09-26":{"added":101,"removed":14}},"omitted":{"binary":68,"symlinks":0,"submodules":0,"excluded":3}}}