From e0f5c3251babe90f6f87272d5b53de80fe3a3b5e Mon Sep 17 00:00:00 2001 From: Mickael Farina Date: Fri, 24 Jul 2026 17:09:09 +0200 Subject: [PATCH 1/2] build(ci): pin ruff <0.16 and make shebanged entry points executable MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit CI went red on every PR with no code change. ruff 0.16.0 released, and requirements-dev pinned only `ruff>=0.15.22`, so CI drifted onto a breaking major: `ruff check .` went from clean to 3117 errors. Two distinct regressions in 0.16: * default rule selection widened enormously (BLE001 x1028, I001 x402, UP006 x308, S110, DTZ005 … none of which this repo ever selected) * our ruff.toml stopped being honoured in CI — E402 fired 535 times despite sitting in the ignore list Pinned <0.16. Adopting 0.16 is a real migration and deserves its own PR, not a silent dependency drift on a Friday. Also fixed the one genuine finding 0.16 surfaced: 16 entry-point scripts carry `#!/usr/bin/env python3` but were committed 100644, so the shebang was decorative (EXE001). These are actually executed — PM2 runs codec.py and codec_watchdog.py, and the tools/ + scripts/ ones are invoked directly — so the correct fix is the exec bit, not removing the shebang. Verified: ruff 0.15.22 → "All checks passed"; 0.16.0 → 3117 errors, unchanged tree either way. Co-Authored-By: Claude Opus 4.8 --- codec.py | 0 codec_dictate.py | 0 codec_marketplace.py | 0 codec_watchdog.py | 0 codec_watcher.py | 0 request_mic.py | 0 requirements-dev.txt | 6 +++++- scripts/feature_audit.py | 0 scripts/smoke.py | 0 scripts/stress_test_skills.py | 0 scripts/tag_releases.py | 0 setup_codec.py | 0 setup_hue.py | 0 tests/smoke_test.py | 0 tools/generate_skill_manifest.py | 0 tools/overlay_preview.py | 0 whisper_server.py | 0 17 files changed, 5 insertions(+), 1 deletion(-) mode change 100644 => 100755 codec.py mode change 100644 => 100755 codec_dictate.py mode change 100644 => 100755 codec_marketplace.py mode change 100644 => 100755 codec_watchdog.py mode change 100644 => 100755 codec_watcher.py mode change 100644 => 100755 request_mic.py mode change 100644 => 100755 scripts/feature_audit.py mode change 100644 => 100755 scripts/smoke.py mode change 100644 => 100755 scripts/stress_test_skills.py mode change 100644 => 100755 scripts/tag_releases.py mode change 100644 => 100755 setup_codec.py mode change 100644 => 100755 setup_hue.py mode change 100644 => 100755 tests/smoke_test.py mode change 100644 => 100755 tools/generate_skill_manifest.py mode change 100644 => 100755 tools/overlay_preview.py mode change 100644 => 100755 whisper_server.py diff --git a/codec.py b/codec.py old mode 100644 new mode 100755 diff --git a/codec_dictate.py b/codec_dictate.py old mode 100644 new mode 100755 diff --git a/codec_marketplace.py b/codec_marketplace.py old mode 100644 new mode 100755 diff --git a/codec_watchdog.py b/codec_watchdog.py old mode 100644 new mode 100755 diff --git a/codec_watcher.py b/codec_watcher.py old mode 100644 new mode 100755 diff --git a/request_mic.py b/request_mic.py old mode 100644 new mode 100755 diff --git a/requirements-dev.txt b/requirements-dev.txt index f0f6c9f..b8385ec 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -12,4 +12,8 @@ # Test + lint toolchain (matches CI) pytest>=9.1.1 -ruff>=0.15.22 +# Upper bound is deliberate: ruff 0.16 changed the default rule selection AND +# stopped honouring this repo's ruff.toml in CI — `ruff check .` went from clean +# to 3117 errors (E402 fired 535 times despite being in our ignore list), with +# no code change. Unpinning again needs a real 0.16 migration, not a drift. +ruff>=0.15.22,<0.16 diff --git a/scripts/feature_audit.py b/scripts/feature_audit.py old mode 100644 new mode 100755 diff --git a/scripts/smoke.py b/scripts/smoke.py old mode 100644 new mode 100755 diff --git a/scripts/stress_test_skills.py b/scripts/stress_test_skills.py old mode 100644 new mode 100755 diff --git a/scripts/tag_releases.py b/scripts/tag_releases.py old mode 100644 new mode 100755 diff --git a/setup_codec.py b/setup_codec.py old mode 100644 new mode 100755 diff --git a/setup_hue.py b/setup_hue.py old mode 100644 new mode 100755 diff --git a/tests/smoke_test.py b/tests/smoke_test.py old mode 100644 new mode 100755 diff --git a/tools/generate_skill_manifest.py b/tools/generate_skill_manifest.py old mode 100644 new mode 100755 diff --git a/tools/overlay_preview.py b/tools/overlay_preview.py old mode 100644 new mode 100755 diff --git a/whisper_server.py b/whisper_server.py old mode 100644 new mode 100755 From 856d923a5c9704d1f9b01e0a063daec1ec04b2a1 Mon Sep 17 00:00:00 2001 From: Mickael Farina Date: Fri, 24 Jul 2026 17:11:09 +0200 Subject: [PATCH 2/2] build(ci): pin ruff in the workflow, not just requirements-dev MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The workflow installs its own dependency set with a bare `ruff`, ignoring requirements-dev.txt entirely — so the earlier pin there had no effect and CI stayed on 0.16. Pinned at the actual install site. The comment directly above that line already warns that CI must not drift from what production runs; this is that same lesson, one dependency over. Co-Authored-By: Claude Opus 4.8 --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 81dd58c..2267ed1 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -26,7 +26,7 @@ jobs: # tests on main-as-is (verified via a no-op canary PR) — CI was # testing a dependency set production never runs. Bump these pins # together with a production upgrade, not before. - pip install pytest fastmcp httpx requests pynput 'pydantic==2.11.10' ruff \ + pip install pytest fastmcp httpx requests pynput 'pydantic==2.11.10' 'ruff>=0.15.22,<0.16' \ 'fastapi==0.129.0' 'starlette==0.52.1' numpy pyotp 'qrcode[pil]' - name: Lint (ruff) — F-4 gate, config in ruff.toml run: ruff check .