diff --git a/docs/ci-cd.md b/docs/ci-cd.md index 85cf039b5..6064e9af5 100644 --- a/docs/ci-cd.md +++ b/docs/ci-cd.md @@ -103,7 +103,7 @@ saturated and the `small` lane idle — **queue wait exceeded every job's runtim | `migrations` | 639s | 1428s | ubuntu-latest | | `functional-e2e` | 520s | 1447s | ubuntu-latest | | `api-docs` | 5s | **1722s** | ubuntu-latest → `small` → **reverted to ubuntu-latest** (#406) | -| `format` | 37s | **1731s** | ubuntu-latest → `small` → **reverted to ubuntu-latest** (#406) | +| `format` | 37s → **~0.5s** (#469) | **1731s** | ubuntu-latest → `small` → **reverted to ubuntu-latest** (#406) | | `docs-reminder` / `decisions-guard` | 10s | **5s** | small | `api-docs` and `format` moved to `small` because the queue wait dwarfed their runtime. Both lanes @@ -116,10 +116,13 @@ API-touching PR `api-docs` does a full `dotnet build`, so it is not always small be the deciding factor, and "capacity 4 absorbs that" held only because **nothing enforces the sum** of the lanes' per-job caps. Each job container is correctly capped (`--memory=10g`), but 6 slots × 10 GiB = **60 GiB on a 25 GiB host** that also runs prod media; on 2026-07-17 bumblebee hit load -340 with 21 GiB swapped. These are not small jobs — a live `docker stats` caught the `format` job +340 with 21 GiB swapped. These were not small jobs — a live `docker stats` caught the `format` job container at **3.95 GiB**, which the re-sized 2 GiB `small` lane would OOM-kill outright. #604 fixes the queue at the source instead (`ubuntu-latest` grown to 5 slots: a 48 GiB ci-runner at capacity 4 plus a bumblebee overflow slot), so the `small` lane can be reserved for genuinely-tiny shell jobs. +(The `format` half of this is now **moot**: **ersatztv#469** moved it to `dotnet format whitespace . +--folder`, which loads no Roslyn workspace — the job's 3.95 GiB heap and multi-minute runtime are +gone, so it is no longer a reason to keep the lane large. `api-docs` on an API-touching PR still is.) Queue wait is still a dominant cost and capacity is server-management's boundary — tracked in **server-management#604**. The redundant triple-build behind those runtimes is **ersatztv#398**. @@ -695,9 +698,10 @@ reads `.editorconfig`. Verified **non-vacuous**: it exits non-zero on an injecte line (`error WHITESPACE`) and on a prepended UTF-8 BOM (`error CHARSET`), and exits 0 on a clean file. **No coverage was lost**: the full `dotnet format` gate did **not** enforce the style/analyzer pass either — a probe injecting a `warning`-severity naming violation (`local_constants` not `ALL_UPPER`) -passed the *full* solution format (exit 0), because the only `.editorconfig` rule above -`:suggestion`/`:none` severity is that one naming rule and `dotnet format`'s default severity ignores -it. The analyzers that **must** block (`NU1904`, `S3981`) are enforced at *compile time* via +passed the *full* solution format (exit 0): the only `.editorconfig` rule above `:suggestion`/`:none` +severity is that one naming rule, and naming violations have no `dotnet format` batch code-fixer, so +`--verify-no-changes` reports no change regardless of severity. The analyzers that **must** block +(`NU1904`, `S3981`) are enforced at *compile time* via `WarningsAsErrors` in `Directory.Build.props`, not by this job. Devs fix a violation with `dotnet format whitespace . --folder --include ` (the full `dotnet format ErsatzTV.sln --include ` is a superset and also works). diff --git a/docs/decisions.md b/docs/decisions.md index 46cfb9089..0347c8a40 100644 --- a/docs/decisions.md +++ b/docs/decisions.md @@ -2034,8 +2034,9 @@ The blocking `format` CI job (and the matching Husky pre-commit hook) verify cha trailing-whitespace line and `error CHARSET` on a prepended BOM; exits 0 on a clean file. What it drops is the style/analyzer pass — but the *full* gate never enforced that either: a probe injecting a `warning`-severity naming violation (`local_constants` not `ALL_UPPER`) **passed** the full solution - format (exit 0), because the only `.editorconfig` rule above `:suggestion`/`:none` severity is that one - naming rule and `dotnet format`'s default severity ignores it. The analyzers that must block (`NU1904`, + format (exit 0): the only `.editorconfig` rule above `:suggestion`/`:none` severity is that one naming + rule, and naming violations have no `dotnet format` batch code-fixer, so `--verify-no-changes` reports + no change regardless of severity. The analyzers that must block (`NU1904`, `S3981`) are enforced at compile time via `WarningsAsErrors` in `Directory.Build.props`, never by this job. - **Fix command for a violation:** `dotnet format whitespace . --folder --include `. The full