From 66a51fd99aa8e6186162104de048b608b14387cd Mon Sep 17 00:00:00 2001 From: Andi Wieser Date: Thu, 10 Sep 2026 01:33:17 +0200 Subject: [PATCH] ci: a style lint was the precondition for the only job that proves anything `build-test` carried `needs: [lint]`. When SwiftLint went red on 2026-08-31 that job did not fail - it was SKIPPED, and a skipped job reads exactly like a passing one from the run list. Measured on run 34034521667: SwiftLint failure, swift-format failure, Build and Test skipped. Nothing has compiled or been tested in CI here since. Blank lines cannot break a build, so the three jobs now run independently and each reports its own verdict. SwiftLint becomes advisory, for the same reason swift-format already is. The rules are ours - .swiftlint.yml came from upstream and was tightened here on 2026-04-05 - and they were green in April. What moved is the TOOL: the step installs whatever brew has, and 0.65.1 reports 26 violations across 21 files, which is every Swift file in the repository. Nine of the first ten are vertical whitespace rules on code inherited from Jaysce/Spaceman that these rules were never calibrated against. That calibration is real work and it is not this change. What this change refuses is letting it hold the build. The version is printed now. brew install is unpinned, so the tool that judges this tree changes without anybody changing the tree - which is how a green April became a red August with no commit in between. A version in the log is what lets the next reader tell "the code got worse" from "the ruler moved". Neither branch is protected, so renaming the job breaks no required check. A .gitattributes lands with it because the export guard refused the commit without one: CLAUDE.md is process-only and would have shipped in any archive of this tree. --- .gitattributes | 6 ++++++ .github/workflows/ci.yml | 32 ++++++++++++++++++++++++++++++-- 2 files changed, 36 insertions(+), 2 deletions(-) create mode 100644 .gitattributes diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 00000000..f14b44c2 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,6 @@ +# Process-only paths never reach a published archive. This repository does not publish +# one today - it is a macOS app, not a package - but `git archive` is one command away +# and the agent working directory has no business in a tarball somebody downloads. +internal/ export-ignore +.claude/ export-ignore +/CLAUDE.md export-ignore diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 491d7d55..4f32a6d9 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -17,8 +17,22 @@ concurrency: jobs: lint: - name: SwiftLint + # ⚠️ ADVISORY, FOR THE SAME REASON `format` BELOW IS — and it was not, which cost every + # build and every test in this repository since 2026-08-31. + # + # The rules are ours: `.swiftlint.yml` came from upstream and was tightened here on + # 2026-04-05 ("Tighten linting and expand CI"). They were green then. What moved is the + # TOOL, not the tree: this step installs whatever `brew` has, and 0.65.1 reports 26 + # violations across 21 files — which is EVERY Swift file in the repository. Nine of the + # first ten are `vertical_whitespace_opening_braces` / `..._closing_braces`, i.e. blank + # lines, on code inherited from Jaysce/Spaceman and never calibrated against these rules. + # + # So it stays visible and stops being a gate until somebody calibrates it. That is the + # same sentence `format` already carries; the only thing new here is that it now also + # applies to the job that was holding the build hostage. + name: SwiftLint (advisory) runs-on: macos-15 + continue-on-error: true steps: - name: Checkout @@ -30,6 +44,13 @@ jobs: brew install swiftlint fi + # ⚠️ PRINT THE VERSION. `brew install` is unpinned, so the tool that judges this tree + # changes without anybody changing the tree — which is exactly how a green April + # became a red August with no commit in between. A version in the log is what lets the + # next reader tell "the code got worse" from "the ruler moved". + - name: Show SwiftLint version + run: swiftlint version + - name: Run SwiftLint run: swiftlint lint --config .swiftlint.yml --reporter github-actions-logging --strict --no-cache @@ -56,7 +77,14 @@ jobs: build-test: name: Build and Test runs-on: macos-15 - needs: [lint] + # ⚠️ `needs: [lint]` STOOD HERE, AND IT MADE A STYLE CHECK THE PRECONDITION FOR THE ONLY + # JOB THAT PROVES ANYTHING. When SwiftLint went red on 2026-08-31 this job did not fail + # — it was SKIPPED, and a skipped job reads exactly like a passing one from the run list. + # Measured on run 34034521667: SwiftLint failure, swift-format failure, Build and Test + # skipped. Nothing has compiled or been tested in CI here since. + # + # Blank lines cannot break a build, so nothing is lost by running both at once and letting + # each report its own verdict. steps: - name: Checkout