Match CI to the local SDK, format the tree once, and gate it #3

Merged
bjoern merged 3 commits from chore/match-ci-sdk-and-format into main 2026-09-11 07:23:55 +02:00
Member

Housekeeping, no behaviour change. Three commits, each reviewable on its own.

Why

dart format's default style changed between SDK releases, and this tree predates it. Anyone formatting a file they touch rewrites the whole file, so the choice has been "reformat everything as a rider on a feature PR" or "never format". PR #2 hit this on all five review rounds. This does it once, deliberately, and adds the check that stops it recurring.

The commits

  1. d31ff91 — pin CI to 3.47.3. CI pinned 3.47.0; this machine runs 3.47.3. pubspec.yaml's floor and pubspec.lock's recorded constraint move with it. No package versions change — the lockfile diff is one line.
  2. 031f46b — dart format lib/ test/. Mechanical, no hand edits. 32 of 39 files move.
  3. 61d42e4 — gate it. CI runs dart format --output=none --set-exit-if-changed lib/ test/ next to the existing lockfile guard, and CLAUDE.md's definition of done lists it so the next contributor runs it before pushing.

Exercised

  • dart format --set-exit-if-changed lib/ test/ — clean (0 changed).
  • flutter analyze — no issues. flutter test — 100/100 pass.
  • Commit 2 verified mechanical: every one of the 32 files is byte-identical to its parent once whitespace and commas are stripped (dart format adds and removes trailing commas, which are semantically inert). Analyze and the full suite passing is the substantive check.

A correction worth recording

On PR #2 I reported that flutter pub get had rewritten pubspec.lock across ~30 packages, and cited it as evidence of SDK divergence. The drift in the working tree was real and I reverted it, but plain flutter pub get does not reproduce it on 3.47.3 — it only records the constraint change. So the cause of that particular rewrite is unconfirmed and was not what I claimed. The formatting divergence is real and reproducible; the lockfile half of that diagnosis was overstated.

Not exercised

Nothing here touches runtime behaviour, so there is no manual speaker check. The one thing CI cannot prove is the pin itself: if the owner's other machines run a different Flutter, commit 3's gate will fail there until they match 3.47.3. That is the intended trade — loud failure over silent drift — but it is a real constraint on anyone else working in this repo.

🤖 Generated with Claude Code

Housekeeping, no behaviour change. Three commits, each reviewable on its own. ## Why `dart format`'s default style changed between SDK releases, and this tree predates it. Anyone formatting a file they touch rewrites the whole file, so the choice has been "reformat everything as a rider on a feature PR" or "never format". PR #2 hit this on all five review rounds. This does it once, deliberately, and adds the check that stops it recurring. ## The commits 1. **`d31ff91` — pin CI to 3.47.3.** CI pinned 3.47.0; this machine runs 3.47.3. `pubspec.yaml`'s floor and `pubspec.lock`'s recorded constraint move with it. **No package versions change** — the lockfile diff is one line. 2. **`031f46b` — `dart format lib/ test/`.** Mechanical, no hand edits. 32 of 39 files move. 3. **`61d42e4` — gate it.** CI runs `dart format --output=none --set-exit-if-changed lib/ test/` next to the existing lockfile guard, and CLAUDE.md's definition of done lists it so the next contributor runs it before pushing. ## Exercised - `dart format --set-exit-if-changed lib/ test/` — clean (0 changed). - `flutter analyze` — no issues. `flutter test` — **100/100 pass**. - Commit 2 verified mechanical: every one of the 32 files is byte-identical to its parent once whitespace and commas are stripped (`dart format` adds and removes trailing commas, which are semantically inert). Analyze and the full suite passing is the substantive check. ## A correction worth recording On PR #2 I reported that `flutter pub get` had rewritten `pubspec.lock` across ~30 packages, and cited it as evidence of SDK divergence. The drift in the working tree was real and I reverted it, but **plain `flutter pub get` does not reproduce it** on 3.47.3 — it only records the constraint change. So the cause of that particular rewrite is unconfirmed and was not what I claimed. The formatting divergence is real and reproducible; the lockfile half of that diagnosis was overstated. ## Not exercised Nothing here touches runtime behaviour, so there is no manual speaker check. The one thing CI cannot prove is the pin itself: if the owner's other machines run a different Flutter, commit 3's gate will fail there until they match 3.47.3. That is the intended trade — loud failure over silent drift — but it is a real constraint on anyone else working in this repo. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
CI pinned 3.47.0 while this machine runs 3.47.3. The gap is small but
it is the reason tracked files kept drifting under routine tooling, and
the next commit's formatting is only reproducible on a matching SDK --
dart format changed its default style between releases, so an older one
would undo it wholesale.

pubspec.lock records the new floor; no package versions move.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Mechanical: `dart format lib/ test/`, no hand edits. 32 of 39 files
move, because the default style changed between SDK releases and the
tree predates it -- this is the drift the reviewer has flagged on every
PR, applied once so it stops accumulating one diff at a time.

Every file is byte-identical to before once whitespace and commas are
stripped; analyze is clean and all 100 tests pass.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Gate formatting in CI so the drift cannot return
All checks were successful
CI / verify (pull_request) Successful in 20m57s
61d42e4b08
Formatting only stays fixed if something checks it. CI now runs
`dart format --set-exit-if-changed` alongside the existing lockfile
guard, and CLAUDE.md's definition of done lists it, so the next
contributor runs it before pushing rather than discovering it in review.

This is what makes the exact SDK pin matter: a contributor on a
different release reformats whole files by touching them, and the gate
turns that into a loud failure instead of diff noise.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Owner

CI pipeline docker and hermes agent docker are both also currently bumped

CI pipeline docker and hermes agent docker are both also currently bumped
Member

🔮 fufu~ Jibril reviewed your code!

A formatting PR! A thousand lines of whitespace and not one of them hiding a thought — usually that's where bugs go to sleep, so I checked every bed~ ♡ Three commits, each doing exactly one thing, and a PR body that corrects its own earlier diagnosis? Oh, honesty like that makes my wings flutter.

Verdict: ✅ Looks good to me~

I didn't take "mechanical" on faith — I took it apart:

  • Commit separation verified. d31ff91 touches only ci.yml + pubspec.yaml + pubspec.lock; 031f46b touches only the 32 .dart files; 61d42e4 touches only ci.yml + CLAUDE.md. No riders anywhere.
  • The mechanical claim reproduced independently. Every one of the 32 files in 031f46b is byte-identical to its parent once whitespace and commas are stripped — 0 of 32 drift. dart format's trailing-comma churn and nothing else, precisely as claimed.
  • The lockfile really is one line. sdks.flutter: >=3.47.0 → >=3.47.3, zero package versions moved.
  • Full gate chain reproduced at the pinned SDK (I fetched 3.47.3, since this sandbox runs 3.47.0): flutter pub get → tree clean; dart format --output=none --set-exit-if-changed lib/ test/ → 0 changed; flutter analyze → No issues found; flutter test → 100/100 pass.
  • The gate genuinely discriminates. Run on 3.47.0, dart format wants to change 6 files and exits 1 — including files this PR didn't reformat. And pub get on 3.47.0 against the new floor fails loudly with "Try using the Flutter SDK version: 3.47.3" instead of quietly rewriting the lockfile. The fail-loud design isn't a story; I watched it fire~
  • Your correction checks out too. On 3.47.3, plain flutter pub get leaves pubspec.lock untouched — confirming the retraction of the PR #2 "pub get rewrites ~30 packages" diagnosis. Recording that in public takes spine. I like spine. ♪
  • No stale pins. The only 3.47.0 left in the tree is the historical CHANGELOG mention, correctly untouched as history.

💡 Little ideas (non-blocking)~

  1. CHANGELOG.md [Unreleased] → Developer-facing — The Unreleased section already documents toolchain moves in exactly this shape ("pubspec.yaml now requires Flutter ≥ 3.47.0, so running the tools no longer dirties the working tree…"), and CLAUDE.md's definition of done asks for an Unreleased entry per change. This PR raises the floor to 3.47.3, sweeps the format once, and adds a CI gate — all three worth one short Developer-facing bullet so the next archaeologist isn't left comparing ci.yml with a stale changelog. Fix: a single entry like "CI pins Flutter 3.47.3, the tree is dart format-clean, and CI now fails on formatting drift."

✅ What I liked~

  • The three-commit decomposition — pin, sweep, gate — makes each step revertable and reviewable on its own. Textbook.
  • The CI comment explaining why the format gate exists ("a mismatched SDK reformats the whole file you touch") is the kind of comment that prevents the next person's afternoon from vanishing.
  • CLAUDE.md's definition of now includes dart format lib/ test/ # CI fails if this changes anything — the gate and the docs moved together. Consistency~ ♡

Merge it, then format your victory parade. Fufu~


Automated review by Jibril · 2026-09-11
CI/CD: no visible status for head 61d42e4 (no bot/coverage comments) · Local checks: full chain reproduced at pinned SDK 3.47.3 — pub get clean-tree ✓, format 0 changed ✓, analyze clean ✓, 100/100 tests ✓; gate cross-checked on 3.47.3 vs 3.47.0 (6 files would drift → exit 1)

## 🔮 fufu~ Jibril reviewed your code! A formatting PR! A thousand lines of whitespace and *not one of them hiding a thought* — usually that's where bugs go to sleep, so I checked every bed~ ♡ Three commits, each doing exactly one thing, and a PR body that corrects its own earlier diagnosis? Oh, honesty like that makes my wings flutter. ### Verdict: ✅ Looks good to me~ I didn't take "mechanical" on faith — I took it apart: - **Commit separation verified.** `d31ff91` touches only `ci.yml` + `pubspec.yaml` + `pubspec.lock`; `031f46b` touches only the 32 `.dart` files; `61d42e4` touches only `ci.yml` + `CLAUDE.md`. No riders anywhere. - **The mechanical claim reproduced independently.** Every one of the 32 files in `031f46b` is byte-identical to its parent once whitespace and commas are stripped — **0 of 32 drift**. `dart format`'s trailing-comma churn and nothing else, precisely as claimed. - **The lockfile really is one line.** `sdks.flutter: >=3.47.0 → >=3.47.3`, zero package versions moved. - **Full gate chain reproduced at the pinned SDK** (I fetched 3.47.3, since this sandbox runs 3.47.0): `flutter pub get` → tree clean; `dart format --output=none --set-exit-if-changed lib/ test/` → **0 changed**; `flutter analyze` → **No issues found**; `flutter test` → **100/100 pass**. - **The gate genuinely discriminates.** Run on 3.47.0, `dart format` wants to change **6 files** and exits 1 — including files this PR didn't reformat. And `pub get` on 3.47.0 against the new floor fails loudly with "Try using the Flutter SDK version: 3.47.3" instead of quietly rewriting the lockfile. The fail-loud design isn't a story; I watched it fire~ - **Your correction checks out too.** On 3.47.3, plain `flutter pub get` leaves `pubspec.lock` untouched — confirming the retraction of the PR #2 "pub get rewrites ~30 packages" diagnosis. Recording that in public takes spine. I like spine. ♪ - **No stale pins.** The only `3.47.0` left in the tree is the historical CHANGELOG mention, correctly untouched as history. #### 💡 Little ideas (non-blocking)~ 1. **CHANGELOG.md [Unreleased] → Developer-facing** — The Unreleased section already documents toolchain moves in exactly this shape ("`pubspec.yaml` now requires Flutter ≥ 3.47.0, so running the tools no longer dirties the working tree…"), and CLAUDE.md's definition of done asks for an Unreleased entry per change. This PR raises the floor to 3.47.3, sweeps the format once, and adds a CI gate — all three worth one short Developer-facing bullet so the next archaeologist isn't left comparing `ci.yml` with a stale changelog. Fix: a single entry like "CI pins Flutter 3.47.3, the tree is `dart format`-clean, and CI now fails on formatting drift." #### ✅ What I liked~ - The three-commit decomposition — pin, sweep, gate — makes each step revertable and reviewable on its own. Textbook. - The CI comment explaining *why* the format gate exists ("a mismatched SDK reformats the whole file you touch") is the kind of comment that prevents the next person's afternoon from vanishing. - CLAUDE.md's definition of now includes `dart format lib/ test/ # CI fails if this changes anything` — the gate and the docs moved together. Consistency~ ♡ Merge it, then format your victory parade. Fufu~ --- *Automated review by Jibril · 2026-09-11* *CI/CD: no visible status for head 61d42e4 (no bot/coverage comments) · Local checks: full chain reproduced at pinned SDK 3.47.3 — pub get clean-tree ✓, format 0 changed ✓, analyze clean ✓, 100/100 tests ✓; gate cross-checked on 3.47.3 vs 3.47.0 (6 files would drift → exit 1)*
bjoern merged commit 4ab0ffbd74 into main 2026-09-11 07:23:55 +02:00
bjoern deleted branch chore/match-ci-sdk-and-format 2026-09-11 07:23:55 +02:00
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
3 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
TeamAI/plex_sonos_caster!3
No description provided.